Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 向日志输出添加时间戳_Batch File - Fatal编程技术网

Batch file 向日志输出添加时间戳

Batch file 向日志输出添加时间戳,batch-file,Batch File,这是我的Windows脚本,每x分钟启动一次: cd C:\ cd Speedtest speedtest.exe -s 18571 -f csv>>Speedtest.log 如何向每个日志行添加时间戳?让我们假设应用程序speedtest在每次执行时只运行一次测试,并输出一行或多行没有空行,并且在每行上,启动此应用程序的当前时间应首先写入CSV文件,并使用,作为列表分隔符(在大多数国家/地区,CSV文件为默认值)。在这种情况下,以下批处理文件可用于此任务: @cd /D "C:

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

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

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

让我们假设应用程序
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
。如果目录不存在,此命令将失败。更改目录失败时的错误消息输出将通过handleSTDERR中的
2>num
重定向(标准错误)到设备NUL以抑制它。如果当前目录可以成功更改为指定目录,CD将不会输出任何内容

操作员
&
仅当CD退出且
0
表示当前目录成功更改,这意味着指定的目录
C:\Speedtest
确实存在时,才会执行FOR的下一个命令

FOR带有选项
/F
和在两个
之间指定的一组
将导致在后台执行另一个命令进程,并附加
%ComSpec%/c
和两个
之间的字符串作为进一步的参数。
因此在安装到
c:\Windows
的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=
I用于定义字符串分隔符的空列表,该列表禁用行拆分行为

FOR默认情况下会忽略第一个子字符串以分号开头的所有行,因为
eol=;
是行尾选项的默认值。如果
speedtest
在开头以分号输出行,则未知。因此,选项
eol=
用于定义行尾字符ter,这意味着除了空行以外的所有行都被完全分配给指定的循环变量
I

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

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

具有文件名
Speedtest.log
的重定向操作符
被指定为左命令ECHO,以100%安全地将该行正确写入文件中,即使以编号
1
9
结尾,也不会留下任何尾随空格。从com中运行此批处理文件时可以看到这一点命令提示窗口,不带三个
@
,其中
cmd.exe
移动了
>“Speedtest.log”
到命令行末尾,在执行命令之前在此字符串左侧插入空格和
1
。在执行命令之前,必须始终考虑Windows command processor处理命令行后的外观,而不是在批处理文件中写入命令行的方式

注意:如果配置的国家是德国、奥地利、瑞士、卢森堡或列支敦士登,时间格式为
HH:mm:ss,ms
和列表分隔符
,则必须在
%time%
%I
之间使用分号而不是逗号,以生成有效的CSV文件。
speedtest
输出希望在本例中也使用
而不是
来输入数据。否则,如果
speedtest
输出的数据与所配置国家/地区的列表分隔符无关,且始终带有逗号,则有必要使用on命令ECHO
%TIME%”,%%I
%TIME:,=.%,%%I
以获取使用逗号作为分隔符的有效值

要了解所使用的命令及其工作方式,请打开一个窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • cd/?
  • echo/?
  • 获取/?