2010-06-16 65 views
35

我想连续ping服务器并在有响应时看到消息框,即服务器当前处于关闭状态。我想通过批处理文件来完成。如何检查ping是否在批处理文件中作出响应

我可以显示一个消息框,如下Show a popup/message box from a Windows batch file

说,可以通过

ping <servername> -t 

连续ping通,但我怎么检查它是否回应与否?

+0

这岂不是一般给你数据的XX字节,则返回? – Sphvn 2010-06-16 05:29:07

+0

但我在问如何在批处理文件中检查if条件 – IsmailS 2010-06-16 06:19:13

+0

这个问题已经变得很流行(查看1000次),并且没有太多的问题和答案。这让我猜想,访问者正在为了其他目的而来到这个页面,而不是在这里找到它。换句话说,我猜这个页面显示在与这个问题无关的一些关键字的搜索结果中。我想知道其他东西(或与此问题无关的关键字)是什么,以及如何更改此问题的标题,以便访问者(正在等待其他人)时间被保存。 – IsmailS 2011-06-14 04:46:01

回答

15

以下checklink.cmd程序是一个很好的开始。它依赖于事实,你可以做一个单杆平,并且,如果成功的话,输出将包含行:

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 

的名称(或IP地址)调用它,你想测试:

checklink 127.0.0.1 
checklink localhost 
checklink nosuchaddress 

要考虑到,如果你的语言环境不是英语,你必须与相应的关键字替换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 

然而,随着加布在评论中指出,你可以使用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 
+0

谢谢v @paxdiablo!你能帮我修改一下,这样我只能看到服务器启动时弹出消息框吗? 用于显示消息框的命令是'msg'%username%“链接已关闭”,并且此命令适用于Windows 7上的我。 – IsmailS 2010-06-16 06:17:33

+3

您做了很多工作,而不是仅仅检查'%ERRORLEVEL%'! – Gabe 2010-06-16 06:22:40

+1

这是一个很好的观点,@加贝,我已经将其纳入脚本。 – paxdiablo 2010-06-16 06:37:34

0

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

+4

我们的程序员可以比英语更快地阅读和理解代码;)。只是在开玩笑。 – IsmailS 2010-06-16 07:21:18

+2

OP可能希望设置批处理脚本运行,然后在机器上执行其他操作,只有在状态更改时才会收到警报。不坐着看每个ping的回复结果。 – user66001 2016-05-18 14:12:30

21

问题是看看ping是否回应了这个脚本的作用。

但是,如果您收到Host Unreachable消息,因为它返回ERRORLEVEL 0并通过此脚本中使用的Received = 1的检查,则返回Link is UP from the script。发现主机无法访问时,将ping传递给目标notwork,但无法找到远程主机。

如果我记得检查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% 

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

+0

非常感谢:) – IsmailS 2010-08-16 04:13:24

+0

这帮了我!真棒! – 2016-01-20 14:20:47

0

简易版:

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只是失败,第二个作业(反之亦然),对不对?所以我们想成功当至少一个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 
) 
) 

) 
-1

我见过的三个结果对ping - 就是我们“希望”里的IP回答说,“主机无法接通”和“超时”(不确定的确切措辞)。

超时的前两个返回ERRORLEVEL返回1.

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

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

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

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

我没有张贴上面的答案。这应该是一个评论,但我没有看到这样的选择。

+0

每个答案下面都有一个“添加评论”链接(蓝色,全部为小写,靠近分隔帖子的行)以及问题。请根据相应的问题/答案将您的评论复制并粘贴到评论中。 -1 – user66001 2016-05-18 14:16:28

1

我有根据paxdiablo的帖子制作了一个变体解决方案

将以下代码放入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 

例如用它从另一个批处理文件这样

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

的呼叫waitlink当平是成功的将只返回。感谢paxdiablo和Gabe。希望这可以帮助别人。

4

我知道这是一个旧线程,但我想测试一台机器是否在我的系统上运行,除非我误解了,如果我的路由器报告地址无法访问,以上都不起作用。我使用批处理文件而不是脚本,因为我想在几乎任何WIN机器上“吻”。所以我使用的方法是为“迷失= 0”做多一平,并测试如下

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

我没有测试过这种严格的,但到目前为止,它确实为我工作

0

这里的这是我发现:

: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秒,但只有当连接到网络

0

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

文本文件中的有效路径为 \ 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 
-1
#!/bin/bash 
logPath="pinglog.txt" 

while(true) 
     do 
      # refresh the timestamp before each ping attempt 
      theTime=$(date -Iseconds) 

      # refresh the ping variable 
      ping google.com -n 1 

      if [ $? -eq 0 ] 
      then 
       echo $theTime + '| connection is up' >> $logPath 
      else 
       echo $theTime + '| connection is down' >> $logPath 
      fi 
      Sleep 1 
      echo ' ' 
     done 
+0

问题是关于Windows批处理文件不是bash – jeb 2018-02-07 18:34:47

相关问题