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

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

我正在testing一个相当长的自定义打印批处理脚本,为了debugging的目的,我希望每天晚上都能看到它的所有输出。

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

yourscript.cmd > logall.txt 

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

试试这个作为任务计划程序中的命令string:

 cmd /c yourscript.cmd > logall.txt 

用stderr(大部分的错误去):

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

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

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

要补充@ user2744787的答案,下面是一个屏幕截图,显示如何在计划任务中使用cmd和参数:

在这里输入图像说明

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

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

通过这种方式,您可以select要输出的命令,如果您不想浏览所有内容,只需要获取所需的内容即可。 >将输出到指定的文件(创build文件,如果不存在,覆盖它,如果它)。 >>将追加到指定的文件(创build文件,如果它不存在,但如果它附加到内容)。

要在这里build立在他人的答案之上,可能是您要创build的输出文件具有embedded输出文件名称中的date或时间。 用CMD.exe这个可以实现如下。 请注意,此技术将内部Windows环境variables的string输出视为string,并根据字符位置对其进行切片,因此对于您使用的Windows区域可能不正确。 这种技术仅限于处理单个Windows区域。 例如,由于每个地区的date和/或时间格式不同,对美国有用的东西可能会在英国失败。 PowerShellfunction更强大,它可以处理不同的Windows区域, PowerShell可以调用CMD.exe来运行.cmd文件,但这不在本答案的范围之内。

使用CMD.EXE

您可以通过分内部环境variables%date%%time%来访问date和时间的不同组件,如下所示(同样,确切的切片值取决于在Windows中configuration的区域):

  • 年份: %date:~10,4%
  • 月份: %date:~4,2%
  • date: %date:~7,2%
  • 小时: %time:~0,2%
  • 分钟: %time:~3,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 

要testing这个,运行下面的命令行:

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

综合起来,要将stdout和stderr从脚本redirect到一个以当前date和时间命名的日志文件,请使用以下内容作为命令行:

 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 

编辑

正如@ user25064指出的那样,有时候在中午之前可能出现的时间在小时部分有一个前导空间。 因此,文件名应该用引号括起来以防止空间跳过命令处理器,如下所示:

 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