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

时间:2011-12-28 22:29:11

标签: batch-file scheduled-tasks capture

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

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

9 个答案:

答案 0 :(得分:68)

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

cmd /c yourscript.cmd > logall.txt

答案 1 :(得分:46)

使用stderr(大多数错误发生的地方):

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

答案 2 :(得分:37)

您可以使用调用yourscript.cmd

的debug.cmd
yourscript.cmd > logall.txt

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

答案 3 :(得分:36)

要补充@ user2744787的答案,这是一个屏幕截图,显示如何在计划任务中使用var counttopercentagec1event = [0, 1, 2, 3, 4, 5]; var counttopercentagec2event = [2, 33, 22, 32, 43, 52]; var counttopercentagec3event = [7, 17, 72, 37, 47, 51]; function wconclusiontable() { var wtable = document.getElementById("wconclusiontable"); var row; row += "<thead><tr><th>" + "Event #" + "</th>"; row += "<th>" + "Low" + "</th>"; row += "<th>" + "Medium" + "</th>"; row += "<th>" + "High" + "</th>"; row += "</tr></thead>"; for (var i = 2; i < 5; i++) { row += "<tbody><tr><td>" + (i-1) + "</td>"; row += "<td>" + counttopercentagec1event[i-1] + "%" + "</td>"; row += "<td>" + counttopercentagec2event[i-1] + "%" + "</td>"; row += "<td>" + counttopercentagec3event[i-1] + "%" + "</td>"; row += "</tr></tbody>"; } wtable.innerHTML = row; } wconclusiontable(); 参数:

enter image description here

答案 4 :(得分:33)

>>将附加日志文件,而不是每次都覆盖它。 2>&1也会向您的日志文件发送错误。

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

答案 5 :(得分:8)

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

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

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

请注意PowerShellcmd.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"

总而言之,要将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

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

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

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

答案 6 :(得分:7)

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

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

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

答案 7 :(得分:0)

示例如何运行程序并使用时间戳将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后面用双引号将所有部分引起来,并且在其中使用照常使用双引号。另外请注意,日期取决于语言环境,此示例使用美国语言环境。

答案 8 :(得分: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%