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

