我正在使用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参数的解析行为是合理的,但令人讨厌的限制。
谢谢, ==马特
答案 0 :(得分:0)
正如我在对问题的评论中所指出的,这显然是由于SCCM的任务序列引擎的特殊性,这在某种程度上导致cmd /c powershell.exe
与powershell.exe
的解释不同。
添加cmd /c
解决了>
被解释为-file参数输入而不是流重定向操作符的问题。
实际上,我重新发现我确实使用如下语法:
powershell.exe -executionpolicy bypass -file "w:\scripts\script.ps1" -param1 "%param1%" -param2 "%param2%" > "%logfile" 2>&1
成功地在任务序列引擎之外,在其他Powershell脚本和批处理脚本中使用,因此这不是Powershell或命令行解释器问题。