我有一个位于远程系统上的脚本。
在C:\ tmp \ hgttg.ps1下的服务器“web12”上:
Write-Host "Don't Panic"
exit 42
我使用Invoke-Command从我的本地框(两个运行v4.0的系统)调用此脚本:
$svr = "web12"
$cmd = "C:\tmp\hgttg.ps1"
$result = Invoke-Command -ComputerName $svr -ScriptBlock {& $using:cmd}
这会在执行时导致以下输出:
> $result = Invoke-Command -ComputerName $svr -ScriptBlock {& $using:cmd}
Don't Panic
> $result
>
($ result未设置,输出直接进入控制台,没有好处!)经过多次网络搜索和故障排除后,我得到了一些改进:
> $result = Invoke-Command -ComputerName $svr -ScriptBlock {& $using:cmd; $LASTEXITCODE}
Don't Panic
> $result
42
>
现在我能够捕获返回代码,但输出仍然直接进入控制台。这是我能得到的。在我已经尝试过的一长串事情中,以下都没有奏效:
这会产生输出:
> $result
code : 42
output :
PSComputerName : web12
RunspaceId : aaa00a00-d1fa-4dd6-123b-aa00a00000000
>
我确信有一些显而易见的东西让我失踪了,但到目前为止我所有的命中都是死路一条。有什么建议?
在PSv4-(版本4.x或更低版本),你根本无法捕获Write-Host
输出 - 它总是直接进入控制台。
在PSv5 +中,Write-Host
(也)写入新引入的信息流,新引入的Write-Information
cmdlet旨在写入;它的数量是6
。
因此,如果您的目标主机运行PSv5 +,您可以使用以下内容;请注意*>
如何通过将(&
)重定向到成功流(1
)来捕获所有输出流,但您可以使用6>
选择性地捕获信息流:
$result = Invoke-Command -ComputerName $svr -ScriptBlock {& $using:cmd *>&1; $LASTEXITCODE}
$output = $result[0..($result.Count-2)]
$exitCode = $result[-1]