2011-08-23 60 views
0

我在用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 = NothingstrHost會死亡 - 如果我嘗試引用它,則會收到錯誤Object Variable not set。我嘗試在Sub的末尾放置一個MsgBox strHost行,這證明了這一點。

奇怪的是,如果我先在prCommandLoop中選擇不同的自動化命令,然後退出會話,似乎並不打擾任何人。

任何人都可以幫助我解釋爲什麼這是一個問題,因爲它令我困惑。我可以很容易解決它(通過在prConnectToHost子的末尾沒有發出Set strConnectHost = Nothing),但我只是想了解問題所在。

回答

0

設置用於將對象分配給變量。認爲沒有什麼是一個非常特殊的對象

>> WScript.Echo IsObject(Nothing) 
>> 
-1 

它只是用來指示變量的空白。您的

Set strConnectHost = Nothing 

將此Nothing指定給strConnectHost。在那之後,這個變量毫無用處 - 它保存着無法打印或用於計算或被要求執行方法的空對象。

類型前綴欺詐(* str * ConnectHost)應該提醒您這是可疑的。你使用字符串(和數字?);到清除/復位他們使用與空(簡單)分配:

>> strConnectHost = Empty 
>> 
>> WScript.Echo IsEmpty(strConnection) 
>> 
-1 

或用合適的值:

intWaitString = -1 ' or 0 ... 

(假設intWaitString不是另一種類型的前綴欺詐)。

第二次嘗試:

我假設你打電話給你的分是這樣的:

strHost = "SomeHost" 
prConnectToHost strHost 

你子的相關摘要是:

Sub prConnectToHost([ByRef] strConnectHost) 
    ... 
    Set strConnectHost = Nothing 
End Sub 

由於VBScript使用通過引用傳遞的參數作爲默認設置,您的修改 將更改調用者變量strHost。這發生在非對象變量太多:

Dim sVar : sVar = "String 0" 
    WScript.Echo 0, sVar 
    changeString sVar 
    WScript.Echo 1, sVar 

    Sub changeString(sByRefVar) 
    sByRefVar = "String 1: changed by changeString(ByRef sByRefVar)" 
    End Sub 

輸出:

0 String 0 
1 String 1: changed by changeString(ByRef sVar) 

在你的情況下,修改分配沒有到被稱爲 strConnectHost在Sub和strHost呼叫者水平的變量。正如我之前所說, ,使變量無用(除了測試是沒有)。

我希望解釋strHost的破壞。

WRT'內存管理':除了非常特殊的情況,你不需要在VBScript中清除/重置/ SetToNothing變量 。在您的 子/函數中使用局部變量是所有必需的。如果您決定使用全局變量 並自行管理它們的狀態,則必須注意變量類型: 將對象的類型更改爲對象(包括無)< =>非對象並且說謊 關於通過誤導類型前綴的類型是危險的/一個可靠的方式來desaster。 如果您認爲您必須清除strHost,請將空或分配給strConnectHost。

未來除了

所有的VBScript變量的變體,但並非所有型號都是一樣的:

>> s0 = "string" 
>> s1 = CStr(12.35) 
>> WScript.Echo TypeName(s0), TypeName(s1) 
>> 
String String 
>> n0 = 1 
>> n1 = CByte(n0) 
>> WScript.Echo TypeName(n0), TypeName(n1) 
>> 
Integer Byte 

類型名()和VarType函數()顯示子類型和progammer可以使用一組 C[hange/onvertTo]<Type>()功能強制他們 - 在某種程度上,因爲任務 可能會改變'引擎蓋下'的類型。

>> WScript.Echo TypeName(n0), TypeName(n1) 
>> 
Integer Byte 
>> n0 = 1.1 
>> n1 = 2^20 
>> WScript.Echo TypeName(n0), TypeName(n1) 
>> 
Double Double 

甚至有類型不匹配錯誤:

>> WScript.Echo Nothing 
>> 
Error Number:  13 
Error Description: Type mismatch 
>> 

>> WScript.Echo s0 Is Nothing 
>> 
Error Number:  424 
Error Description: Object required 

所以子類型關係。有些人認爲類型前綴不太酷,但其他人則認爲它們在弱類型語言中是有價值的幫助。如果你決定使用它們,您應該 正確地使用它們 -

Set strWhatEver = objWhatever 
    objWhatever = intWhatever 
    intWhatever = objWhatever 
    If strWhatEver = intWhatever Then 

所有氣味(不重視類型的,很難牽制在後面的代碼中的錯誤)。

+0

我不知道我是否忽略了這一點,但直到下一次調用例程時才使變量變爲好,正是我想要的 - 我試圖進行內存管理,或者這是錯誤的方式來做到這一點。 真正的問題是...爲什麼變量(strHost)從其他變量(strConnect)獲取其值時變得無用,當它從(strConnect)獲取其值的變量設置爲無效時?這似乎沒有道理。 strHost沒有被清除,所以它爲什麼會受到影響? –

+0

你能解釋一下你的意思嗎?「類型前綴欺詐?」 VBS沒有選擇變量類型的方法,所有變量都是變體。考慮到這一點,我已經使用前綴來區分我在功能上使用變量。我很困惑這有什麼潛在的問題。 –