如何捕获使用Powershell的Invoke-Command调用的ScriptBlock的返回值

时间:2011-12-18 01:18:41

标签: powershell return-value exit-code windows-scripting invoke-command

我的问题与this one非常相似,除了我尝试使用Invoke-Command捕获ScriptBlock的返回代码(因此我无法使用-FilePath选项)。这是我的代码:

Invoke-Command -computername $server {\\fileserver\script.cmd $args} -ArgumentList $args
exit $LASTEXITCODE

问题是Invoke-Command没有捕获script.cmd的返回码,所以我无法知道它是否失败。我需要知道script.cmd是否失败。

我也试过使用New-PSSession(这让我看到了远程服务器上的script.cmd' s返回代码),但是我找不到任何办法将它传递给我的调用Powershell脚本实际做任何有关失败的事情。

5 个答案:

答案 0 :(得分:38)

$remotesession = new-pssession -computername localhost
invoke-command -ScriptBlock { cmd /c exit 2} -Session $remotesession
$remotelastexitcode = invoke-command -ScriptBlock { $lastexitcode} -Session $remotesession
$remotelastexitcode # will return 2 in this example
  1. 使用new-pssession创建新会话
  2. 在此会话中调用您的脚本块
  3. 从此会话中获取lastexitcode

答案 1 :(得分:6)

$script = {
    # Call exe and combine all output streams so nothing is missed
    $output = ping badhostname *>&1

    # Save lastexitcode right after call to exe completes
    $exitCode = $LASTEXITCODE

    # Return the output and the exitcode using a hashtable
    New-Object -TypeName PSCustomObject -Property @{Host=$env:computername; Output=$output; ExitCode=$exitCode}
}

# Capture the results from the remote computers
$results = Invoke-Command -ComputerName host1, host2 -ScriptBlock $script

$results | select Host, Output, ExitCode | Format-List

主持人:HOST1
输出:Ping请求找不到主机badhostname。请检查名称,然后重试
ExitCode:1

主持人:HOST2
输出:Ping请求找不到主机badhostname。请检查名称,然后重试 ExitCode:1

答案 2 :(得分:2)

我最近一直在使用另一种方法来解决这个问题。来自远程计算机上运行的脚本的各种输出是一个数组。

object[0].main

$result = Invoke-Command -ComputerName SERVER01 -ScriptBlock { ping BADHOSTNAME $lastexitcode } exit $result | Select-Object -Last 1 变量将包含ping输出消息和$result的数组。如果最后输出远程脚本的退出代码,则可以从完整结果中获取它而不进行解析。

要在退出代码之前获取剩余的输出,它只是:
$lastexitcode

答案 3 :(得分:1)

@jon Z的答案很好,但这更简单:

$remotelastexitcode = invoke-command -computername localhost -ScriptBlock {
    cmd /c exit 2; $lastexitcode}

当然,如果你的命令产生输出,你必须压缩它或解析它以获得退出代码,在这种情况下@jon Z的答案可能会更好。

答案 4 :(得分:0)

最好使用 return 而不是 exit

例如:

$result = Invoke-Command -ComputerName SERVER01 -ScriptBlock {
   return "SERVER01"
}

$result