1

在命令行中键入 ping 时是否可以检索数据输出?

目前,我们每天通过在命令行中输入 ping(IP 地址)来检查现有的服务器,但仅在一天开始时进行。只有在用户通知我们后服务器关闭时,我们才会收到通知。手动要做的就是做一个连续的ping,并及时检查它是否断开连接。

一旦命令行声明存在“请求超时”、间歇性连接等,我想创建一个提示(同时在后台进行连续 ping)的东西。这样就不需要了手动检查连接状态。

4

1 回答 1

1

我意识到这是 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
于 2013-10-18T15:05:24.000 回答