当我要将要从批处理文件中执行的命令输出(使用命令行参数执行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小时,相同的批处理文件可以正常运行。
在这方面的任何帮助将不胜感激。
谢谢
答案 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 不再成为值的一部分,并且引号也不会成为该值; 因此,将其应用于您的代码意味着:
@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"