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)
Iva*_*van 52
使用stderr(大多数错误都发生在):
cmd /c yourscript.cmd > logall.txt 2>&1
Run Code Online (Sandbox Code Playgroud)
kev*_*rpe 43
为了补充@ user2744787的答案,这里是一个屏幕截图,显示如何cmd在计划任务中使用参数:
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
您可以在要输出的行上写入日志文件,如下所示:
@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)
这样,如果您不想浏览所有内容,可以选择要输出的命令,只需获取您需要查看的内容即可.在>将输出到指定的文件(创建该文件,如果它不存在,如果它覆盖它).在>>将追加到指定的文件(创建该文件,如果它不存在,但追加到,如果它的内容).
cmd.exe命令处理器构建带时间戳的文件名以记录计划任务的输出要在此处建立其他人的答案,可能是您要创建一个输出文件,该文件的日期和/或时间嵌入在文件名中.您可以使用cmd.exe命令处理器为您执行此操作.
注意:此技术采用内部Windows环境变量的字符串输出,并根据字符位置对其进行切片.因此,下面示例中提供的确切值可能不适用于您使用的Windows区域.此外,对于某些区域设置,日期或时间的某些组件可能会在其值小于10时在构造的文件名中引入空格.要缓解此问题,请使用引号括住文件名,以便文件中的任何非预期空格name不会破坏您正在构建的命令行.尝试并找到最适合您情况的方法.
请注意,PowerShell它比功能更强大cmd.exe.它更强大的一种方式是它可以处理不同的Windows区域.但这个答案是关于解决这个问题cmd.exe,不是PowerShell,所以我们继续.
运用 cmd.exe
您可以通过访问日期和时间的不同组件切片内部环境变量%date%和%time%,如下所示(再次,确切的切片值取决于在Windows中配置的区域):
%date:~10,4% %date:~4,2%%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
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)
将所有内容组合在一起,将脚本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
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)
结合其他答案,每个答案都有一些有用的提示,但没有一个能够捕捉到每一个细微差别:
在任务计划程序 > 操作中:
行动: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
如何运行程序并将 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和内部像往常一样使用双引号。另请注意,日期取决于区域设置,此示例使用美国区域设置。