使用Bat文件进行Ping测试 - 有错误级别的麻烦

时间:2014-01-20 22:33:30

标签: batch-file ping

我正在使用批处理文件设置LAN ping测试。我的代码对网站很有用,但对本地IP来说却很奇怪。我在3台知道IP的计算机上运行ping测试。无论我拔掉哪一个,当我运行下面的代码时,%errorlevel%在所有三台计算机上始终为0。它永远不会像在网站上那样等于1。我怎么解决这个问题?

@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)

4 个答案:

答案 0 :(得分:14)

当你ping子网中的一个不可访问的地址时,你得到一个“无法访问”的答案,发送1个数据包,收到1个数据包,丢失0个数据包。错误级别未设置。

当您从子网中ping出不可访问的地址时,会收到“超时”应答,发送1个数据包,收到0个数据包,丢失1个数据包。 Errorlevel已设置。

并且,您可以ping活动计算机,丢失数据包并获得错误级别

并且,您可以ping一个活动/非活动计算机,使TTL过期并且不会出现错误级别

更好,检查ping响应的内容。

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

答案 1 :(得分: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设置错误级别时才会执行||之后的命令。

答案 2 :(得分:0)

虽然我无法复制您的问题,但我确实为您的脚本提供了一些建议。 (有关该问题的问题,请参阅我的评论)

  1. 创建变量时封装范围。 setlocalendlocal
  2. 退出脚本时,使用/ b标志不会终止调用者的命令提示符。
  3. nul not null。
  4. 示例():

    @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%
    

答案 3 :(得分:0)

根据其他人提到的内容,我想展示一个人可能需要执行上面显示的所有操作以及使用修改后的变量(例如循环中的计数器)。

注意:使用“setlocal enabledelayedexpansion”允许在循环等中使用修改后的变量。

@echo off
setlocal enabledelayedexpansion

REM List of systems to check
set list=www.google.com www.yahoo.com www.notasite.com

set /a failed=0
set /a passed=0
set /a count=0

echo PingTest Servers on %list% :

(for %%a in (%list%) do ( 
    set /a "count+=1"
    call :PingVerbose %%a && set /a "passed=!passed!+1" || set /a "failed=!failed!+1"
))

echo ------------
echo Result: %passed% of %count% systems are pingable
pause
endlocal
exit /b 0

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

:PingVerbose <Address>
call :Ping %1 && echo %~1 - [ONLINE] || echo %~1 - [OFFLINE] 
exit /b %ErrorLevel%

输出:

PingTest Servers on www.google.com www.yahoo.com www.notasite.com :
www.google.com - [ONLINE]
www.yahoo.com - [ONLINE]
www.notasite.com - [OFFLINE]
------------
Result: 2 of 3 systems are pingable
Press any key to continue . . .