【问题标题】:Ping-Timestamp in Batchfile won't proceed after -n is finished-n 完成后,批处理文件中的 Ping-Timestamp 将不会继续
【发布时间】:2026-02-15 12:25:01
【问题描述】:

我的批处理文件有问题:

@ECHO OFF
CLS
set ip=192.168.1.1
:lp
set log=C:\Elvis-Log\LOG_%date:~-10,2%.%date:~-7,2%.%date:~-4,4%_%time:~0,2%.%time:~3,2%.%time:~6,2%.txt
ECHO New Log
ECHO Elvis-Server Ping-Test auf %ip% - IPR/S Linie 5.5 >> %log%
ECHO. >> %log%
echo %date:~0% - %time:~0,8% Uhr >> %log%
ping -n 86400  %ip%|cmd /q /v /c "(pause&pause)>nul & for /l %%a in () do (set /p "data=" && echo(!time! !data!)&ping -n 2 %ip%>nul" >> %log% 
ECHO. >> %log%
GOTO lp

我有一个服务器用于我的 knx 可视化系统“Elvis”。 现在我想不断地 ping 我的一个 IP 路由器并记录结果。 每 24 小时应创建一个新的日志文件,名称为实际日期和时间。 日志文件的创建工作正常。

现在我想要每个 ping 的时间戳,这样我就可以准确判断网络何时超时。

ping -n 86400  %ip%|cmd /q /v /c "(pause&pause)>nul & for /l %%a in () do (set /p "data=" && echo(!time! !data!)&ping -n 2 %ip%>nul" >> %log% 
ECHO. >> %log%

这应该可以完成这项工作,但在 -n 到期后它只是停止记录但不会创建新的日志文件。 没有时间戳的简单 ping 就可以了。

如果可能我不想使用外部软件。

我对批处理编程还是很陌生……而且完全是编程,我希望有人可以在这里帮助我。谢谢!

【问题讨论】:

    标签: batch-file timestamp ping


    【解决方案1】:

    如果您只需要连接状态改变的时间,您应该让脚本为您完成工作,而不是手动检查一个大文件。

    @echo off
    set ip=www.google.com
    setlocal enabledelayedexpansion
    set oldstatus=unknown
    :loop
    ping -n 1 -w 500 %ip% |find "TTL" >nul && set "status=online" || set "status=offline"
    if not %oldstatus%==%status% (
      echo %time:~0,8%: went %status%
      set "oldstatus=%status%"
    )
    goto :loop
    

    这仅在状态发生变化时给出输出。

    【讨论】:

    • ping -n 86400 表示 60*60*24,一整天。我会为此制定一个时间表,我更喜欢你对状态变化的看法,但我最终会在 timeout -t 59 后面加上 >Nul
    • @LotPings:是的,通常timeout 是个好主意。取决于需要什么分辨率。一分钟的分辨率可能会隐藏大多数中断。原始脚本设计为每 24 小时生成一个新的日志文件。由于我的建议产生的数据很多,因此可能不需要这样做。您还可以使用pings /w 参数“微调”分辨率。是的,如果这应该运行数天甚至数周,计划任务肯定会有所帮助(也有助于定期生成新的日志文件)
    【解决方案2】:

    您发布的代码使用一种方法来生成具有严重限制的时间戳:作为一个单行代码,因为它打算从命令行使用。

    这导致在无限循环中读取无限 ping,因为从管道读取时 set /p 无法区分

    • 空行,
    • 不检索任何内容的读取操作(输入流为空),
    • 输入流结束。

    这就是你的命令没有结束的原因,for /l 一直在循环,因为它不知道左边的命令什么时候结束。

    但是你可以添加一个退出条件,你可以包含类似的东西

    if not "%date%"=="!date!" exit 
    

    也就是说,如果%date% 值(在解析命令时,作为%var% 的值引用被扩展一次)与当前!date! 值不匹配(每次命令被扩展时,!var! 引用的值都被扩展)执行),离开循环(管道内的命令在单独的cmd实例中运行,我们离开实例)

    这留下另一个问题,您可以离开循环,但ping 将继续发送数据包,独立于cmd 读取输出。

    如果我们首先确定在一天结束之前需要发送多少个数据包,并在发送的数据包中添加超时以避免数据包丢失时出现问题(默认超时为 4000 毫秒),则可以解决此问题

    @echo off
        setlocal enableextensions disabledelayedexpansion
    
        set "ip=192.168.1.1"
    
    :lp
        set "log=C:\Elvis-Log\LOG_%date:~-10,2%.%date:~-7,2%.%date:~-4,4%_%time:~0,2%.%time:~3,2%.%time:~6,2%.txt"
        set /a "nPings= 86401 - (%time:~0,2% * 3600 + %time:~3,2% * 60 + %time:~6,2%)"
    
        >>"%log%" (
            ECHO Elvis-Server Ping-Test auf %ip% - IPR/S Linie 5.5
            ECHO(
            echo %date:~0% - %time:~0,8% Uhr
            ping -w 1000 -n %nPings%  %ip% | cmd  /v /q /c "(pause&pause)>nul & for /l %%a in () do (set /p "data=" && echo(!time! !data!) & ping -n 2 "" >nul & if not "%date%"=="!date!" exit " 
            echo(
        )
    GOTO lp    
    

    【讨论】:

    • 非常感谢,您的代码就像一个魅力!也非常翔实的解释!