Ism*_*ilS 40 command-line ping batch-file
我想连续ping服务器并在响应时看到一个消息框,即服务器当前已关闭.我想通过批处理文件来完成它.
我可以显示一个消息框,如此处显示Windows批处理文件中的弹出/消息框
并且可以连续ping通
ping <servername> -t
Run Code Online (Sandbox Code Playgroud)
但是我该如何检查它是否有反应?
Luk*_*asz 28
问题是看ping是否响应了这个脚本的作用.
但是,如果您收到Host Unreachable消息,则此操作无效,因为此消息返回ERRORLEVEL 0并传递此脚本中使用的Received = 1的检查,从脚本返回Link is UP.当ping传送到目标notwork但无法找到远程主机时,会发生Host Unreachable.
如果我记得检查ping是否成功的正确方法是使用Find查找字符串'TTL'.
@echo off
cls
set ip=%1
ping -n 1 %ip% | find "TTL"
if not errorlevel 1 set error=win
if errorlevel 1 set error=fail
cls
echo Result: %error%
Run Code Online (Sandbox Code Playgroud)
这不适用于IPv6网络,因为在从IPv6地址接收回复时ping不会列出TTL.
pax*_*blo 19
以下checklink.cmd程序是一个很好的起点.它依赖于你可以进行单次ping的事实,如果成功,输出将包含以下行:
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Run Code Online (Sandbox Code Playgroud)
通过提取标记5和7,并检查他们分别"Received"和"1,",可以检测成功.
@setlocal enableextensions enabledelayedexpansion
@echo off
set ipaddr=%1
:loop
set state=down
for /f "tokens=5,6,7" %%a in ('ping -n 1 !ipaddr!') do (
if "x%%b"=="xunreachable." goto :endloop
if "x%%a"=="xReceived" if "x%%c"=="x1," set state=up
)
:endloop
echo.Link is !state!
ping -n 6 127.0.0.1 >nul: 2>nul:
goto :loop
endlocal
Run Code Online (Sandbox Code Playgroud)
使用您要测试的名称(或IP地址)调用它:
checklink 127.0.0.1
checklink localhost
checklink nosuchaddress
Run Code Online (Sandbox Code Playgroud)
请注意,如果您的语言环境不是英语,则必须Received使用语言环境中的相应关键字替换,例如recibidos西班牙语.执行测试ping以发现您的语言环境中使用的关键字.
要仅在状态更改时通知您,您可以使用:
@setlocal enableextensions enabledelayedexpansion
@echo off
set ipaddr=%1
set oldstate=neither
:loop
set state=down
for /f "tokens=5,7" %%a in ('ping -n 1 !ipaddr!') do (
if "x%%a"=="xReceived" if "x%%b"=="x1," set state=up
)
if not !state!==!oldstate! (
echo.Link is !state!
set oldstate=!state!
)
ping -n 2 127.0.0.1 >nul: 2>nul:
goto :loop
endlocal
Run Code Online (Sandbox Code Playgroud)
但是,正如Gabe在评论中指出的那样,你可以使用,ERRORLEVEL因此上面第二个脚本的等效变为:
@setlocal enableextensions enabledelayedexpansion
@echo off
set ipaddr=%1
set oldstate=neither
:loop
set state=up
ping -n 1 !ipaddr! >nul: 2>nul:
if not !errorlevel!==0 set state=down
if not !state!==!oldstate! (
echo.Link is !state!
set oldstate=!state!
)
ping -n 2 127.0.0.1 >nul: 2>nul:
goto :loop
endlocal
Run Code Online (Sandbox Code Playgroud)
小智 7
我知道这是一个旧线程,但我想测试一台机器是否在我的系统上,除非我误解了,如果我的路由器报告地址无法访问,则上述任何一个都无效.我使用批处理文件而不是脚本,因为我想在任何WIN机器上"KISS".所以我使用的方法是进行多次ping并测试"Lost = 0",如下所示
ping -n 2 %pingAddr% | find /I "Lost = 0"
if %errorlevel% == 0 goto OK
Run Code Online (Sandbox Code Playgroud)
我没有严格测试过,但到目前为止它对我来说都很合适