设置为空后,变量未在批处理脚本中清空

时间:2017-09-16 17:04:59

标签: windows batch-file

我试图创建一个批处理脚本,该脚本应该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。

2 个答案:

答案 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(如果出现一致的失败)。