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

时间:2015-06-26 12:28:02

标签: windows date batch-file logging cmd

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

"%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

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

这肯定是非常简单但我没有找到任何方法来解决这个问题。非常感谢任何帮助。

谢谢!

4 个答案:

答案 0 :(得分:2)

你的问题是,时间字符串可能包含一个空格(在10点钟之前) 您可以replace it with a zero,但我建议solution independent of locale settings

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

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

答案 2 :(得分:1)

也许最简单的解决方案是

myController

答案 3 :(得分: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 < / strong>目录

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