35

我的问题与这个问题非常相似,除了我试图使用 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 的返回代码),但我找不到任何方法将其传递回我的调用 Powershell 脚本以实际对失败执行任何操作。

4

5 回答 5

44
$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
于 2011-12-18T08:51:10.190 回答
8
$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 请求找不到主机错误的主机名。请检查名称并重试
ExitCode : 1

主机:HOST2
输出:Ping 请求找不到主机错误的主机名。请检查名称并重试。
退出代码:1

于 2016-05-04T20:49:19.940 回答
3

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

$result = Invoke-Command -ComputerName SERVER01 -ScriptBlock {
   ping BADHOSTNAME
   $lastexitcode
}

exit $result | Select-Object -Last 1

$result变量将包含一个 ping 输出消息数组和$lastexitcode. 如果远程脚本的退出代码最后输出,则可以从完整结果中获取它而无需解析。

要在退出代码之前获得其余的输出,只需:
$result | Select-Object -First $(result.Count-1)

于 2018-05-05T18:39:09.823 回答
2

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

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

当然,如果您的命令产生输出,您将不得不抑制它或解析它以获取退出代码,在这种情况下@jon Z 的答案可能会更好。

于 2015-09-16T20:03:23.773 回答
0

最好使用return而不是exit.

例如:

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

$result
于 2021-07-13T02:21:27.670 回答