使用-File参数调用powershell.exe时如何重定向错误流

时间:2019-01-25 07:36:05

标签: powershell io-redirection sccm

我正在使用SCCM在OS部署任务序列中执行Powershell脚本。由于这个生态系统的特质,我不得不使用这样的语法来调用脚本(根据我的实验):

powershell.exe -executionpolicy bypass -file "w:\scripts\script.ps1" -param1 "%param1%" -param2 "%param2%"

这很好,但是我想捕获它的输出以及它抛出的任何错误消息。通常我会做类似的事情:

powershell.exe -executionpolicy bypass -file "w:\scripts\script.ps1" -param1 "%param1%" -param2 "%param2%" > "%logfile" 2>&1

但是,根据文档,-file参数必须是最后一个参数,并且由于试图将“>”解释为参数,因此上述内容会触发错误。

显然我不能使用:

powershell.exe -executionpolicy bypass -file "w:\scripts\script.ps1" -param1 "%param1%" -param2 "%param2%" | out-file "%logfile"

因为这是一个命令行引擎,所以即使未将管道解释为参数,输出文件也将解释为可执行文件,而不是cmdlet。即使这样行​​之有效,文件外文件也无法捕获错误流。

我唯一的选择是在脚本内将脚本的内部日志输出到文件/脚本吗?我觉得应该有一种方法可以通过可执行调用来完成所有这些工作。 -file参数的解析行为是合理的,但令人讨厌的限制。

谢谢, ==马特

1 个答案:

答案 0 :(得分:0)

正如我在对问题的评论中所指出的,这显然是由于SCCM的任务序列引擎的特殊性,这在某种程度上导致cmd /c powershell.exepowershell.exe的解释不同。

添加cmd /c解决了>被解释为-file参数输入而不是流重定向操作符的问题。

实际上,我重新发现我确实使用如下语法: powershell.exe -executionpolicy bypass -file "w:\scripts\script.ps1" -param1 "%param1%" -param2 "%param2%" > "%logfile" 2>&1 成功地在任务序列引擎之外,在其他Powershell脚本和批处理脚本中使用,因此这不是Powershell或命令行解释器问题。

相关问题