You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何维持PowerShell远程会话开放并获取脚本块退出码?

远程PowerShell会话执行脚本后自动关闭的问题及解决方法

为什么会话会自动关闭?

你在脚本块里使用了exit 1命令,在PowerShell远程会话中,exit命令会直接终止整个远程会话(而非仅结束当前脚本块的执行)。第一次Invoke-Command执行后,会话状态变为Closing,因此第二次调用时会报错。

解决方法

方法1:避免会话关闭,保留两次调用的方式

将脚本块中的exit 1替换为设置$LASTEXITCODE的方式,这样不会终止远程会话:

$ScriptBlock = {
    function PrintObjectDetails ()
    {
        $object = [PSCustomObject]@{
            prop1 = "value1"
            prop2 = "value2"
        }
        Write-Output $object
    }

    PrintObjectDetails
    Write-Host $args[-1]
    # 用设置LASTEXITCODE替代exit,不会关闭会话
    $LASTEXITCODE = 1
}

Invoke-Command -Session $RemoteSession -ArgumentList $parameters -ScriptBlock $ScriptBlock
Invoke-Command -Session $RemoteSession -ScriptBlock { $LASTEXITCODE } -OutVariable exitCodeArray > $null
$exitCode = $exitCodeArray[0]

方法2:单次调用同时获取输出和退出码(推荐)

无需依赖两次会话调用,在同一次Invoke-Command中把业务输出和退出码打包成对象返回,既不会打乱输出顺序,也能避免会话关闭的问题:

$RemoteSession = New-PSSession -ComputerName ... -Credential $cred 
$s = "something"
$parameters = ($parameters + $s)
$ScriptBlock = {
    function PrintObjectDetails ()
    {
        $object = [PSCustomObject]@{
            prop1 = "value1"
            prop2 = "value2"
        }
        Write-Output $object
    }

    # 捕获业务输出
    $outputResult = PrintObjectDetails
    # Write-Host的内容会直接输出到控制台,不影响返回值
    Write-Host $args[-1]
    # 定义退出码
    $exitCode = 1

    # 打包返回结果
    [PSCustomObject]@{
        Output = $outputResult
        ExitCode = $exitCode
    }
}

# 单次调用获取所有结果
$result = Invoke-Command -Session $RemoteSession -ArgumentList $parameters -ScriptBlock $ScriptBlock
# 提取原始输出和退出码
$originalOutput = $result.Output
$exitCode = $result.ExitCode

内容的提问来源于stack exchange,提问作者Black Shark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 04:15:33