任务计划程序:如何在输出文件的命名中使用 cmd 脚本?
Posted
技术标签:
【中文标题】任务计划程序:如何在输出文件的命名中使用 cmd 脚本?【英文标题】:Task Scheduler: How to use a cmd script in the naming of the output file? 【发布时间】:2020-12-01 18:58:33 【问题描述】:我有一个 c:\myapp
文件夹,其中包含 MyProcess.exe
文件。我也有c:\myapplog
文件夹。
我在c:\myapp
文件夹中有一个名为GetSuffix.cmd
的cmd 批处理文件,它计算一个值,然后在最后回显该值。返回值的长度为 8 个字符。
@echo off
rem logic to set suffixV variable
echo %suffixV%
我想安排MyProcess.exe
文件在每天的特定时间运行。我想将其输出写入c:\myapplog
文件夹中作为MyProcess_XXXXXXXX.log
文件,其中XXXXXXXX 是一个字符串,其值需要来自GetSuffix.cmd
文件。
所以在任务计划程序中,我为此目的创建了一个任务。在此任务的启动程序中,我提到:
程序/脚本:cmd 添加参数(可选):/c MyProcess.exe > c:\myapplog\MyProcess_GetSuffix.cmd.log 开始(可选):c:\myapp
我运行了任务,它运行成功,但它在c:\myapplog
文件夹中创建了MyProcess_GetSuffix.cmd.log
文件。 GetSuffix.cmd
未评估。我该怎么做?
示例
例如,c:\myapp
文件夹中名为 GetSuffix.cmd
的 cmd 批处理文件包含以下行:
@echo off
for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined MyDate set MyDate=%%x
set suffixV=%MyDate:~0,4%%MyDate:~4,2%%MyDate:~6,2%
echo %suffixV%
所以今天如果我从 cmd 调用 GetSuffix.cmd
,它将返回 20200812。
所以今天我希望我的任务以这种方式运行:
cmd /c MyProcess.exe > c:\myapplog\MyProcess_20200812.log
明天如果我从 cmd 调用 GetSuffix.cmd
,它将返回 20200813。
所以明天我希望我的任务以这种方式运行:
cmd /c MyProcess.exe > c:\myapplog\MyProcess_20200813.log
我该怎么做?
【问题讨论】:
好像你想要你的输出,"%~dp0..\myapplog\%~n0.log"
无法在日志文件名中指定由cmd.exe
执行的批处理文件名,并期望cmd.exe
检测到日志文件名中的批处理文件名,执行批处理文件,并将日志文件名中的批处理文件名替换为批处理文件的输出。
解决方法如下。使用 Program/script 为 C:\Windows\System32\cmd.exe
和 Add arguments (optional) 为 /C RunMyProcess.cmd
和 Start in 为 C:\myapp
配置计划任务.批处理文件RunMyProcess.cmd
只需要一行:@for /F "tokens=1-3 delims=/: " %%I in ('%SystemRoot%\System32\robocopy.exe "%SystemDrive%\|" . /NJH') do @MyProcess.exe >C:\myapplog\MyProcess_%%I%%J%%K.log & exit /B
。因此,批处理文件从robocopy.exe
输出的错误消息中获取当前年、月和日,并运行MyProcess.exe
,并将输出重定向到日志文件中。
批处理文件RunMyProcess.cmd
必须也在目录C:\myapp
中。有关如何使用robocopy
获取与区域无关的当前日期以在日志文件名中使用的说明,请阅读 Compo 或我在 Time is set incorrectly after midnight 上的回答,其中详细解释了此解决方案。带有选项/B
的命令exit
导致在处理robocopy.exe
的第一行输出并运行MyProcess.exe
后退出批处理文件RunMyProcess.cmd
的执行。
【参考方案1】:
我会说,创建一个运行“run.cmd”的计划任务。将getsuffix改为
@echo off
for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined MyDate set MyDate=%%x
set suffixV=%MyDate:~0,4%%MyDate:~4,2%%MyDate:~6,2%
// OUTPUTS TO A FILE FOR FUTURE USE
echo %suffixV% > suffix.temp
// PRINTS SUFFIX VARIABLE
echo %suffixV%
// EXITS
exit
然后,将其用于 run.cmd:
@echo off
// WILL GET SUFFIX NUMBER
getsuffix.cmd
// SETS SUFFIX NUMBER AS VARIABLE
set /p suffix=<suffix.temp
// USES VARIABLE TO NAME FILE
cmd /c myprocess.exe > c:\myapplog\MyProcess_%suffix%.log
// DELETES THE EXTRA FILE
del suffix.temp
// EXITS
exit
或者,您可以将getsuffix.bat代码复制粘贴到计划任务中,使其成为一个文件。
希望这就是您想要的。
【讨论】:
我建议阅读我在Time is set incorrectly after midnight 和下一个Batch file datetime windows settings 的回答中写的关于wmic
的内容,以及这个问题下面的cmets。那么您应该知道您的代码在某些情况下无法工作,尤其是考虑到环境变量 MyDate
在 for
循环上方未明确未定义。因此,如果此变量是在批处理文件之外偶然定义的,则永远不会将当前日期分配给该变量。
感谢 Mofi。以上是关于任务计划程序:如何在输出文件的命名中使用 cmd 脚本?的主要内容,如果未能解决你的问题,请参考以下文章
请问如何解决的?“windows2008 X64下,建立CMD程序的开机运行计划任务不能正常执行. 但直接双击执行”
使用 Windows 任务计划程序打开 cmd 文件时执行但不启动服务器