我正在使用批处理文件设置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)
答案 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)
虽然我无法复制您的问题,但我确实为您的脚本提供了一些建议。 (有关该问题的问题,请参阅我的评论)
setlocal
和endlocal
示例():
@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 . . .