Der*_*246 3 powershell exit-code powershell-remoting powershell-4.0 write-host
我有一个位于远程系统上的脚本。
在服务器“web12”上的 C:\tmp\hgttg.ps1 下:
Write-Host "Don't Panic"
exit 42
Run Code Online (Sandbox Code Playgroud)
我使用 Invoke-Command 从本地机器(两个系统都运行 v4.0)调用此脚本:
$svr = "web12"
$cmd = "C:\tmp\hgttg.ps1"
$result = Invoke-Command -ComputerName $svr -ScriptBlock {& $using:cmd}
Run Code Online (Sandbox Code Playgroud)
执行时会产生以下输出:
> $result = Invoke-Command -ComputerName $svr -ScriptBlock {& $using:cmd}
Don't Panic
> $result
>
Run Code Online (Sandbox Code Playgroud)
($result未设置,输出直接到控制台,不好!)经过大量的网络搜索和故障排除,我得到了一些改进:
> $result = Invoke-Command -ComputerName $svr -ScriptBlock {& $using:cmd; $LASTEXITCODE}
Don't Panic
> $result
42
>
Run Code Online (Sandbox Code Playgroud)
现在我可以捕获返回代码,但输出仍然直接发送到控制台。这是我所能得到的。在我已经尝试过的一长串事情中,以下任何一项都不起作用:
这会产生输出:
> $result
code : 42
output :
PSComputerName : web12
RunspaceId : aaa00a00-d1fa-4dd6-123b-aa00a00000000
>
Run Code Online (Sandbox Code Playgroud)
尝试在内部和外部命令末尾使用“4>&1”和“*>&1”进行上述两次迭代,没有变化。
尝试了以下各项:
(丢弃返回码只是为了获得输出)同样,没有变化。
还尝试: '& $using:cmd >> C:\tmp\output.log; $最后的代码'。生成的文件是空的,文本仍然输出到本地终端。
我确信我错过了一些明显的东西,但到目前为止我遇到的都是死胡同。有什么建议么?
在PSv4(版本 4.x 或更低版本)上,您根本无法捕获Write-Host输出- 它总是直接进入控制台。
在PSv5+ 中,Write-Host(也)写入新引入的Write-Informationcmdlet 旨在写入的新引入的信息流;它的编号是6。
因此,如果您的目标主机运行 PSv5+,您可以使用以下命令;请注意如何通过将所有输出流重定向 ( ) 到成功流 ( ) 来*>捕获所有输出流,但您可以使用它来有选择地捕获信息流):&16>
$result = Invoke-Command -ComputerName $svr -ScriptBlock {& $using:cmd *>&1; $LASTEXITCODE}
$output = $result[0..($result.Count-2)]
$exitCode = $result[-1]
Run Code Online (Sandbox Code Playgroud)