如何在批处理文件中检查 ping 是否响应 [英] How to check if ping responded or not in a batch file

查看:39
本文介绍了如何在批处理文件中检查 ping 是否响应的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想持续 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆