繁体   English   中英

Windows 批处理文件将输出重定向到带有日期/时间的日志文件

[英]Windows batch file redirect output to logfile with date/time

我正在尝试运行一个批处理文件,该文件运行可执行文件并将其输出重定向到日志文件。 日志文件必须将日期和时间作为文件名。 这是我正在使用的命令:

"%PROGRAMFILES%\PostgreSQL\9.4\bin\vacuumdb.exe" --username postgres --verbose --analyze --all > E:\Logs\VacuumDB\%date:~10,4%_%date:~4,2%_%date:~7,2%_%time:~0,2%_%time:~3,2%_%time:~6,2%.log 2>&1

此命令在直接粘贴到 cmd 中时有效。 日志文件按预期创建为“2015_06_25__11_20_46.log”。 但是,粘贴到批处理文件中,然后在cmd中运行时,它不起作用。 Cmd 对命令的解释如下:

"C:\Program Files\PostgreSQL\9.4\bin\vacuumdb.exe" --username postgres --verbose --analyze --all  8_21_42.log  1>E:\Logs\VacuumDB\2015_06_26_ 2>&1

注意文件名是如何被截断的,时间现在附加到命令参数而不是文件名中。 所以显然命令失败了。

这肯定是非常简单的事情,但我还没有找到任何方法来解决这个问题。 任何帮助是极大的赞赏。

谢谢!

这是一个不使用 SET 命令的内联版本

C:\test.bat > C:\log\test_%date:~10%%date:~4,2%%date:~7,2%-%time:~0,2%%time:~3,2%%time:~6,2%.log 2>&1

此示例将从C:\\test.bat获取输出并将名为test_YYYYMMDD-HHMMSS.log的日志写入C:\\log目录

输出文件示例: c:\\log\\test_20181008-1121.log

您的问题是,时间字符串可能包含空格(10 点钟之前)您可以将其替换为零,但我建议使用独立于语言环境设置解决方案

for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I

它将为您提供(独立于语言环境设置!):

  20130802203023.304000+120 
( YYYYMMDDhhmmss.<fraction>+/-<timedifference to UTC>  )

从这里,很容易将其格式化为您的需要。 例如:

set datetime=%datetime:~0,8%-%datetime:~8,6%
20130802-203023

像这样尝试:

@echo off
set hour=%time:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
echo hour=%hour%
set min=%time:~3,2%
if "%min:~0,1%" == " " set min=0%min:~1,1%
echo min=%min%
set secs=%time:~6,2%
if "%secs:~0,1%" == " " set secs=0%secs:~1,1%
echo secs=%secs%

set year=%date:~-4%
echo year=%year%
set month=%date:~3,2%
if "%month:~0,1%" == " " set month=0%month:~1,1%
echo month=%month%
set day=%date:~0,2%
if "%day:~0,1%" == " " set day=0%day:~1,1%
echo day=%day%
Set MaDate=%day%/%month%/%year%
Set MyTime=%hour%:%min%:%secs%
echo %MaDate%
echo %MyTime%
set DateTimeFile=%year%_%month%_%day%_%hour%_%min%_%secs%.log
echo DateTimeFile=%DateTimeFile%
pause

或者我从foxidrive得到了另一个解决方案:

::From foxidrive
@echo off
for /f "delims=" %%a in ('wmic OS Get localdatetime  ^| find "."') do set dt=%%a
set datestamp=%dt:~0,8%
set timestamp=%dt:~8,6%
set YYYY=%dt:~0,4%
set MM=%dt:~4,2%
set DD=%dt:~6,2%
set HH=%dt:~8,2%
set Min=%dt:~10,2%
set Sec=%dt:~12,2%
set stamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%
echo stamp: "%stamp%"
echo datestamp: "%datestamp%"
echo timestamp: "%timestamp%"
pause

或许你最简单的办法是这一个

set "dat=%date: =0%"
set "tim=%time: =0%"
"%PROGRAMFILES%\PostgreSQL\9.4\bin\vacuumdb.exe" --username postgres --verbose --analyze --all > E:\Logs\VacuumDB\%dat:~10,4%_%dat:~4,2%_%dat:~7,2%_%tim:~0,2%_%tim:~3,2%_%tim:~6,2%.log 2>&1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM