我想连续ping服务器并在有响应时看到消息框,即服务器当前处于关闭状态。我想通过批处理文件来完成。如何检查ping是否在批处理文件中作出响应
我可以显示一个消息框,如下Show a popup/message box from a Windows batch file
说,可以通过
ping <servername> -t
连续ping通,但我怎么检查它是否回应与否?
我想连续ping服务器并在有响应时看到消息框,即服务器当前处于关闭状态。我想通过批处理文件来完成。如何检查ping是否在批处理文件中作出响应
我可以显示一个消息框,如下Show a popup/message box from a Windows batch file
说,可以通过
ping <servername> -t
连续ping通,但我怎么检查它是否回应与否?
以下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
问题是看看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。
非常感谢:) – IsmailS 2010-08-16 04:13:24
这帮了我!真棒! – 2016-01-20 14:20:47
简易版:
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
)
)
)
我见过的三个结果对ping - 就是我们“希望”里的IP回答说,“主机无法接通”和“超时”(不确定的确切措辞)。
超时的前两个返回ERRORLEVEL返回1.
ERRORLEVEL是其他结果和错误的水平,可能会返回? (除了使用返回允许开关的无效开关和1的错误级别)。
显然Host Unreachable可以使用之前发布的方法之一(尽管当某人回复他们正在编写代码的情况时很难弄清楚for),但超时是否以类似的方式返回,以至于可以解析?
一般来说,如何知道ping的结果部分可以被解析? (也就是说,为什么发送和/或接收和/或TTL可以解析,但不是主机无法访问?
哦,和iSid,可能没有太多upvotes,因为读取这个的人没有足够的分数所以他们得到他们的回答过的问题(或没有),并离开。
我没有张贴上面的答案。这应该是一个评论,但我没有看到这样的选择。
每个答案下面都有一个“添加评论”链接(蓝色,全部为小写,靠近分隔帖子的行)以及问题。请根据相应的问题/答案将您的评论复制并粘贴到评论中。 -1 – user66001 2016-05-18 14:16:28
我有根据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。希望这可以帮助别人。
我知道这是一个旧线程,但我想测试一台机器是否在我的系统上运行,除非我误解了,如果我的路由器报告地址无法访问,以上都不起作用。我使用批处理文件而不是脚本,因为我想在几乎任何WIN机器上“吻”。所以我使用的方法是为“迷失= 0”做多一平,并测试如下
ping -n 2 %pingAddr% | find /I "Lost = 0"
if %errorlevel% == 0 goto OK
我没有测试过这种严格的,但到目前为止,它确实为我工作
这里的这是我发现:
: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秒,但只有当连接到网络
我希望这可以帮助别人的作品。在检查单个路径之前,我使用这一点逻辑来验证网络共享是否有响应。它应该处理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
#!/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
问题是关于Windows批处理文件不是bash – jeb 2018-02-07 18:34:47
这岂不是一般给你数据的XX字节,则返回? – Sphvn 2010-06-16 05:29:07
但我在问如何在批处理文件中检查if条件 – IsmailS 2010-06-16 06:19:13
这个问题已经变得很流行(查看1000次),并且没有太多的问题和答案。这让我猜想,访问者正在为了其他目的而来到这个页面,而不是在这里找到它。换句话说,我猜这个页面显示在与这个问题无关的一些关键字的搜索结果中。我想知道其他东西(或与此问题无关的关键字)是什么,以及如何更改此问题的标题,以便访问者(正在等待其他人)时间被保存。 – IsmailS 2011-06-14 04:46:01