我在用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沒有選擇變量類型的方法,所有變量都是變體。考慮到這一點,我已經使用前綴來區分我在功能上使用變量。我很困惑這有什麼潛在的問題。 –