【问题标题】:Pause a batch file until a host is reachable (using ping)?暂停批处理文件直到可以访问主机(使用 ping)?
【发布时间】:2013-02-01 00:48:07
【问题描述】:

我希望为我一直在编写的批处理文件添加一些功能; 基本上发生的事情是我使用 openvpn 拨打 VPN 连接,然后继续安装网络驱动器以及许多其他事情,我想做的是:

  • 通过 OpenVPN 拨号连接(我工作正常)
  • Ping VPN 另一端的主机,在可以访问该主机之前不要继续处理批处理文件。

目前我一直在使用 20 秒的睡眠命令,它有效,但不是一种非常干净或智能的方式;我想我需要某种循环来尝试无限地ping主机,直到它可以访问,然后再继续批处理文件。任何帮助将不胜感激。

【问题讨论】:

    标签: loops batch-file ping host openvpn


    【解决方案1】:

    来自 stackoverflow 上的另一个线程...感谢 paxdiablo(找到原帖 here

    @setlocal enableextensions enabledelayedexpansion
    @echo off
    set ipaddr=%1
    :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
    )
    echo.Link is !state!
    ping -n 6 127.0.0.1 >nul: 2>nul:
    goto :loop
    endlocal
    

    这会给你足够的弹药来使用和解决你的问题

    【讨论】:

    • 这不适用于非英文 Windows,因为 ping 翻译成其他版本!
    【解决方案2】:

    正如几年前已经提到的,ping 的输出取决于语言,因此依赖像Received 这样的字符串不是一个好主意。首选且最可靠的方法是搜索字符串TTL=

    :loop
    timeout 2
    ping -n 1 %ipaddress% |find "TTL=" || goto :loop
    echo Answer received.
    

    || 相当于“如果之前的命令 (find) 不成功,那么”

    (至于timeout:永远不要在没有空闲时间的情况下构建循环以减少CPU负载)

    【讨论】:

    • 不错的答案。我喜欢这个。完美运行!
    【解决方案3】:

    如果您使用您的语言用于单词 Received 的字符串来翻译“Received”字符串(即意大利语是 Ricevuti),它会起作用。

    【讨论】:

    • 西班牙语是Recibido :)
    猜你喜欢
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 2011-06-21
    相关资源
    最近更新 更多