如何检查ping是否响应或不在batch file中

我想连续ping一个服务器,当它响应,即服务器正在closures时,看到一个消息框。 我想通过batch file来完成。

我可以在这里显示一个消息框在Windowsbatch file中显示一个popup框/消息框

并可以连续ping通

ping <servername> -t 

但是,如何检查是否回应?

以下checklink.cmd程序是一个很好的开始。 它依赖于您可以执行单次ping的事实,如果成功,输出将包含该行:

 Packets: Sent = 1, Received = 1, Lost = 0 (0% loss), 

通过提取令牌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 

用你想testing的名称(或IP地址)来呼叫它:

 checklink 127.0.0.1 checklink localhost checklink nosuchaddress 

请注意,如果您的语言环境不是英语,则必须将您的语言环境中的相应关键字replace为已Received的关键字,例如西class牙语的recibidos 。 进行testingping以发现在您的语言环境中使用了哪个关键字。


要只在状态改变时通知你,你可以使用:

 @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以便上面第二个脚本的等价物变成:

 @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回应这个脚本。

然而,如果你得到Host Unreachable消息,这将返回ERRORLEVEL 0,并且通过在这个脚本中使用的Received = 1的检查,返回Link is UP from the script。 主机无法访问发生在ping传递到目标notwork但远程主机找不到。

如果我记得检查ping是否成功的正确方法是使用Find查找string“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% 

这不适用于IPv6networking,因为从IPv6地址收到答复时,ping不会列出TTL。

我知道这是一个古老的线程,但我想testing一台机器是否在我的系统上,除非我误解了,如果我的路由器报告地址不可达,以上都不起作用。 我正在使用一个batch file,而不是一个脚本,因为我想在几乎所有的WIN机器上“吻”。 所以我使用的方法是做多个ping,并testing“Lost = 0”如下

 ping -n 2 %pingAddr% | find /I "Lost = 0" if %errorlevel% == 0 goto OK 

我没有严格testing,但到目前为止,它为我做的工作

您可以ping“ – t”并检查ping的退出码。 它在没有答案时报告失败。

简单版本:

 for /F "delims==, tokens=4" %a IN ('ping -n 2 127.0.0.1 ^| findstr /R "^Packets: Sent =.$"') DO ( if %a EQU 2 ( echo Success ) ELSE ( echo FAIL ) ) 

但有时第一次ping只是失败,第二次工作(反之亦然)对不对? 所以我们想在至less有一个ICMP回复成功返回的时候获得成功:

 for /F "delims==, tokens=4" %a IN ('ping -n 2 192.168.1.1 ^| findstr /R "^Packets: Sent =.$"') DO ( if %a EQU 2 ( echo Success ) ELSE ( if %a EQU 1 ( echo Success ) ELSE ( echo FAIL ) ) ) 

我已经根据paxdiablo的职位制定了一个变体解决scheme

将下面的代码放在Waitlink.cmd中

 @setlocal enableextensions enabledelayedexpansion @echo off set ipaddr=%1 :loop set state=up ping -n 1 !ipaddr! >nul: 2>nul: if not !errorlevel!==0 set state=down echo.Link is !state! if "!state!"=="up" ( goto :endloop ) ping -n 6 127.0.0.1 >nul: 2>nul: goto :loop :endloop endlocal 

例如,像这样从另一个batch file中使用它

 call Waitlink someurl.com net use o: \\someurl.com\myshare 

waitlink的调用只会在ping成功时返回。 感谢paxdiablo和Gabe。 希望这可以帮助别人。

这是我发现的东西:

 :pingtheserver ping %input% | find "Reply" > nul if not errorlevel 1 ( echo server is online, up and running. ) else ( echo host has been taken down wait 3 seconds to refresh ping 1.1.1.1 -n 1 -w 3000 >NUL goto :pingtheserver ) 

请注意, ping 1.1.1.1 -n -w 1000 >NUL将等待1秒,但仅在连接到networking时才起作用

我希望这可以帮助别人。 在检查单个path之前,我使用这一点逻辑来validationnetworking共享是否有响应。 它应该处理DNS名称和IP地址

文本文件中的有效path是\ 192.168.1.2 \“文件夹”或\ NAS \“文件夹”

 @echo off title Network Folder Check pushd "%~dp0" :00 cls for /f "delims=\\" %%A in (Files-to-Check.txt) do set Server=%%A setlocal EnableDelayedExpansion ping -n 1 %Server% | findstr TTL= >nul if %errorlevel%==1 ( ping -n 1 %Server% | findstr "Reply from" | findstr "time" >nul if !errorlevel!==1 (echo Network Asset %Server% Not Found & pause & goto EOF) ) :EOF 

我已经看到了三个结果 – 一个我们“想要”在IP回复,“主机无法访问”和“超时”(确切的措辞不确定)的结果。

前两个返回0的ERRORLEVEL。

超时返回1的ERRORLEVEL。

是否可能返回其他结果和错误级别? (除了使用返回允许开关的无效开关和1的错误级别)

显然Host Unreachable可以使用之前发布的方法之一(尽pipe当某人回复他们正在编写代码的情况下很难弄清楚),但是超时是否以类似的方式返回,以至于它可以被parsing?

一般来说,如何知道ping的结果部分可以被parsing? (也就是说,为什么可以parsing发送和/或接收的和/或TTL的,但不是主机不可达的?

哦,和iSid,可能没有太多的upvotes,因为读这个的人没有足够的分数。 所以他们得到他们的问题回答(或不),并离开。

我没有把上面的post作为答复。 这应该是一个评论,但我没有看到这个select。