如果任务计划程序正在运行脚本,则如何捕获脚本的输出?


93

使用Windows Server 2008,如何捕获Windows任务计划程序正在运行的脚本的输出?

我正在测试一个相当长的自定义打印批处理脚本,出于调试目的,我希望每晚查看它的所有输出。


2
有时,这将不起作用,即不会生成日志文件。导致这种情况的一种情况是,该任务根本没有启动,因为Windows错误地认为它仍在运行。您可以通过查看任务历史记录来跟踪它(任务属性中的“历史记录”选项卡-信息可能需要几秒钟才能显示出来)
丹尼尔(Daniel

Answers:


82

在Task Scheduler中尝试将其作为命令字符串:

cmd /c yourscript.cmd > logall.txt

2
不错,不需要包装器,效果很好,并且还记录了从任务调度程序触发的bat / cmd调用的子Powershell脚本的输出,谢谢!
Jonesome恢复莫妮卡

8
此外,cmd /c "path with spaces/command.cmd > file.txt"如果有空格,请使用。在2>&1伊万的回答也去了引号内。
Dinei

3
需要使用双引号使我的工作正常:stackoverflow.com/a/6378038/1747983 cmd /c ""C:\temp\My test dir\something 123\myTool.exe" > Tilo_log.txt 2>&1"
Tilo

1
我知道已经过去了5年,但是将其更改为公认的答案,因为它是执行任务的最低限度方法。
Mechaflash

现在,我有一个运行任务时显示的命令窗口。如何预防呢?
克里斯

57

使用stderr(大多数错误将归结到何处):

cmd /c yourscript.cmd > logall.txt 2>&1

56

为了补充@ user2744787的答案,以下是屏幕截图,显示了如何cmd在计划任务中使用自变量:

计划的任务cmd输出到日志文件

程序/脚本: cmd

添加参数: /c run_with_default_port.bat > IMQuantWebServices.log


5
似乎您正在通过计划任务启动服务。如果这应该是在后台持续运行的服务,请查看NSSM作为替代方案。它作为Windows服务运行任何命令,并处理失败等后的重启
。– leemes

43

>>将追加日志文件,而不是每次都覆盖它。该2>&1也将错误发送到你的日志文件。

cmd /c YourProgram.exe >> log.txt 2>&1

39

您可以有一个调用yourscript.cmd的debug.cmd

yourscript.cmd > logall.txt

您计划debug.cmd而不是yourscript.cmd


10

使用cmd.exe命令处理器构建带有时间戳的文件名,以记录计划任务的输出

为了在此基于其他人的答案,可能是您要创建一个输出文件,该文件的日期和/或时间嵌入到文件名中。您可以使用cmd.exe命令处理器为您执行此操作。

注意:此技术采用内部Windows环境变量的字符串输出,并根据字符位置将它们切成薄片。因此,以下示例中提供的确切值可能不适用于您使用的Windows区域。此外,在某些区域设置中,日期或时间的某些组成部分的值小于10时,它们可能会在构造的文件名中引入一个空格。为缓解此问题,请在文件名中加上引号,以使文件中任何非预期的空格名称不会破坏您正在构建的命令行。实验并找到最适合您的情况的方法。

请注意,此PowerShell功能比强大cmd.exe。一种更强大的方法是它可以处理不同的Windows区域。但是这个答案是关于使用cmd.exe而不是解决此问题的PowerShell,所以我们继续。

使用 cmd.exe

您可以通过对内部环境变量进行切片来访问日期和时间的不同组成部分%date%%time%,如下所示(同样,确切的切片值取决于Windows中配置的区域):

  • 年份(4位数字): %date:~10,4%
  • 月(2位数字): %date:~4,2%
  • 天(2位数字): %date:~7,2%
  • 小时(2位数字): %time:~0,2%
  • 分钟(2位数字): %time:~3,2%
  • 秒(2位数字): %time:~6,2%

假设您要使用以下日期/时间格式命名日志文件:“ Log_[yyyyMMdd]_[hhmmss].txt”。您将使用以下内容:

Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt

要对此进行测试,请运行以下命令行:

cmd.exe /c echo "Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"

将所有内容放在一起,以将这两者stdout以及stderr从脚本重定向到以当前日期和时间命名的日志文件,可以使用以下命令作为命令行:

cmd /c YourProgram.cmd > "Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt" 2>&1

请注意,使用文件名两边的引号来处理日期或时间部分可能会引起空格的实例。

就我而言,如果当前日期/时间是10/05/2017 9:05:34 AM,则上述命令行将产生以下内容:

cmd /c YourProgram.cmd > "Log_20171005_ 90534.txt" 2>&1

没有少于10的小时数前导零:/不知道如何解决,但至少要引用文件名
user25064

9

您可以在要输出的行上写入日志文件,如下所示:

@echo off
echo Debugging started >C:\logfile.txt
echo More stuff
echo Debugging stuff >>C:\logfile.txt
echo Hope this helps! >>C:\logfile.txt

这样,如果您不想遍历所有内容,则可以选择要输出的命令,只需获得所需的内容即可。在>将输出到指定的文件(创建该文件,如果它不存在,如果它覆盖它)。在>>将追加到指定的文件(创建该文件,如果它不存在,但追加到,如果它的内容)。


1

示例如何运行程序并使用时间戳将stdout和stderr写入文件:

cmd /c ""C:\Program Files (x86)\program.exe" -param fooo >> "c:\dir space\Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt" 2>&1"

关键部分是用双引号将后面的整个部分cmd /c括起来,在里面使用照常使用双引号。另请注意,日期取决于语言环境,此示例使用美国语言环境。


0

此代码段使用wmic.exe构建日期字符串。不受语言环境设置的干扰

rem DATE as YYYY-MM-DD via WMIC.EXE
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I
set RDATE=%datetime:~0,4%-%datetime:~4,2%-%datetime:~6,2% 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.