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

Mec*_*ash 81 batch-file scheduled-tasks capture

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

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

小智 71

尝试将此作为任务计划程序中的命令字符串:

cmd /c yourscript.cmd > logall.txt
Run Code Online (Sandbox Code Playgroud)

  • 另外,如果你有空格,请使用带有spaces/command.cmd> file.txt"`的`cmd/c'路径.来自[Ivan的回答](/sf/answers/1666574871/)的`2>&1`也在引号内. (5认同)
  • 很好,不需要包装,效果很好,还记录从任务调度程序触发的bat/cmd调用的子PowerShell脚本的输出谢谢! (2认同)
  • 需要使用双引号使我的工作正常:/sf/answers/446462691/`cmd / c“” C:\ temp \ My test dir \ something 123 \ myTool.exe“> Tilo_log.txt 2>&1“` (2认同)

Iva*_*van 52

使用stderr(大多数错误都发生在):

cmd /c yourscript.cmd > logall.txt 2>&1
Run Code Online (Sandbox Code Playgroud)


kev*_*rpe 43

为了补充@ user2744787的答案,这里是一个屏幕截图,显示如何cmd在计划任务中使用参数:

在此输入图像描述

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

Whi*_*ger 39

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

cmd /c YourProgram.exe >> log.txt 2>&1
Run Code Online (Sandbox Code Playgroud)


ren*_*ene 38

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

yourscript.cmd > logall.txt
Run Code Online (Sandbox Code Playgroud)

你安排debug.cmd而不是yourscript.cmd


Bal*_*i C 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
Run Code Online (Sandbox Code Playgroud)

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


STL*_*Dev 8

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

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

注意:此技术采用内部Windows环境变量的字符串输出,并根据字符位置对其进行切片.因此,下面示例中提供的确切值可能不适用于您使用的Windows区域.此外,对于某些区域设置,日期或时间的某些组件可能会在其值小于10时在构造的文件名中引入空格.要缓解此问题,请使用引号括住文件名,以便文件中的任何非预期空格name不会破坏您正在构建的命令行.尝试并找到最适合您情况的方法.

请注意,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
Run Code Online (Sandbox Code Playgroud)

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

cmd.exe /c echo "Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"
Run Code Online (Sandbox Code Playgroud)

将所有内容组合在一起,将脚本stdoutstderr脚本重定向到以当前日期和时间命名的日志文件,使用可能会使用以下命令行:

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
Run Code Online (Sandbox Code Playgroud)

请注意,在文件名周围使用引号来处理实例,日期或时间组件可能会引入空格字符.

在我的情况下,如果当前日期/时间是10/05/2017 9:05:34 AM,上面的命令行将产生以下内容:

cmd /c YourProgram.cmd > "Log_20171005_ 90534.txt" 2>&1
Run Code Online (Sandbox Code Playgroud)


wis*_*cky 8

结合其他答案,每个答案都有一些有用的提示,但没有一个能够捕捉到每一个细微差别:

在任务计划程序 > 操作中:

行动:Start a program

程序/脚本:cmd

添加参数:/c ""C:\my path\my task.cmd" >> "C:\my path\my task.log" 2>&1"

上面的示例演示了这些功能:

  • 路径/文件名中允许有空格。如果路径中没有空格,则可以消除嵌套引号:/c "C:\path\task.cmd >> C:\path\task.log 2>&1"

  • 附加到日志。如果你想每次都覆盖日志,那么使用>而不是>>

  • 在日志中包含 STDOUT 和 STDERR。如果您只想要 STDOUT,则删除2>&1


Dav*_*kal 5

如何运行程序并将 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"
Run Code Online (Sandbox Code Playgroud)

关键部分是双引号整个部分后面cmd /c和内部像往常一样使用双引号。另请注意,日期取决于区域设置,此示例使用美国区域设置。