从远程系统上的Invoke-Command捕获Write-Host输出和退出代码

时间:2018-03-27 23:56:44

标签: powershell powershell-v4.0 powershell-remoting exit-code write-host

我的脚本位于远程系统上。

在服务器" web12"在C:\ tmp \ hgttg.ps1下:

 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
>

现在我能够捕获返回代码,但输出仍然直接进入控制台。这是我能得到的。在我已经尝试过的一长串事情中,以下都没有奏效:

  • 而不是'&'使用' Invoke-Expression' with -OutVariable out; New-Object -TypeName PSCustomObject -Property @ {code = $ LASTEXITCODE;输出= $出}

这会产生输出:

> $result
code           : 42
output         : 
PSComputerName : web12
RunspaceId     : aaa00a00-d1fa-4dd6-123b-aa00a00000000
> 
  • 尝试使用' 4>& 1'进行上述两次迭代。和' *>& 1'在内部和外部命令的末尾,没有变化。

  • 尝试了以下各项:

    1. "&安培; $ using:cmd | Tee-Object -Variable out; $出来"
    2. "&安培; $ using:cmd> $ out; $出来"
    3. " $ out =& $使用:在cmd; $出来"
    4. (丢弃返回代码只是为了获得输出)再次,没有变化。

    5. 还试图:'& $ using:cmd>> C:\ TMP \ output.log; $ LASTEXITCODE&#39 ;.生成的文件为空,文本仍然输出到本地终端。

我确信有一些显而易见的东西我不知道,但到目前为止我所有的命中都是死路一条。有什么建议吗?

1 个答案:

答案 0 :(得分:2)

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]