在命令行中键入 ping 时是否可以检索数据输出?
目前,我们每天通过在命令行中输入 ping(IP 地址)来检查现有的服务器,但仅在一天开始时进行。只有在用户通知我们后服务器关闭时,我们才会收到通知。手动要做的就是做一个连续的ping,并及时检查它是否断开连接。
一旦命令行声明存在“请求超时”、间歇性连接等,我想创建一个提示(同时在后台进行连续 ping)的东西。这样就不需要了手动检查连接状态。
在命令行中键入 ping 时是否可以检索数据输出?
目前,我们每天通过在命令行中输入 ping(IP 地址)来检查现有的服务器,但仅在一天开始时进行。只有在用户通知我们后服务器关闭时,我们才会收到通知。手动要做的就是做一个连续的ping,并及时检查它是否断开连接。
一旦命令行声明存在“请求超时”、间歇性连接等,我想创建一个提示(同时在后台进行连续 ping)的东西。这样就不需要了手动检查连接状态。
我意识到这是 2 个月前提出的,但从未得到答复。希望这仍然对某人有用。诚然,使用“真正的”编程语言实现起来要容易得多,但有时您需要一些只使用内置命令的东西。
根据需要通过环境变量进行配置(显示示例)。出于礼貌,如果您不拥有正在 ping 的服务器,您可能希望使用更长的超时时间。
@echo off
cls
setlocal enabledelayedexpansion
REM Configuration:
set SERVER=google.com
set TIMEOUT_AFTER_PING_FAIL_SECONDS=5
set TIMEOUT_AFTER_PING_SUCCEED_SECONDS=10
set TIMEOUT_AFTER_LINK_DOWN_SECONDS=15
set DECLARE_LINK_DOWN_FAILS=5
set CONSECUTIVE_FAIL_COUNT=0
:Start
set PING_RESULT=Failure
for /f "delims=" %%X in ('ping /n 1 %SERVER%') do (
set TEMPVAR=%%X
if "Reply from"=="!TEMPVAR:~0,10!" set PING_RESULT=Success
)
goto:!PING_RESULT!
:Success
echo Ping Succeeded
set CONSECUTIVE_FAIL_COUNT=0
call:Sleep %TIMEOUT_AFTER_PING_SUCCEED_SECONDS%
goto:Start
:Failure
set /A CONSECUTIVE_FAIL_COUNT+=1
echo Ping Failed !CONSECUTIVE_FAIL_COUNT! Time(s)
if !CONSECUTIVE_FAIL_COUNT!==%DECLARE_LINK_DOWN_FAILS% (call:LinkDownHandler&goto:Start)
call:Sleep %TIMEOUT_AFTER_PING_FAIL_SECONDS%
goto:Start
:Sleep
REM See http://stackoverflow.com/questions/4317020/windows-batch-sleep
setlocal
set /A ITERATIONS=%1+1
ping -n %ITERATIONS% 127.0.0.1 >nul
goto:eof
:LinkDownHandler
echo Link is Down
set CONSECUTIVE_FAIL_COUNT=0
REM Add additional link-down handler actions here
call:Sleep %TIMEOUT_AFTER_LINK_DOWN_SECONDS%
goto:eof