2014-10-07 84 views
0

我在寫一個VBScript,PINGS服務器和循環。VBscript Ping循環腳本問題

如果"Request Time Out"大於2,則應該執行Wscript.echo"cannot connect to server"

我的代碼如下。似乎沒有任何語法錯誤,但wscript.echo也未被執行!誰能幫我解決這個問題嗎?

Set objShell = CreateObject("WScript.Shell") 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
Rem Sends email alert 
Set wshShell = WScript.CreateObject("WScript.Shell") 

strComputer = "." 

strCommand = "ping SER1" 
strResults="" 
while InStr(1,StrResults,"Request timed out")>2 

    Set objExecObject = objShell.Exec(strCommand) 
    Do While Not objExecObject.StdOut.AtEndOfStream 
WScript.echo "Cannot Connect to Server" 
     strResults = objExecObject.StdOut.ReadAll() 


    Loop 
wend 
+1

'雖然條件.. Wend'循環執行一系列的語句,只要給定的條件是'真'。由於'strResults =「」'它不能包含任何子字符串,所以'雖然.. Wend'條件總是結果爲'False' – JosefZ 2014-10-07 22:37:16

回答

1

由於JosefZ指出,您的While循環永遠不會執行,因爲InStr條件False當你第一次測試。你需要做的是把外部循環變成Do ... Loop While循環。

另一個問題是你把Set objExecObject = objShell.Exec(strCommand)放在循環中。你大概只想要執行一次,然後循環StdOut,所以它應該放在循環開始之前。

Set objExecObject = objShell.Exec(strCommand) 
Do 
    Do While Not objExecObject.StdOut.AtEndOfStream 
     WScript.echo "Cannot Connect to Server" 
     strResults = objExecObject.StdOut.ReadAll() 
    Loop 
Loop While InStr(1,strResults,"Request timed out")>2 

有一兩件事我想知道的是「如果‘請求超時’是兩個以上...」。如果你的意思是,如果該文本存在(在大於2的位置),那麼它將起作用;如果您的意思是找到兩次以上,那麼它不會,因爲InStr只是返回字符串中搜索文本的位置,而不是匹配計數。

最後,目前還不十分清楚你爲什麼使用兩個循環。第一個沒有任何效果。第二個輸出相同的文本,不管發生了什麼。這就是我想你想:

strCommand = "ping microsoft.com" ' microsoft.com times out for me 
Set objExecObject = objShell.Exec(strCommand) 
Do While Not objExecObject.StdOut.AtEndOfStream 
    If InStr(1, objExecObject.StdOut.ReadLine, "request timed out", 1) <> 0 Then 
     WScript.echo "Cannot Connect to Server" 
     objExecObject.Terminate 
     Exit Do 
    End If 
Loop 

這將檢查StdOut「請求超時」。如果找到,則回顯文本,終止ping並退出循環。請注意,它不檢查它是否發生了兩次以上,因爲我不確定這是否是您想要的;如果是這樣,那麼你可能應該創建一個變量,在每次迭代中計數增加,如果它是兩次/兩次以上,則執行相同的操作(回顯,終止,退出循環)。

//編輯

確定這樣一個「無限的」 ping直到請求超時,此時它應該打印消息並退出循環。這可以通過ping命令本身很容易地完成,使用-t開關 - 這將導致ping無限期地繼續,而不是按照默認設置在4 ping之後停止。所以我們只是將它添加到這一行: strCommand = "ping microsoft.com -t" ' microsoft.com times out for me 並保留其餘代碼(我用單循環發佈的代碼)相同。

+0

我相信可能會有一些混淆。如果您的腳本在ping microsoft.com的情況下工作,如果將其設置爲ping google.com,則循環結束。我想我想回顯「無法連接到服務器」,只有當ping讀「請求超時」。如果ping發現服務器,則重複/循環直到ping「請求超時」。我爲此選擇了兩個循環。我很抱歉,我沒有真正寫vb腳本。我採取了上面的腳本並編輯它。 – 2014-10-08 21:08:39

+0

我加了兩個循環的另一個原因。即使ping發現服務器或找不到服務器,主循環也會繼續循環。我不想腳本結束,除非最終用戶以某種方式終止。 – 2014-10-08 21:10:23

+0

只是忽略了我所說的「如果」請求超時「超過兩次,那麼應該執行Wscript.echo」無法連接到服務器「。「 – 2014-10-08 21:11:46