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

咨询PowerShell远程会话中断时自动重建的实现方案(CMCB补丁场景)

PowerShell远程会话自动重连解决方案

问题分析

你之前的方案核心问题在于:SessionValid属性只是返回了新的会话对象,但并没有更新$Session变量本身。每次调用Invoke-Command时还是在使用原来的失效会话,自然达不到自动重连的效果。

解决方案:封装会话管理逻辑

可以通过封装会话检查与重建的逻辑,确保每次调用Invoke-Command时都使用有效会话。以下是两种可行方案:

方案1:用函数统一管理会话

$Server = 'servername'
# 初始化会话变量
$Session = $null

# 定义获取有效会话的函数
function Get-ValidSession {
    param($ComputerName)
    # 检查现有会话是否处于正常打开状态
    if ($null -ne $Script:Session -and $Script:Session.State -eq 'Opened') {
        return $Script:Session
    }
    # 会话失效或不存在,重建会话
    Write-Host "重建到 $ComputerName 的远程会话..."
    $Script:Session = try {
        New-PSSession -ComputerName $ComputerName -ErrorAction Stop
    }
    catch {
        Write-Warning "无法建立到 $ComputerName 的会话: $_"
        $null
    }
    return $Script:Session
}

# 测试监控循环
while($true){
    $validSession = Get-ValidSession -ComputerName $Server
    if ($null -ne $validSession) {
        try {
            $result = Invoke-Command -Session $validSession -ScriptBlock { $pid }
            Write-Host "当前会话PID: $result"
        }
        catch {
            Write-Warning "调用失败,标记会话为失效: $_"
            # 显式销毁失效会话,避免残留无效对象
            if ($null -ne $Script:Session) {
                Remove-PSSession -Session $Script:Session -ErrorAction SilentlyContinue
                $Script:Session = $null
            }
        }
    }
    Start-Sleep -Seconds 5
}

方案2:用脚本块动态获取会话

如果不想用函数,也可以用脚本块实现动态检查逻辑:

$Server = 'servername'
$Session = try { New-PSSession -ComputerName $Server -ErrorAction Stop } catch {}

# 定义动态获取有效会话的脚本块
$getValidSession = {
    if ($null -ne $Script:Session -and $Script:Session.State -eq 'Opened') {
        return $Script:Session
    }
    # 重建会话
    Write-Host "重建到 $Server 的远程会话..."
    $Script:Session = try { New-PSSession -ComputerName $Server -ErrorAction Stop } catch { $null }
    return $Script:Session
}

# 测试监控循环
while($true){
    $validSession = & $getValidSession
    if ($null -ne $validSession) {
        try {
            $result = Invoke-Command -Session $validSession -ScriptBlock { $pid }
            Write-Host "当前会话PID: $result"
        }
        catch {
            Write-Warning "调用失败,标记会话为失效: $_"
            Remove-PSSession -Session $Script:Session -ErrorAction SilentlyContinue
            $Script:Session = $null
        }
    }
    Start-Sleep -Seconds 5
}

关键改进点

  • 每次调用前主动检查会话状态,失效则立即重建
  • 调用失败后显式销毁失效会话,避免残留无效对象
  • 使用Script:作用域确保会话变量在函数/脚本块中能被正确更新
  • 增加日志输出,便于排查会话重建和调用失败的情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 13:45:01