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

如何对基于SSH的Invoke-Command进行错误处理?

解决SSH方式调用Invoke-Command的连接异常处理问题

核心问题原因

当使用-HostName通过SSH调用Invoke-Command时,远程连接超时这类错误属于PowerShell终止错误,默认会直接终止脚本执行;你尝试的2>&1重定向仅对外部命令的标准错误流生效,无法捕获PowerShell自身的错误记录,因此无效。

推荐修复方案

方案1:用try/catch捕获终止错误

通过-ErrorAction Stop将错误强制转为可捕获的终止错误,再用try/catch块处理异常:

try {
    $result = Invoke-Command -HostName '192.168.100.1' -ScriptBlock { Write-Output "Hi" } -ErrorAction Stop
    # 正常执行逻辑
    Write-Host "执行成功:$result"
}
catch {
    # 异常处理逻辑
    Write-Host "连接失败:$($_.Exception.Message)"
    # 可针对性处理连接超时场景
    if ($_.Exception.Message -match "Connection timed out") {
        Write-Host "检测到连接超时,执行重试或标记操作"
    }
}

方案2:用-ErrorVariable捕获错误

如果不想改变默认错误行为,可通过-ErrorVariable参数将错误存储到指定变量,后续判断处理:

$result = Invoke-Command -HostName '192.168.100.1' -ScriptBlock { Write-Output "Hi" } -ErrorVariable connError
if ($connError) {
    Write-Host "发生错误:$($connError[0].Exception.Message)"
    if ($connError[0].Exception.Message -match "Connection timed out") {
        Write-Host "处理连接超时场景"
    }
}
else {
    Write-Host "执行成功:$result"
}

补充:缩短连接超时时间

默认SSH连接超时较长,可通过-ConnectionTimeout参数指定超时秒数,避免脚本长时间卡住:

try {
    $result = Invoke-Command -HostName '192.168.100.1' -ScriptBlock { Write-Output "Hi" } -ErrorAction Stop -ConnectionTimeout 10
}
catch {
    Write-Host "连接超时或失败:$($_.Exception.Message)"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:35:06