PowerShell中如何将WMI查询的扩展坞版本与指定值对比?
解决PowerShell中HP扩展坞版本对比的类型不匹配问题
问题根源
你用Select FirmwarePackageVersion得到的是带属性的自定义对象(PSCustomObject),不是纯版本字符串,直接和预设版本对比自然会触发类型不匹配错误。另外直接用字符串对比版本也可能出现逻辑错误(比如"1.9"字符串会被判定为大于"1.18",但实际版本1.9 < 1.18)。
解决步骤
- 提取纯版本字符串:用
Select-Object -ExpandProperty FirmwarePackageVersion代替单纯的Select FirmwarePackageVersion,直接获取版本值的字符串内容。 - 转换为Version类型:将字符串版本转为
[version]对象,PowerShell的Version类型支持原生的大小对比,能正确处理版本号的层级逻辑。 - 添加异常处理:避免因无法读取扩展坞信息或版本格式异常导致脚本中断。
示例代码
# 遍历计算机列表时的处理逻辑($_ 代表当前计算机名) $dockVersionStr = Get-CimInstance -class HP_DockAccessory -computername $_ -namespace root/HP/InstrumentedServices/v1 | Select-Object -ExpandProperty FirmwarePackageVersion if ($dockVersionStr) { try { $currentVersion = [version]$dockVersionStr $targetVersion = [version]"1.18" if ($currentVersion -lt $targetVersion) { Write-Host "[$_] 扩展坞固件版本 $currentVersion 低于1.18,请下载固件更新程序" } else { Write-Host "[$_] 扩展坞固件版本 $currentVersion 符合要求" } } catch { Write-Warning "[$_] 无法解析扩展坞版本:$dockVersionStr" } } else { Write-Warning "[$_] 未检测到HP扩展坞设备" }
额外建议
- 优先使用
Get-CimInstance替代Get-WmiObject:后者已被PowerShell标记为过时,CIM cmdlets兼容性更强,支持更多现代特性。 - 如果版本字符串格式非标准(比如带前缀/后缀),可以先做字符串清理(比如用
-replace去掉非版本字符)再转换为Version类型。
内容的提问来源于stack exchange,提问作者Jeremy Patrick
相关产品推荐
相关产品推荐

