如何维持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
相关产品推荐
相关产品推荐

