我正在编写一个用于PINGS服务器和循环的VBscript。
如果"Request Time Out"
超过两个,则应执行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
答案 0 :(得分: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
&#34;请求超时&#34;。如果找到则回显文本,终止ping并退出循环。请注意,它不会检查它是否发生了两次以上,因为我不确定这是否是你想要的;如果是这样,那么你可能应该创建一个变量,其计数在每次迭代时增加,如果它是两次/两次以上,则执行相同的操作(echo,terminate,exit loop)。
//编辑
好的,#34;无限的&#34; ping直到请求超时,此时它应该打印消息并退出循环。这可以通过ping命令本身很容易地实现,使用-t
开关 - 这将导致ping无限期地继续,而不是默认情况下在4次ping后停止。所以我们只是将它添加到这一行:
strCommand = "ping microsoft.com -t" ' microsoft.com times out for me
并保留其余代码(我用单循环发布的代码)。