PowerShell Invoke-Command远程执行捕获结果与错误的实现方法
PowerShell 远程采集脚本(带全异常捕获)
实现逻辑说明
- 废弃单独预连通性检测逻辑,直接执行目标采集动作,可覆盖网络不通、认证失败、权限不足、远程执行错误等全场景异常
- 所有命令调用指定
-ErrorAction Stop将非终止错误转为终止错误,通过try/catch块全量捕获 - 每台服务器的执行结果输出统一结构的自定义对象,包含所有要求采集的字段与错误信息,可直接入库做统计分析
- 修复原脚本未传入预获取凭据的逻辑漏洞
完整脚本代码
$credential = Get-Credential $server_list = @('server1','server2') $result_list = @() foreach ($server_name in $server_list) { # 初始化单台服务器的结果对象,提前定义所有字段结构 $server_result = [PSCustomObject]@{ TargetServer = $server_name RemoteHostName = $null RemoteTime = $null PSVersion = $null ExecuteStatus = 'Failed' ErrorMessage = $null } try { # 传入凭据、指定错误终止模式,确保所有阶段的错误都可被捕获 $remote_data = Invoke-Command -ComputerName $server_name -Credential $credential -ErrorAction Stop -ScriptBlock { [PSCustomObject]@{ HostName = [System.Net.Dns]::GetHostName() CurrentTime = Get-Date PSVersion = $PSVersionTable.PSVersion.ToString() } } # 执行成功则填充对应采集字段 $server_result.RemoteHostName = $remote_data.HostName $server_result.RemoteTime = $remote_data.CurrentTime $server_result.PSVersion = $remote_data.PSVersion $server_result.ExecuteStatus = 'Success' } catch { # 捕获全链路异常,填充错误详情 $server_result.ErrorMessage = $_.Exception.Message } $result_list += $server_result } # 控制台输出结果,可替换为数据库入库/导出CSV等后续逻辑 $result_list | Format-Table -AutoSize
返回字段说明
输出的自定义对象字段可直接映射数据库表结构:
TargetServer:输入的目标服务器地址,即服务器列表中配置的名称RemoteHostName:远程服务器实际主机名,仅执行成功时填充RemoteTime:远程服务器当前系统时间,仅执行成功时填充PSVersion:远程服务器PowerShell版本号,仅执行成功时填充ExecuteStatus:执行状态,固定返回Success/Failed二值,方便做成功率统计ErrorMessage:异常详情,执行失败时填充具体错误内容,包含网络不通、Kerberos认证失败、权限不足、WinRM配置错误等所有触发的错误信息
使用注意事项
- 无需提前执行ping、Test-WSMan等预检测操作,所有执行阶段的错误都会被直接捕获,可避免预检测通过但实际执行失败的漏判问题
- 若需要控制连接超时时长,可在
Invoke-Command参数中添加-OperationTimeoutSec 10指定超时秒数,避免服务器不可达时长时间无响应卡住 - 最终生成的
$result_list数组可直接通过ConvertTo-Json转成JSON格式,或通过Export-Csv导出为CSV文件,也可直接对接数据库插入逻辑
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

