任务计划程序:如何在输出文件的命名中使用 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/scriptC:\Windows\System32\cmd.exeAdd arguments (optional)/C RunMyProcess.cmdStart inC:\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。那么您应该知道您的代码在某些情况下无法工作,尤其是考虑到环境变量 MyDatefor 循环上方未明确未定义。因此,如果此变量是在批处理文件之外偶然定义的,则永远不会将当前日期分配给该变量。 感谢 Mofi。

以上是关于任务计划程序:如何在输出文件的命名中使用 cmd 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用任务计划程序启动 cmd.exe 来执行命令?

请问如何解决的?“windows2008 X64下,建立CMD程序的开机运行计划任务不能正常执行. 但直接双击执行”

使用 Windows 任务计划程序打开 cmd 文件时执行但不启动服务器

用于重命名和移动文件的 Python、bat 文件和任务计划程序 - 在 Windows 10 中无法正常工作

使用任务计划程序创建任务以使用命令运行 cmd.exe

powershell中如何执行bat文件