我的问题与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脚本实际做任何有关失败的事情。
答案 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 :(得分: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