批处理文件中的 ping 时间戳在 -n 完成后不会继续



我的batchfile有问题:

@ECHO OFF
CLS
set ip=192.168.1.1
:lp
set log=C:Elvis-LogLOG_%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-Router上并记录结果。每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可以正常工作。

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

我是批处理编程的新手...并且根本可以编程,我希望有人可以在这里帮助我。谢谢!

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

@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在无限循环中读取时,就像从管道上读取时, set /p无法与

区分开
  • 空/空白行,
  • 一个不检索任何内容(输入流(的读取操作,
  • 输入流的末尾。

这是您的命令未结束的原因,for /l一直在循环,因为它不知道左端的命令何时。

但是您可以添加出口条件,您可以包括

之类的东西
if not "%date%"=="!date!" exit 

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

留下另一个问题,您可以离开循环,但是ping将继续发送数据包,而与cmd无关读取输出。

如果我们首先确定一天结束之前需要发送多少数据包并在发送的数据包中添加一个超时,以避免问题(默认超时为4000ms(

,则可以解决此问题。
@echo off
    setlocal enableextensions disabledelayedexpansion
    set "ip=192.168.1.1"
:lp
    set "log=C:Elvis-LogLOG_%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    

最新更新