如何在批处理文件中检查 ping 是否响应 [英] How to check if ping responded or not in a batch file
问题描述
我想持续 ping 服务器并在它响应时看到一个消息框,即服务器当前关闭.我想通过批处理文件来做.
I want to continuously ping a server and see a message box when ever it responds i.e. server is currently down. I want to do it through batch file.
我可以在这里显示一个消息框 显示来自 Windows 批处理文件的弹出/消息框
I can show a message box as said here Show a popup/message box from a Windows batch file
并且可以通过
ping <servername> -t
但是我如何检查它是否有响应?
But how do I check if it responded or not?
推荐答案
以下 checklink.cmd
程序是一个很好的起点.它依赖于您可以执行单次 ping 并且如果成功,输出将包含以下行的事实:
The following checklink.cmd
program is a good place to start. It relies on the fact that you can do a single-shot ping and that, if successful, the output will contain the line:
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
通过提取令牌 5 和 7 并检查它们分别是 "Received"
和 "1,"
,您可以检测成功.
By extracting tokens 5 and 7 and checking they're respectively "Received"
and "1,"
, you can detect the success.
@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
使用您要测试的名称(或 IP 地址)调用它:
Call it with the name (or IP address) you want to test:
checklink 127.0.0.1
checklink localhost
checklink nosuchaddress
请注意,如果您的语言环境不是英语,则必须将 Received
替换为您语言环境中的相应关键字,例如 recibidos
代表西班牙语.执行 ping 测试以发现在您的语言环境中使用了什么关键字.
Take into account that, if your locale is not English, you must replace Received
with the corresponding keyword in your locale, for example recibidos
for Spanish. Do a test ping to discover what keyword is used in your locale.
要仅在状态改变时通知您,您可以使用:
To only notify you when the state changes, you can use:
@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
<小时>
但是,正如 Gabe 在评论中指出的那样,您可以只使用 ERRORLEVEL
,因此上面第二个脚本的等效项变为:
However, as Gabe points out in a comment, you can just use ERRORLEVEL
so the equivalent of that second script above becomes:
@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
这篇关于如何在批处理文件中检查 ping 是否响应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!