在我使用的 VBS 中,我与 SecureCRT 一起使用以自动化 Cisco 设备上的某些流程,我有(非常精简)以下代码:
Sub prConnectToHost(strConnectHost)
'If no host is passed into subroutine then we need to prompt for one.
If strConnectHost = "" Then strConnectHost = LCase(crt.Dialog.Prompt("Enter hostname or IP address:", "Connect to a host", strHost, False))
strHost = strConnectHost
'If user hits Cancel or hits Ok with no hostname entered then exit.
If strHost = "" Then
booReconnect = False
Exit Sub
End If
'Write to connection log
Call prWriteToConnectionLog
'Run command capture subroutine.
Call prCommandLoop
Set intWaitString = Nothing: Set strScreenGet = Nothing
Set strLatestScriptVersion = Nothing: Set strConnectHost = Nothing
End Sub
Sub Main 有这样的部分:
Do While booReconnect = True
Call prConnectToHost("")
Loop
crt.Dialog.Prompt
和 一样MsgBox
,只是它以窗口为中心,而不是屏幕,所以它更整洁一些。该变量strHost
是实际的主机名字符串,它在脚本中是全局的,包含我们要连接的主机名。它在该Prompt
行中用作默认文本,其想法是,如果您断开连接并booReconnect
设置了标志,Sub
则会再次调用它,并且下次提示您输入主机名时,旧的就在那里 - 如果您拼写它很有用第一次出错,或者您连接到一堆具有相似名称的设备。
prCommandLoop
你可以在 this 的末尾看到我们调用的位置Sub
,这是一个循环,它使用crt Function
调用WaitForStrings
的方法将脚本置于暂停状态,直到找到特定的字符串序列。当它发生时,它会触发一些东西,然后循环回来,直到它再次等待。
其中一个自动化命令检测连接菜单的存在(因此我们退出了路由器会话)并提示用户输入另一个主机名来连接。
重要的一点是在最后的变量 clearup - Set strConnectHost = Nothing
。如果我把它留在里面并立即退出set prCommandLoop
,booReconnect
一旦Set strConnectHost = Nothing
应用,strHost
就会死掉 - 如果我尝试引用它,我会得到一个错误Object Variable not set
。我尝试在 结尾处放一条MsgBox strHost
线Sub
,这证明了这一点。
奇怪的是,如果我prCommandLoop
先选择不同的自动化命令然后退出会话,这Set strConnectHost = Nothing
似乎不会打扰任何人。
谁能帮我解释为什么这是一个问题,因为它让我感到困惑。我可以轻松地解决它(通过不在SubSet strConnectHost = Nothing
末尾发布prConnectToHost
),但我只想了解问题所在。