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

优化PowerShell Jobs批量远程获取Microsoft Edge版本的代码及异常处理

优化后的PowerShell代码
# 远程执行的脚本:统一返回结构化结果,捕获执行时的各种情况
$command = {
    try {
        # 查找Edge包,存在多匹配时取最新版本
        $package = Get-Package -Name "*Microsoft Edge*" | Sort-Object Version -Descending | Select-Object -First 1
        if ($package) {
            [PSCustomObject]@{
                Version = $package.Version.ToString()
                Error   = $null
            }
        }
        else {
            [PSCustomObject]@{
                Version = "未找到Microsoft Edge"
                Error   = $null
            }
        }
    }
    catch {
        [PSCustomObject]@{
            Version = $null
            Error   = "执行出错: $_"
        }
    }
}

# 目标计算机列表
$comps = "SMZ-02122141-LB", "MTR-03103102-LB", "SMZ-02122087-LB", "SMZ-S0102573-DB", "SMZ-PF1BGR9B-LB"

# 启动远程Job,设置连接阶段超时10秒(避免连不上的机器占用过多时间)
$jobs = Invoke-Command -AsJob -ComputerName $comps -ScriptBlock $command -ConnectionTimeout 10

# 等待30秒,无论Job是否完成都继续后续处理
Wait-Job -Job $jobs -Timeout 30 | Out-Null

# 收集每台机器的结果
$results = foreach ($job in $jobs) {
    $computerName = $job.Location
    # 根据Job状态分情况处理
    switch ($job.State) {
        'Completed' {
            $jobResult = Receive-Job -Job $job -ErrorAction SilentlyContinue
            [PSCustomObject]@{
                ComputerName = $computerName
                Version      = $jobResult.Version
                Status       = "成功"
                ErrorMessage = $jobResult.Error
            }
        }
        'Failed' {
            # 提取连接失败的具体错误信息
            $errorMsg = $job.JobStateInfo.Reason.Message
            [PSCustomObject]@{
                ComputerName = $computerName
                Version      = $null
                Status       = "连接失败"
                ErrorMessage = $errorMsg
            }
        }
        'TimedOut' {
            [PSCustomObject]@{
                ComputerName = $computerName
                Version      = $null
                Status       = "连接超时"
                ErrorMessage = "等待30秒未响应"
            }
        }
        default {
            [PSCustomObject]@{
                ComputerName = $computerName
                Version      = $null
                Status       = "未知状态"
                ErrorMessage = $job.State
            }
        }
    }
    # 清理已处理的Job,释放资源
    Remove-Job -Job $job -Force
}

# 输出整理后的结果
$results | Format-Table -AutoSize

核心优化说明

  1. 统一结果结构:不管是成功获取版本、未找到Edge、执行出错还是连接失败,都返回格式一致的对象,避免原代码中字符串与对象混合的混乱情况。
  2. 全覆盖Job状态:原代码仅处理超时内完成的Job,现在遍历所有提交的Job,将连接失败、超时的机器全部纳入结果,确保每台目标机器都有对应记录。
  3. 无需预检测连通性:完全依赖Job自身的状态判断连接情况,不用额外调用Test-Connection,减少冗余操作。
  4. 双层超时控制:连接阶段设10秒超时,避免在建立连接环节卡滞;整体执行设30秒超时,防止远程机器执行过慢拖慢整体流程。
  5. 自动清理资源:处理完每个Job后立即删除,避免PowerShell中残留无用的Job资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 00:22:33