2017-09-16 68 views
0

我試圖製作一個批處理腳本,該腳本應該可以對站點執行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

'%result%'和'%result'不一樣。你有一個錯誤的'IF NOT [%result] == []('lines。 – Stephan

+2

'%result%'改變'%result'的所有實例並重試! – Compo

+0

@Stephan正確,糾正它,但仍然不按照我的預期工作 – FiddlingAway

回答

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="來取消設置變量。

注:搜索 「回覆」 是
一)在德語Windows語言依賴( 「Antwort」)和
B)不可靠(認爲Reply from localhost: destination address unreachable)。
更好的搜索TTL=(即使工作沒有for環路):

ping -n 1 %IP% | find "TTL=" >nul && set "reply=true" || set "reply=false" 
echo %reply% 
+0

實際上,'DO SET result = %% G'在代碼中,因爲我需要將'result'記錄到一個帶有>>%output%ECHO(%result%'的文件中。但是,如果沒有'Reply'(或TTL,正如你所建議的那樣),'result'不會被改變/定義。這就是代碼不能按照我期望的那樣工作的原因之一。謝謝,指出這一點。 – FiddlingAway

0

只是一個增編Stephan's post

除了在Stephan的帖子中發佈的原因之外,代碼沒有像我最初計劃的那樣工作,因爲比較失敗了。如果ping成功,則result變量將被設置爲由多個單詞組成的字符串,這將打破比較。爲了避免這種情況,我不得不的

IF [%result%]==[] 

每個實例更改爲

IF ["%result%"]==[""] 

托馬斯·韋勒(現已刪除)評論也是正確的軌道上 - 我沒有需要清空result變量在:Start

:Start 
IF ["%result%"]==[""] (
    >>%output% echo ----------- 
    start %program% 
) 
SET result= 
ECHO Pinging %domain%... 

需要這排空宣佈任何以前的成功和原set result=1(如果一致失敗)。