我试图创建一个批处理脚本,该脚本应该ping一个站点,记录结果,如果结果为负则启动程序。这是原始脚本(不是我的)的修改,可以找到here。域,IP和程序变量的值仅用于说明目的。
@echo off
cls
set domain=testsite.com
set IP=133.78.17.101
set program=c:\windows\notepad.exe
set output=c:\log.txt
set result=1
:Start
IF [%result%]==[] (
>>%output% echo -----------
start %program%
)
ECHO Pinging %domain%...
FOR /F "delims=" %%G in ('ping -n 1 %domain% ^| find "Reply"') DO SET result=%%G
IF NOT [%result%]==[] (
goto Success
) ELSE (
goto TryAgain
)
:TryAgain
ECHO %domain% unreachable. Trying again...
FOR /F "delims=" %%G in ('ping -n 1 %domain% ^| find "Reply"') DO SET result=%%G
IF NOT [%result%]==[] (
goto Success2
) ELSE (
goto TryIp
)
:TryIp
ECHO %domain% unreachable. Pinging %ip%...
FOR /F "delims=" %%G in ('ping -n 1 %IP% ^| find "Reply"') DO SET result=%%G
IF NOT [%result%]==[] (
goto SuccessDNS
) ELSE (
goto TestInternet
)
:TestInternet
ECHO %ip% unreachable. Testing internet connection.
FOR /F "delims=" %%G in ('ping -n 1 www.google.com ^| find "Reply"') DO SET result=%%G
IF NOT [%result%]==[] (
goto Success3
) ELSE (
goto NetDown
)
:Success
>>%output% ECHO Connected
>>%output% echo %date% %time% %result%
ping -n 3 127.0.0.1 > nul
goto Start
:Success2
>>%output% ECHO Connected with packet loss.
>>%output% echo %date% %time% %result%
set result=
ping -n 3 127.0.0.1 > nul
goto Start
:Success3
>>%output% ECHO Domain %domain% not reachable. Connected via IP.
>>%output% echo %date% %time% %result%
set result=
ping -n 3 127.0.0.1 > nul
goto Start
:SuccessDNS
>>%output% ECHO DNS problem.
>>%output% echo %date% %time% %result%
set result=
ping -n 3 127.0.0.1 > nul
goto Start
:NetDown
>>%output% ECHO No internet connection.
>>%output% echo %date% %time% %result%
set result=
ping -n 3 127.0.0.1 >nul
goto Start
我想要实现的是 - 如果收到ping请求的完美答复以外的任何内容,脚本应该启动一个程序。为了确保这种情况发生,我每次都清除result
变量,而不是预期的ping响应。
即使在我清空之后,回应result
的值仍然会返回1。
答案 0 :(得分:1)
在你的行
FOR /F "delims=" %%G in ('ping -4 -n 1 %domain% ^| find "Reply"') DO SET result=%%G
%%G
未定义(当Reply
没有出现时),根本不会触及Result
变量,
或类似Reply from x.x.x.x : Bytes=32 Time<1ms TTL=128
的行,它最终都不是空的
根据您的其余代码,您可能需要... DO SET "result="
来取消设置变量。
注意:搜索&#34;回复&#34;是
a)语言依赖(&#34; Antwort&#34;在德国Windows上)和
b)不可靠(想想Reply from localhost: destination address unreachable
)
更好地搜索TTL=
(即使没有for
循环也可以工作):
ping -n 1 %IP% | find "TTL=" >nul && set "reply=true" || set "reply=false"
echo %reply%
答案 1 :(得分:0)
只是Stephan's post的附录。
除了在Stephan的帖子中发布的原因之外,代码没有像我原先计划的那样工作,因为比较也失败了。如果ping成功,则result
变量被设置为由多个单词组成的字符串,这打破了比较。为了避免这种情况,我不得不改变
IF [%result%]==[]
到
IF ["%result%"]==[""]
Thomas Weller(现已删除)评论也在正确的轨道上 - 我确实需要清空result
中的:Start
变量:
:Start
IF ["%result%"]==[""] (
>>%output% echo -----------
start %program%
)
SET result=
ECHO Pinging %domain%...
需要进行此清空以取消之前的任何成功和原始set result=1
(如果出现一致的失败)。