如何在PowerShell中提取USB设备的VID、PID及IFn并正确运用哈希表
PowerShell实现类lsusb的USB设备VID/PID/接口号提取
问题说明
需要在PowerShell中列出已连接且活跃的USB设备的VID、PID以及接口号(命名为IFn),实现类似Unix系统lsusb工具的功能。当前代码能筛选出目标设备,但提取VID时返回的是匹配成功与否的布尔值,而非实际的VID字符串,同时需要新增PID和IFn列(IFn对应InstanceId中MI_xx部分的xx,该部分可能不存在)。
解决方案
核心思路是利用PowerShell的-match操作符结合正则捕获组,匹配后通过$matches哈希表提取对应字段值。正则表达式需兼容两种InstanceId格式:带MI_xx和不带MI_xx的情况。
完整代码如下:
Get-PnpDevice -PresentOnly | Where-Object { $_.Class -match 'USB' -and $_.InstanceId -match '^USB\\VID_' } | Select-Object Status, @{n='VID'; e={ if ($_.InstanceId -match 'VID_(?<vid>[0-9A-F]{4})') { $matches['vid'] } }}, @{n='PID'; e={ if ($_.InstanceId -match 'PID_(?<pid>[0-9A-F]{4})') { $matches['pid'] } }}, @{n='IFn'; e={ if ($_.InstanceId -match 'MI_(?<ifn>[0-9]{2})') { $matches['ifn'] } else { '-' } }}, Class, FriendlyName, Manufacturer | Format-Table -AutoSize
代码解释
- 筛选逻辑优化:将
Where-Object条件改为匹配^USB\\VID_,直接过滤出带有VID的USB设备,排除根集线器这类无VID/PID的设备。 - VID/PID提取:每个计算属性中先执行正则匹配,匹配成功后从
$matches中取出对应的捕获组值($matches['vid']/$matches['pid'])。 - IFn处理:正则匹配
MI_(?<ifn>[0-9]{2}),匹配成功则返回接口号,否则返回-表示无该字段。
示例输出
Status VID PID IFn Class FriendlyName Manufacturer ------ --- --- --- ----- ------------ ------------ OK 0BDA 2838 - USBDevice RTL2838UHIDIR Realtek Semiconductor Corp. OK 30C9 00AC - USB USB Composite Device (Standard USB Host Controller) OK 30C9 00AC 02 USBDevice APP Mode WinUsb Device
内容的提问来源于stack exchange,提问作者not2qubit
相关产品推荐
相关产品推荐

