如果脚本正在被任务调度程序运行,如何捕获脚本的输出?
使用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和/或时间格式不同,对美国有用的东西可能会在英国失败。 PowerShell
function更强大,它可以处理不同的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