我在用SecureCRT结合使用对Cisco设备某些流程的自动化,我(非常大的相比下来)以下代码:问题与在VBS我有变量设置为变量在VBS
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
分主要有这样一段:
Do While booReconnect = True
Call prConnectToHost("")
Loop
crt.Dialog.Prompt
相同MsgBox
,只有它的窗口,而不是在屏幕上居中,所以这是一个有点整洁。变量strHost
是脚本中全局的实际主机名字符串,它包含我们想要连接的主机名。它在Prompt
行中用作默认文本,其想法是,如果断开连接并设置了booReconnect
标志,则会再次调用Sub
,并且在下次系统提示您输入主机名时,会显示旧主机名 - 有用的你第一次拼写错误,或者你连接到一堆具有相似名称的设备。
你可以看到,我们在这个Sub
,这是它采用了crt Function
称为WaitForStrings
这使脚本暂停,直到它找到一个特定的字符串顺序循环的末尾调用prCommandLoop
。当它发生时,它会熄灭一些东西,然后绕回去,直到它再次等待。
其中一个自动化命令检测是否存在连接菜单(因此我们已经退出了路由器会话)并提示用户输入其他主机名。
重要的是在最后的变量清除 - Set strConnectHost = Nothing
。如果我将其保留并立即退出prCommandLoop
并设置为booReconnect
,则应尽快应用Set strConnectHost = Nothing
,strHost
会死亡 - 如果我尝试引用它,则会收到错误Object Variable not set
。我尝试在Sub
的末尾放置一个MsgBox strHost
行,这证明了这一点。
奇怪的是,如果我先在prCommandLoop
中选择不同的自动化命令,然后退出会话,似乎并不打扰任何人。
任何人都可以帮助我解释为什么这是一个问题,因为它令我困惑。我可以很容易解决它(通过在prConnectToHost
子的末尾没有发出Set strConnectHost = Nothing
),但我只是想了解问题所在。
我不知道我是否忽略了这一点,但直到下一次调用例程时才使变量变为好,正是我想要的 - 我试图进行内存管理,或者这是错误的方式来做到这一点。 真正的问题是...为什么变量(strHost)从其他变量(strConnect)获取其值时变得无用,当它从(strConnect)获取其值的变量设置为无效时?这似乎没有道理。 strHost没有被清除,所以它为什么会受到影响? –
你能解释一下你的意思吗?“类型前缀欺诈?” VBS没有选择变量类型的方法,所有变量都是变体。考虑到这一点,我已经使用前缀来区分我在功能上使用变量。我很困惑这有什么潜在的问题。 –