Vbscript 使用循环变量分配项目ID
我正在尝试使用一些.vbs脚本来减轻我的SAP工作负载。 我开始很简单,所以首先我想看看在一个特定连接上打开了多少个会话 这是我的代码: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
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,抱歉。我马上就添加它。抱歉