![]() |
получить список физически подключенных usb устройств
Доброго времени суток!
Появилась нужда получить с компьютеров количество занятых usb портов физическими устройствами, т.е. не интересуют всякие виртуальные устройства и информация об концентраторах. Суть в том, чтобы посчитать сколько у компьютера осталось свободных usb портов, общее количество физических портов компьютера заведомо известно. Проблема в том, что по выводимой мне информации непонятно реальное ли это устройство. Например
Код:
Get-PnpDevice -PresentOnly |Select-Object -Property FriendlyName, class, InstanceId, HardwareID | Where-Object {$_.class -like 'USB' } Код:
FriendlyName Class InstanceId HardwareID Код:
gwmi Win32_USBControllerDevice |%{[wmi]($_.Dependent)} | Sort Manufacturer,Description,DeviceID | Ft -GroupBy Manufacturer Description,Service,DeviceID В общем устройства в информации для меня ничем не различаются. |
А так?
Код:
Get-PnpDevice -PresentOnly |? { $_.InstanceId -match '^USB' -and $_.class -ne 'USB' } |
Цитата:
Код:
Status Class FriendlyName InstanceId Я понимаю, что в моем случае все усложняется тем, что у меня ноут и видимо некоторые устройства почему-то usb, но на самом деле они внутри корпуса. Опрашиваться будут в основном системные блоки где такого должно быть меньше или вообще не должно быть. Заметил, что многие устройства при подключении генерируют две записи, на примере включена только мышь, пока встроенные устройства я не принимаю во внимание, так как на системниках таких быть не должно пример
Код:
Get-PnpDevice -PresentOnly |Select-Object -Property status, FriendlyName, class, InstanceId | Where-Object { $_.InstanceId -match '^USB' -and $_.class -ne 'USB'} Код:
status FriendlyName Class InstanceId Осталось как-то считать две записи одним устройством, но опять же не все устройства генерируют по две записи.. |
Цитата:
Цитата:
Код:
Get-PnpDevice -PresentOnly |? { |
Цитата:
Код:
$_.class -ne 'HIDClass' Код:
Status Class FriendlyName InstanceId сейчас вопрос состоит в том как сравнить значения одного устройства: Код:
USB\VID_046D&PID_C534&MI_00\6&24087896&0&0000 |
Griboed0ff, не знаю, поможет вам или нет - я использую утилиту UsbTreeView. Так-то она экранная, но с ключом -R пишет вывод текстовый файл. Вроде, и в xml может.
|
Цитата:
|
Цитата:
Код:
sort {$_.instanceid -replace '.*&(PID_.+?)&.*','$1'} -Unique |
Мне нужно было получить значения именно через gwmi, получилось два варианта:
Код:
gwmi Win32_USBControllerDevice |%{[wmi]($_.Dependent)} | select Caption, PNPClass, deviceid | ? { $_.deviceid -match '^USB' -and $_.PNPClass -ne 'USB'}|sort {$_.deviceid -replace '.*&(PID_.+?)&.*','$1'} -Unique Код:
Get-PnpDevice -PresentOnly |Select-Object -Property status, FriendlyName, class, InstanceId|? { $_.InstanceId -match '^USB' -and $_.class -ne 'USB' }|sort {$_.instanceid -replace '.*&(PID_.+?)&.*','$1'} -Unique |
Кстати, лучше фильтровать результаты как можно раньше, т. е., сначала надо where, а потом select.
Здесь это, может, не очень существенно, но в целом надо применять filter left technique, т. е., как можно раньше отбрасывать ненужное, чтобы не тащить лишние данные между процессами обработки. Также, фильтры бывают уже и в самом командлете, например, можно instanceID отобрать, не перебрасывая через пайп. Код:
Get-PnpDevice -PresentOnly -InstanceId "USB*" |? class -ne 'USB' |select status, FriendlyName, class, InstanceId |sort {$_.instanceid -replace '.*&(PID_.+?)&.*','$1'} -Unique |
Время: 05:14. |
Время: 05:14.
© OSzone.net 2001-