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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 23:39:28