2014-01-20 97 views
1

我正在使用批處理文件設置LAN ping測試。我的代碼對網站非常有用,但對於本地IP來說卻很奇怪。我正在3臺電腦上運行ping測試,我知道IP地址。無論哪一個我拔下,當我運行下面的代碼時,%errorlevel%在所有三臺計算機上始終爲0。它不會像在網站上那樣等於1。我該如何解決這個問題?Ping測試使用Bat文件 - 出錯的錯誤級別

@echo off 
cls 
Set IPaddress=www.google.com 
PING %IPaddress% -n 1 
call :PingTest 

Set IPaddress=www.yahoo.com 
PING %IPaddress% -n 1 
call :PingTest 

Set IPaddress=www.unabletoping.com 
PING %IPaddress% -n 1 
call :PingTest 

pause > null 
exit 

:PingTest 
IF %errorlevel% EQU 1 (echo "Server is Offline") else (GOTO:EOF) 
+0

局域網上的每臺計算機都分配了靜態IP還是動態的? DHCP是否開啓?如果是這樣,我會建議使用計算機名稱而不是他們的IP地址。 'ping '這樣您就可以查找特定的計算機,而不是分配給該IP地址的任何設備。 –

+0

用動態測試,我預定的將運行的將會靜態。我想在任何時間點使用IP來防止名稱解析出現問題。 –

回答

13

當你在你的子網中ping一個不可訪問的地址時,你會得到一個「無法訪問」的答案,1個包發送,1個包裝收到,0個包丟失。錯誤級別未設置。

當你從你的子網ping出一個非可訪問的地址時,你會得到一個「超時」的答案,發送1個數據包,接收0個數據包,丟失1個數據包。錯誤級別已設置。

而且,您可以ping一個活動的機器,丟失的數據包,並得到一個錯誤級別

而且,您可以ping一個有效/無效的機器,得到TTL過期,沒有得到錯誤級別

更好,檢查內容的響應。

ping -n 1 192.168.1.1 | find "TTL=" >nul 
if errorlevel 1 (
    echo host not reachable 
) else (
    echo host reachable 
) 
+0

非常感謝您的幫助。這解決了我的問題。再次感謝你。 –

0

雖然我無法複製您的問題,但我對您的腳本有一些建議。 (請參閱我對該問題的評論)

  1. 創建變量時會封裝範圍。 setlocalendlocal
  2. 當退出腳本時,使用/ b標誌以不殺死調用者的命令提示符。
  3. nul not null。

例():

@echo off 
setlocal 
cls 

set "IPaddress=www.google.com" 
call :PingVerbose "%IPaddress%" 
call :PingVerbose "www.yahoo.com" 
call :PingVerbose "www.microsoft.com" 

pause>nul 
endlocal 
exit /b 0 

:Ping <Address> 
ping "%~1" -n 1 >nul 
exit /b %ErrorLevel% 

:PingVerbose <Address> 
call :Ping %1 && echo %~1 is Online || echo %~1 is Offline 
exit /b %ErrorLevel% 
1

雖然我也不能複製你的問題,也有一個建議,以更好地你的腳本 -

@echo off & cls 

set addresses=10.1.1.666 10.124.412.14 10.7.254.1 

for %%a in (%addresses%) do ping %%a -n 1 > nul || echo %%a is offline 

注意,命令後||只會如果通過ping設置了錯誤級別,則執行該命令。