-n完成后,批处理文件中的Ping-Timestamp将不会继续

时间:2017-05-04 14:03:05

标签: batch-file timestamp ping

我的批处理文件有问题:

@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 Programming ...和编程都很陌生,我希望有人可以帮助我。谢谢!

2 个答案:

答案 0 :(得分: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

仅在状态发生变化时才提供输出。

答案 1 :(得分:0)

您发布的代码使用一种方法来生成严格限制的时间戳:成为一个单行程序,因为它是从命令行使用的。

这导致在无限循环中读取无限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