从任务计划程序运行时如何重定向PowerShell输出?

cmc*_*nty 38 powershell line-endings scheduled-tasks

从任务计划程序运行简单的PowerShell脚本时,我想将输出重定向到文件.

有一个关于这个题目很长的线程在这里,但其并不清楚,如果他们达到最终的最合适的解决方案.我很感兴趣,如果SO上的任何人也解决了这个问题,以及他们是如何做到的.

cmc*_*nty 34

这是对我有用的命令.我不喜欢在脚本中重定向输出的想法,因为这会使手动运行变得困难.

powershell -windowstyle minimized -c "powershell -c .\myscript.ps1 -verbose >> \\server\myscript.log 2>&1"
Run Code Online (Sandbox Code Playgroud)

  • 你如何为此添加时间戳? (5认同)
  • 这看起来像是从 powershell 中调用 powershell? (5认同)
  • 您可能还想使用-Noninteractive来避免任何提示. (2认同)
  • 是的,就像 @JamieHanrahan 注意到的那样,调用 powershell 两次的目的是什么? (2认同)

小智 31

我使用Transcript功能来帮助解决这个问题.只需将其包含在您的代码中,它就会将所有(可能的)屏幕内容输出到日志文件中.

    Start-Transcript -path $LogFile -append

    <Body of the script>

    Stop-Transcript
Run Code Online (Sandbox Code Playgroud)

  • 我不得不使用Write-Output而不是Write-Host. (6认同)
  • 当我启动命令表单任务计划程序(作为powershell.exe的参数)时,我看到了转录本的不同行为.具体来说,对Write-Host的调用似乎将我的文本发送到成绩单未捕获的某处,尽管重定向到Out-Host似乎有效.我在Windows Server 2012 R2上运行PowerShell 4.0,如果这很重要的话. (4认同)
  • @JayCarlton 你不应该使用写主机而是写输出,因为 powershell 的创建者说:http://www.jsnover.com/blog/2013/12/07/write-host-thinked-harmful/ 说,我还没有测试它是否会对您的日志产生影响,但应该会。 (2认同)

小智 18

以下适用于Windows 7:

 powershell -command c:\temp\pscript.ps1 2>&1 > c:/temp/apickles.log
Run Code Online (Sandbox Code Playgroud)

在win7任务计划程序gui中:

 program = "Powershell"
 arguments = "-command c:\temp\pscript.ps1 2>&1 > c:/temp/apickles.log"
Run Code Online (Sandbox Code Playgroud)

请注意," - file"不起作用,因为文件名后面的所有参数都被解释为文件的参数.请注意,"2>&1"也会将错误输出重定向到日志文件.powershell的更高版本以稍微不同的方式执行此操作.

  • “-Command”的一个缺点是它是被解释的,因此 ps1 文件路径中的空格或任何可解释的内容都会将其变成错误。因此,最好单独设置工作目录,并为“-Command”使用(非特殊字符)文件名。 (2认同)