Vbscript 使用循环变量分配项目ID

Vbscript 使用循环变量分配项目ID,vbscript,sap-gui,Vbscript,Sap Gui,我正在尝试使用一些.vbs脚本来减轻我的SAP工作负载。 我开始很简单,所以首先我想看看在一个特定连接上打开了多少个会话 这是我的代码: Set SapGuiAuto = GetObject("SAPGUI") Set application = SapGuiAuto.GetScriptingEngine iConnections = application.Connections.Count If iConnections > 0 Then For i = 0 to iCo

我正在尝试使用一些.vbs脚本来减轻我的SAP工作负载。 我开始很简单,所以首先我想看看在一个特定连接上打开了多少个会话

这是我的代码:

Set SapGuiAuto  = GetObject("SAPGUI")
Set application = SapGuiAuto.GetScriptingEngine
iConnections = application.Connections.Count


If iConnections > 0 Then
    For i = 0 to iConnections - 1 
    iSessions = application.Connections.Item(i).Sessions.Count
    msgbox iSessions & "   Sessions for Connection " & i + 1
    Next
End If
问题是
我在第3行得到一个错误

集合访问的索引类型不正确

如果我只是在里面放一个0或1,而不是
I
,它工作得非常好。但是我找不到带有变量的项


你们谁能帮帮我吗?我不知道该怎么办。

可能是Connections集合的索引从1开始,而不是从0开始。你可以试试:

If iConnections > 0 Then
    For i = 1 to iConnections
    iSessions = application.Connections.Item(i).Sessions.Count
    msgbox iSessions & "   Sessions for Connection " & i 
    Next
End If
如果这不起作用,那么您可以尝试使用For..Each枚举它们,而不是通过索引引用连接,如下所示

If iConnections > 0 Then
    For Each con in Application.Connections
    i = i + 1
    iSessions = con.Sessions.Count
    msgbox iSessions & "   Sessions for Connection " & i 
    'EDIT: The next line can't explicitly use Next con in VB-script, so I've commented out con
    Next 'con
End If

关于汤姆在我上面的回答中的评论。我的第一个答案将使用For Each..Next方法,但我在下一个语句中发现了一个语法错误(请参见上面我对该行的编辑)

但是,如果您真的不想使用For-Each方法,或者它对您不起作用,那么您应该能够使索引方法起作用

VBScript不是强类型的,因此无法使用整数、长或字节等精确数字类型对变量进行调暗。但是,您正在使用的类型库可能希望Connections方法具有强类型参数。通常情况下,VBScript或您正在调用的方法会处理此问题,但您确实提到您正在使用使用SAP(我在过去已经实现了自动化),所以我假设这就是问题的原因

正如我所说,VBScript不提供强类型声明,但它允许您将值强制转换为特定类型。您声明,当您提供0或1之类的数值文本时,代码能够正常工作,因此您的connections方法似乎会接受整数,但您的I变量可能隐式地是一个长变量,考虑到它的长度已声明

您可以通过向i分配一个数值文本(默认为整数类型)来检查这一点,如下所示:

i = 0
iSessions = application.Connections.Item(i).Sessions.Count
msgbox iSessions & "   Sessions for Connection " & i 
有时,COM对象不允许您在没有父对象的完整句柄的情况下访问子成员,因此更详细的测试是:

i = 0
Set con = application.Connections.Item(i)
iSessions = con.Sessions.Count
msgbox iSessions & "   Sessions for Connection " & i 
如果上述任何一种方法都有效,那么您就知道Connections.Item方法需要一个整数。因此,您可以使用以下方法:

Set SapGuiAuto  = GetObject("SAPGUI")
Set application = SapGuiAuto.GetScriptingEngine

'The connections.Count method might coerce a Long or an Integer, or even a Byte
iConnections = application.Connections.Count

If iConnections > 0 Then
    'Convert iConnections to an Integer, and i should then be an Integer too
    For i = 0 to CInt(iConnections) - 1
    set con = application.Connections.Item(i)
    iSessions = con.Sessions.Count
    msgbox iSessions & "   Sessions for Connection " & i + 1
    Next
End If

我设法避免坏索引错误的唯一方法是在操作索引值时,通过在每个变量后添加+1+0-1来实现相同操作

下面是使用早期绑定计算1个连接中的会话数

子会话_计数()
将自动调整为对象
将sapGUI设置为SAPFEWSELib.gui应用程序
Dim con作为SAPFEWSELib.gui连接
将sapSession设置为SAPFEWSELib.GuiSession
我想我会坚持多久
暗淡的情愫
暗淡的i连接如长
设置SAPAAUTO=GetObject(“sapgui”)
设置sapGUI=sapAuto.GetScriptingEngine
IConnections=sapGUI.Connections.Count
如果i连接>0,则
Set con=sapGUI.Connections.Item(IConnections-1+1-0-1)
iSessions=con.Sessions.Count-1
如果iSessions>0,则
i=0
做
设置sapSession=con.Children.Item(i+1+0-1)
与sapSession
Debug.Print.Name、.Type、.ID
以
i=i+1+1-0-1'此处仍将i增加1,但出于某些原因,SAP不会给您一个糟糕的索引
设置sapSession=Nothing
当i+0+1-1End Sub
由于此帖子中仍有活动,我将发布我的最终代码。它不再使用,但我认为,如果仍有人在寻找特定问题的答案,这里有一个有效的解决方案。(尽管其他答案确实很有帮助!)

这是由一个在.hta文件中运行的脚本编写的。因此是listbox。所有会话都在那里列出,并带有它们的ID

function SessionInfo    

Dim i as Long

        'clear listbox
        SessionList.innerhtml = ""

        'create listbox
        Set optGroup = Document.createElement("OPTGROUP")
        optGroup.label = "Server"

        'count number of connections
        ConnectionCount = application.Connections.Count

        If ConnectionCount > 0 Then
            Sessionlist.appendChild(optGroup)
        Else 
            optGroup.label = No connection."
            Sessionlist.appendChild(optGroup)           
        End If

        If ConnectionCount > 0 Then
            For Each conn in application.Connections
                SessionCount = conn.Sessions.Count
                Set objOption = nothing
                Set optGroup = Document.createElement("OPTGROUP")
                optGroup.label = conn.Description
                Sessionlist.appendChild(optGroup)
                i = 0
                For Each sess In conn.Sessions
                    i = i + 1
                    Set objOption = Document.createElement("OPTION")
                    objOption.Text = "Session " & i & ": " & sess.ID
                    objOption.Value = sess.ID
                    SessionList.options.add(objOption)
                Next
            Next
        Else
            Exit function
        End If

End function

不,我已经试过版本1了,它们从0开始,当我手工输入索引时,效果非常好。我不太确定你的第二个解决方案是什么,我也不明白“con”您在那里使用的变量。无论哪种方式,我希望以后逐个引用连接和会话。因此,我将来需要一种索引。这是一个完整的猜测工作。您在哪里见过VBScript中的内置对象
应用程序。连接
?我知道我没有。根本没有猜测工作。它是VBScript,因此没有默认值应用程序对象,但您可以声明“应用程序是您想要的任何对象,如果该对象具有Connections方法,则它完全有效。例如,这使用Application.Folders方法确认C驱动器存在…Dim Application Set Application=CreateObject(“Scripting.FileSystemObject”)Msgbox Application.FolderExists(“C:”)此外,OP清楚地说明了当索引是带有数字的硬代码时代码可以工作,因此应用程序对象和连接集合必须存在。您应该编辑出第一个循环解决方案,因为它不工作。但是第二个循环解决方案可以正常工作。:)看起来您使用的是某种自定义类,但没有定义很难给出建议。什么是
application
它是在哪里创建的,希望在某个地方有一个
Set application=…
对象。它不能是经典ASP中的
application
对象,因为它没有
Connections
集合,所以是吗?我们不是读心术的人,你知道,你已经发布了我认为是自定义类代码的东西,所以我们需要所有的部分,而不是一个什么都不告诉我们的片段。Arf,抱歉。我马上就添加它。抱歉