首页 > 解决方案 > 将时间戳添加到日志输出

问题描述

这是我的 Windows 脚本,每 x 分钟启动一次:

cd C:\
cd Speedtest
speedtest.exe -s 18571 -f csv>>Speedtest.log

如何为每个日志行添加时间戳?

标签: batch-file

解决方案


让我们假设应用程序speedtest在每次执行时只运行一个测试运行并输出一行或多行而没有空行,并且在每一行上,应首先将启动此应用程序的当前时间写入 CSV 文件,并,作为列表分隔符(大多数国家/地区的默认设置)对于 CSV 文件)。在这种情况下,以下批处理文件可用于此任务:

@cd /D "C:\Speedtest" 2>nul && @for /F delims^=^ eol^= %%I in ('speedtest.exe -s 18571 -f csv') do >>"Speedtest.log" @echo %TIME%,%%I

第一个命令CD将当前目录更改为C:\Speedtest. 如果目录不存在,此命令将失败。更改目录失败时的错误消息输出2>nul从句柄STDERR(标准错误)重定向到设备NUL以抑制它。如果当前目录可以成功切换到指定目录, CD没有任何输出。

仅当CD退出并指示当前目录成功更改(这意味着指定的目录确实存在)时,运算符才会&&执行下一个命令FOR 。0C:\Speedtest

带有选项的FOR/F和在两个之间指定的集合'导致在后台执行另一个命令进程,%ComSpec% /c并且两个之间的字符串'作为进一步的参数附加。因此在安装到的 Windows 上执行C:\Windows

C:\Windows\System32\cmd.exe /c speedtest.exe -s 18571 -f csv

启动的 Windows 命令进程speedtest.exe使用四个指定的参数执行,然后由于选项而自行关闭/c

FOR捕获所有写入以处理STDOUT(标准输出)的输出,并在启动后cmd.exe自行终止处理它。

FOR在处理捕获的行时忽略所有空行。

默认情况下, FOR将使用普通空格和水平制表符作为字符串分隔符将每行拆分为子字符串,并将仅将非空行的第一个空格/制表符分隔的字符串分配给指定的循环变量I。这里不需要这种字符串拆分行为。出于这个原因,选项delims=用于定义一个空的字符串分隔符列表,该列表禁用行拆分行为。

FOR将默认忽略所有第一个子字符串以分号开头的行,因为eol=;它是行尾选项的默认值。不知道是否speedtest输出以分号开头的行。出于这个原因,该选项eol=用于定义无行尾字符,这意味着除了空行之外的所有行都完全分配给指定的循环变量I

这两个选项通常在双引号参数字符串delims=eol=指定,以获取两个等号和之间的空格字符,它们被解释为文字字符,而不是 Windows 命令处理器的参数分隔符。但"delims= eol="不能在这里使用,因为在这种情况下FOR将解释"为行尾字符。因此,这两个选项必须在没有的情况下写入,"这需要转义两个等号和空格字符,^以便被 Windows 命令处理器解释为文字字符而不是参数分隔符。

Windows 命令处理器在执行命令CD之前解析整行,并在此解析过程中替换%TIME%为本地时间的当前值,格式由为用于运行此批处理文件的帐户配置的国家/地区定义。因此,写入 CSV 文件的时间是cmd.exe在执行命令CD之前解析整个命令行的时间,然后是其他命令和可执行文件成功时的时间。

>>带有文件名的重定向运算符Speedtest.log被指定为命令ECHO1 100% 安全,即使以数字to结尾,该行也可以正确写入文件而没有尾随空格9。可以在命令提示符窗口中运行此批处理文件时看到,没有移动到命令行末尾的三个@,在该字符串的左侧插入一个空格并在执行命令CD之前。必须始终考虑命令行在执行命令之前由 Windows 命令处理器处理后的外观,而不是它在批处理文件中的写入方式。cmd.exe>>"Speedtest.log"1

注意:如果配置的国家是德国、奥地利、瑞士、卢森堡或列支敦士登,具有时间格式HH:mm:ss,ms和列表分隔符;,则必须使用分号而不是逗号%TIME%%%I生成有效的 CSV 文件。speedtest在这种情况下也希望输出数据;而不是,. 否则,如果speedtest在配置的国家/地区的列表分隔符上始终使用逗号输出数据,则有必要使用命令ECHO"%TIME%",%%I使用逗号作为分隔符%TIME:,=.%,%%I获取有效的CSV 文件。

要了解使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • cd /?
  • echo /?
  • for /?
  • set /?

也可以看看:


推荐阅读