我正在尝试使用 powershell 列出已连接和活动 USB 设备的
VID:PID
,希望在基于 *nix 的操作系统中获得类似于 lsusb
的内容。
我可以获得包含我感兴趣的设备的表格,但我无法独立提取
VID
、PID
和 bInterfaceNumber
(我称之为 IFn
)并显示值。输出的形式如下:
USB\VID_v(4)&PID_d(4)&MI_z(2)
地点:
z(2)
是从“bInterfaceNumber”中提取的接口号
相应接口描述符的字段,大概在 [00-99]
范围内。我尝试过的代码:
(Get-PnpDevice -PresentOnly | Where-Object { $_.Class -match 'USB' -AND $_.InstanceId -match '^USB'}) | Select-Object Status, @{n="VID"; e={($_.InstanceId -match '.*VID_(?<vid>[0-9A-F]{4})')}},Class,FriendlyName,InstanceId,Manufacturer | ft -AutoSize
# Output
Status VID Class FriendlyName InstanceId Manufacturer
------ --- ----- ------------ ---------- ------------
OK False USB USB Root Hub (USB 3.0) USB\ROOT_HUB30\4&1CDD8EC&0&0 (Standard USB HUBs)
OK False USB USB Root Hub (USB 3.0) USB\ROOT_HUB30\4&7B32CF2&0&0 (Standard USB HUBs)
OK True USBDevice RTL2838UHIDIR USB\VID_0BDA&PID_2838\00000001 Realtek Semiconductor Corp.
OK True USB USB Composite Device USB\VID_30C9&PID_00AC\01.00.00 (Standard USB Host Controller)
OK True USBDevice APP Mode USB\VID_30C9&PID_00AC&MI_02\6&195555CF&2&0002 WinUsb Device
但我想要实际的 VID,而不仅仅是匹配。此外,我还需要 2 列来显示 PID 和 IFn。
RegEx 是这样的,但不确定,因为
MI_nn
可能不存在:
$_.InstanceId -match '.*VID_(?<vid>[0-9A-F]{4})&PID_(?<pid>[0-9A-F]{4})&MI_(?<ifn>[0-9]{2}).*'
问:如何将其与哈希一起使用,然后在表达式中正确使用?
当您对单个输入字符串使用
-match
(或其变体)时,$Matches
自动变量会在当前范围内更新,并填充任何捕获的值 - 因此使用它来获取 VID 值:
@{Name = 'VID'; Expression = { if ($_.InstanceId -match '.*VID_(?<vid>[0-9A-F]{4})'){ $Matches['vid'] }}