如何捕获远程Invoke-Command执行脚本的Write-Host输出与退出码
捕获远程PowerShell脚本的Write-Host输出与退出码
我来帮你搞定这个问题!你遇到的情况其实是PowerShell v4里两个默认行为导致的:
- Write-Host的输出不进入返回值:在PowerShell v4中,
Write-Host是直接把内容输出到主机控制台,而非通过管道传递。所以Invoke-Command的返回值$result不会包含这部分内容——不过你能在本地控制台看到它,是因为远程会话会把主机输出转发回来。 - 脚本退出码不会自动返回:远程脚本里的
exit 42只会设置远程会话的$LASTEXITCODE变量,但这个变量不会被Invoke-Command自动带回本地,必须手动捕获并返回。
解决方案
修改你的Invoke-Command脚本块,同时捕获脚本的所有输出(包括Write-Host)和退出码,再打包成一个自定义对象返回:
$svr = "web12" $cmd = "C:\tmp\hgttg.ps1" $result = Invoke-Command -ComputerName $svr -ScriptBlock { # 捕获脚本的所有输出流(包含Write-Host的内容) $scriptOutput = & $using:cmd *>&1 # 捕获脚本执行后的退出码 $scriptExitCode = $LASTEXITCODE # 返回包含输出和退出码的结构化对象 [PSCustomObject]@{ Output = $scriptOutput ExitCode = $scriptExitCode } }
如何访问结果
执行完上述代码后,你可以这样获取需要的内容:
- 查看
Write-Host的输出:$result.Output(会返回Don't Panic) - 获取脚本的退出码:
$result.ExitCode(会返回42)
关键细节说明
*>&1:这个重定向操作符会把所有输出流(包括Write-Host使用的主机流)转到标准输出流,这样我们就能用变量捕获到原本只显示在控制台的内容。$LASTEXITCODE:PowerShell会用这个变量保存最后一个执行的脚本/可执行文件的退出码,脚本里的exit 42会直接赋值给它。[PSCustomObject]:用它把输出和退出码打包成结构化对象,方便本地统一处理这两个结果。
内容的提问来源于stack exchange,提问作者Derek_6424246
相关产品推荐
相关产品推荐

