0-9个小时未将当前日期和时间添加到Windows批处理文件的重定向输出文件名中

时间:2018-07-18 06:44:39

标签: batch-file

当我要将要从批处理文件中执行的命令输出(使用命令行参数执行JAR)发送到名称中具有当前日期和时间的文件时,我遇到了问题。

批处理文件的内容如下

    @ECHO OFF


    SET HOUR=%time:~0,2%

    SET dtStamp9=%date:~-4%%date:~4,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% 
    SET dtStamp24=%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%

    if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%)

    echo %dtStamp%

    java -Xmx1024M -jar ..\lib\My.jar JobName Param1>\myfolder\\logs\process_EST.%dtStamp%.log

当我在0到9点之间执行批处理文件时,尽管echo %dtStamp%给出正确的值,例如说20180718_020849,但是JAR执行失败,因为出于某种原因%dtStamp%的值不能在Java命令上正确替换,这会导致.log被视为My.jar的第二个参数。 但是,对于10到23小时,相同的批处理文件可以正常运行。

在这方面的任何帮助将不胜感激。

谢谢

3 个答案:

答案 0 :(得分:1)

我建议您简化整个过程,并使用可靠的日期戳设置方法,该方法不受用户或区域设置的影响:

@Echo Off
Set "dtStamp="
For /F "Tokens=1-6Delims=/: " %%A In ('RoboCopy/NJH /L "\|" Null'
) Do If Not Defined dtStamp Set "dtStamp=%%A%%B%%C_%%D%%E%%F"

然后您可以使用Java%dtStamp%.log命令行放置在其下方,而在一天中的什么时间运行脚本都没有关系!

答案 1 :(得分:0)

您可以将命令存储到变量中,然后CALL将其存储:

SET "exec=java -Xmx1024M -jar ..\lib\My.jar JobName Param1>\myfolder\logs\process_EST.%dtStamp%.log"

CALL %exec%

答案 2 :(得分:0)

在您的行中:

SET dtStamp9=%date:~-4%%date:~4,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% 

有一个尾随的 SPACE ,但在行中:

SET dtStamp24=%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%

没有。

此空间然后导致该行出现问题:

java -Xmx1024M -jar ..\lib\My.jar JobName Param1>\myfolder\\logs\process_EST.%dtStamp%.log

因为.log被视为另一个参数,因为之前有所说的 SPACE

要解决此问题,您当然可以删除 SPACE

但是,您可以采取其他措施来避免此类问题:

  • 使用带引号的set语法,例如set "VAR=Value",因此尾随的 SPACE 不再成为值的一部分,并且引号也不会成为该值;
  • 引用日志文件路径以保护其中包含 SPACE ;

因此,将其应用于您的代码意味着:

@ECHO OFF
SET "HOUR=%time:~0,2%"
SET "dtStamp9=%date:~-4%%date:~4,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2%" 
SET "dtStamp24=%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%"
if "%HOUR:~0,1%" == " " (SET "dtStamp=%dtStamp9%") else (SET "dtStamp=%dtStamp24%")
echo %dtStamp%
java -Xmx1024M -jar "..\lib\My.jar" JobName Param1>"\myfolder\logs\process_EST.%dtStamp%.log"