Windowsbatch file使用date/时间将输出redirect到日志文件

我想运行一个batch file运行一个可执行文件,并将其输出redirect到一个日志文件。 日志文件必须包含date和时间作为文件名。 这是我正在使用的命令:

"%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中粘贴。 日志文件按预期创build为“2015_06_25__11_20_46.log”。 但是,它在粘贴到batch file时不起作用,然后在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 

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

这当然是非常简单的,但我还没有find任何解决方法。 任何帮助是极大的赞赏。

谢谢!

你的问题是,时间字符串可能包含一个空格(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 

也许最简单的解决方案是这样的 :

 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 

试试像这样:

 @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