2012-02-17 110 views
8

我正在嘗試使用批處理文件來確認使用ping的網絡連接。我想執行批處理運行,然後打印,如果ping成功或不成功。問題是,它作爲一批運行時總是顯示'失敗'。這裏是代碼:批量ERRORLEVEL ping響應

@echo off 
cls 
ping racer | find "Packets: Sent = 4, Received = 4, Lost = 0 (0% loss)," 
if not errorlevel 1 set error=success 
if errorlevel 1 set error=failure 
cls 
echo Result: %error% 
pause 

'racer'是我的電腦的名字。我正在讓自己的計算機進行ping操作,以便消除連接不良的變量。正如我之前所說,批次總是導致失敗。奇怪的是,如果我將代碼複製到命令提示符下,程序工作正常。有誰知道爲什麼程序在命令提示符下工作正常,但不能作爲批處理工作? 感謝

回答

2

我也不知道是什麼FIND和設置錯誤級別之間的相互作用,但你可以做到這一點很容易:如果

@echo off 
for /f %%i in ('ping racer ^| find /c "(0%% loss)"') do SET MATCHES=%%i 
echo %MATCHES% 

這將打印0如果ping失敗,1它成功了。我讓它看起來只有「0%的損失」(不是特別的4點),所以可以定製ping的數量。

百分號已加倍,因此它不會被誤認爲應該被替換的變量。

FOR技巧只是簡單地將命令的輸出設置爲環境變量的值。

+0

感謝您的幫助! [這](http://stackoverflow.com/questions/3050898/how-to-check-if-ping-responded-or-not-in-a-batch-file)鏈接是我開始這個項目,和它的示例使用FIND。 – LastStar007 2012-02-17 16:41:38

+0

它可能無法正常工作。例如當得到響應時,例如'Host unreachable' – moteus 2017-10-09 08:01:08

4

如果你要

echo "Packets: Sent = 4, Received = 4, Lost = 0 (0% loss)," 

,你會看到%被剝離。你需要逃離它作爲%有一個批處理文件中有特殊的含義:

"Packets: Sent = 4, Received = 4, Lost = 0 (0%% loss)," 

但其易於使用TTL作爲成功的指示;

.. | find "TTL" 
+0

我在另一篇文章中看到了關於使用「TTL」的內容,但是想避免它,因爲有人說它可能會返回誤報。 – LastStar007 2012-02-17 16:35:32

0

基於亞歷克斯·K公司的注意,這對我的作品在Windows 7:

@echo off 
setlocal enableextensions enabledelayedexpansion 

for /f %%i in (PCS.TXT) do (
    SET bHOSTUP=0 
    ping -n 2 %%i |find "TTL=" > NUL && SET bHOSTUP=1 
    IF !bHOSTUP! equ 1 (
     CALL :HOSTUP %%i 
    ) else (
     CALL :HOSTDOWN %%i 
    ) 
) 
GOTO EOF 

:HOSTUP 
echo Host UP %1 
GOTO EOF 

:HOSTDOWN 
echo Host DOWN %1 
GOTO EOF 

:EOF 
exit /B 
4

測試爲0%的損失可能會出現假陽性,在這種情況下: 比方說,你通常有一個網絡驅動器上some_IP-address,你想知道它是否打開。

如果該驅動器是關閉的,而你平安some_IP地址,從中你ping IP地址,會迴應:
Answer from your_own_IP-address: target host not reachable
... 0% loss

你或許可以在網絡環境下使用if existif not exist會更好。

0

的所有

>@echo off 
>for /f %%i in ('ping racer ^| find /c "(0%% loss)"') do SET MATCHES=%%i 
>echo %MATCHES% 

先不工作。如果它不會失敗,它會檢測到0%,因爲它有0%。 如果它失敗了,也不起作用,因爲它會有100%的損失,這意味着它發現了0%損失後面的部分(0%損失)

它是否檢測到100%的損失所以:

>for /f %%i in ('ping -n 1 -l 1 %pc% ^| find /c "(100%% loss)"') do SET check=%%i 

錯誤級別可能會有點搞砸了,但它就像一個魅力:

>if '%check%'=='1' goto fail 
>if '%check%'=='0' echo %pc% is online.&goto starting 

1意味着失敗 0意味着它成功

在我的腳本中是使用鏈接。 轉到失敗將去:在我的腳本失敗,這將告訴我,%pc%(我將在開始時有用戶輸入)脫機,並將去另一次運行。

>:fail 
>color 0c 
>title %pc% is offline 
>echo %pc% is offline 
>PING -n 6 127.0.0.1>nul 
>goto choice 

我希望這會有所幫助。

1

最簡單的解決這個我能想到的:

set error=failure 
ping racer -n 1 -w 100>nul 2>&1 && set error=success 

當然,-w需要調整,如果慢速鏈路上(100ms的可能是通過撥號太短;-))

關於

0

ping具有errorlevel輸出值。成功是0,失敗1 只是這樣做:

C:\>ping 4.2.2.2 

Pinging 4.2.2.2 with 32 bytes of data: 

Reply from 4.2.2.2: bytes=32 time=28ms TTL=57 
Reply from 4.2.2.2: bytes=32 time=29ms TTL=57 
Reply from 4.2.2.2: bytes=32 time=30ms TTL=57 
Reply from 4.2.2.2: bytes=32 time=29ms TTL=57 

Ping statistics for 4.2.2.2: 
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), 
Approximate round trip times in milli-seconds: 
    Minimum = 28ms, Maximum = 30ms, Average = 29ms 

C:\>echo %errorlevel% 
0 

C:\>ping foo.bar 
Ping request could not find host foo.bar. Please check the name and try again. 

C:\>echo %errorlevel% 
1 

正如你可以看到有沒有必要所有這些腳本矯枉過正。

+5

問題,我得到了%0的損失,這是如果主機未知,errorlevel只設置爲1 - 如果ping一個沒有響應的ip地址,它仍然返回0 – l0ft13 2014-03-26 12:22:29

+0

同意。以下是進一步描述的情況:'C:\> ping -n 1 172.25.0.1使用32個字節的數據Pinging 172.25.0.1:來自172.25.1.1的應答:目標主機不可達。 Ping的統計信息爲172.25.0.1:數據包:發送= 1,收到= 1,丟失= 0(0%丟失),C:\> echo%errorlevel%0' – jdw 2015-10-31 12:42:11

1

,而不使用任何變量

ping racer -n 1 -w 100>nul || goto :pingerror 
... 

:pingerror 
echo Host down 
goto eof 

:eof 
exit /b 
0
set ErrorLevel=1 
(ping example.com -n 1 && set ErrorLevel=0)>nul 

ErrorLevel另一種變化是0如果exam​​ple.com是在線的,否則1

注意:僅在Win8上測試!

0

是的ping無法返回正確的錯誤級別。要檢查網絡連接,我用電腦「NET VIEW計算機名」,然後檢查%ERRORLEVEL% - 簡單和容易

+0

OP旨在實施一種連接質量測試 - ping幾個答案並檢查'0%損失'。 '淨視圖'不會這樣做。 – Stephan 2015-06-24 06:38:15

16

更可靠的ping錯誤檢查方法:

@echo off 
set "host=192.168.1.1" 

ping -n 1 "%host%" | findstr /r /c:"[0-9] *ms" 

if %errorlevel% == 0 (
    echo Success. 
) else (
    echo FAILURE. 
) 

該作品以檢查是否字符串如69 ms314msping打印。

(Windows的翻譯版本可能打印42 ms(與空間),因此我們檢查。)

原因:

其他建議,如匹配time=TTL不可靠的,因爲執行ping IPv6地址不顯示TTL(至少不是我的Windows 7機器上)和翻譯版本Windows可能會顯示字符串time=的翻譯版本。此外,不僅可以翻譯time=,但有時它可能是time<而不是time=,如time<1ms的情況。

+2

'ms'也翻譯成其他語言(例如俄語)。 – littleguga 2016-10-28 08:55:02

2
ping 198.168.57.98 && echo Success || echo failed 
+1

當你給出答案時,請提供更多信息。看到[回答] – 2017-03-03 14:57:57

+0

非常整潔的方法,我見過很多批次,但從來沒有見過。不過,我會修改它更像'ping 198.168.57.98 -n 1> nul 2>&1 && echo Success ||回聲失敗'。榮譽 – jacktrader 2017-06-28 16:00:53