PowerShell如何将远程PC名称与BIOS序列号整合至同一表格?
解决方法
你可以通过在异步Job中构建包含PC名称和序列号的自定义对象,让Receive-Job返回关联的完整数据。以下是修改后的代码,同时加入了错误处理来应对远程PC不可达的情况:
# 遍历目标PC数组,启动异步Job foreach ($pcName in $PCNameArray) { Start-Job -ScriptBlock { param($targetPC) try { # 获取BIOS信息(也可替换为Get-CimInstance Win32_BIOS,更推荐) $biosInfo = Get-WmiObject Win32_BIOS -ComputerName $targetPC -ErrorAction Stop # 返回包含PC名称、序列号和状态的自定义对象 [PSCustomObject]@{ PCName = $targetPC SerialNumber = $biosInfo.SerialNumber.Trim() Status = "Success" } } catch { # 捕获连接异常,记录错误信息 [PSCustomObject]@{ PCName = $targetPC SerialNumber = $null Status = "Failed: $($_.Exception.Message)" } } } -ArgumentList $pcName -Name "GetSerial_$pcName" } # 等待所有Job执行完成并接收结果 $results = Get-Job | Wait-Job | Receive-Job # 清理已完成的Job Get-Job | Remove-Job # 输出整合后的表格 $results | Format-Table PCName, SerialNumber, Status -AutoSize
关键修改点
- 传递PC名称参数:通过
Start-Job的-ArgumentList将当前遍历的PC名称传入Job脚本块,确保每个Job都能关联对应的目标设备 - 返回自定义对象:用
[PSCustomObject]构建包含PCName、SerialNumber的结构化数据,替代仅返回序列号的方式,让结果天然关联PC名称 - 错误处理:添加
try/catch捕获远程连接失败的异常,避免单个PC出错导致Job无输出,同时记录状态方便排查问题 - Job命名(可选):给每个Job命名为
GetSerial_$pcName,方便后续手动管理(比如查看单个Job状态)
如果你倾向于使用更现代的CIM命令,只需将代码中的Get-WmiObject替换为Get-CimInstance即可,两者逻辑完全一致。
内容的提问来源于stack exchange,提问作者Ruslannnn
相关产品推荐
相关产品推荐

