如何对基于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
相关产品推荐
相关产品推荐

