Список всех COM-портов, отображаемых в диспетчере устройств с помощью PowerShell
Я хочу включить выпадающее меню, которое заполнено списком доступных COM-портов. Я не могу найти способ легко получить имена доступных портов COM вместо COM4, который создает порт $.
$port = new-Object System.IO.Ports.SerialPort COM4,19200,None,8,one
С помощью Win32_SerialPort я могу легко извлечь COM1 и COM3.
Get-WmiObject Win32_SerialPort | Select-Object deviceid
Результаты:
идентификатор устройства
COM3
COM1
Но мой диспетчер устройств показывает 16 доступных портов от удаленного последовательного концентратора. Снимок диспетчера устройств
Вот то, что я попробовал, и я могу сузить Имя, но не могу понять, как извлечь только часть (COM--).
Get-WmiObject Win32_pnpentity -Filter "Name LIKE 'devicemaster port%'" | Select-Object -Property Name
1 ответ
Оставляя некоторую работу для вас, чтобы выяснить, но на основе вашего скриншота результатов вы можете сделать что-то вроде этого:
$ports = @()
$ports += 'devicemaster port (COM1)'
$ports += 'devicemaster port (COM2)'
$ports += 'devicemaster port (COM3)'
$ports += 'devicemaster port (COM4)'
$ports | % {
if ($_ -match "devicemaster port \((.*)\)") {
$matches[1]
}
}
с этим объектом, предполагая, что вы храните его в "$ports". Возможно, вам придется использовать '$ports.Name'...
Возможно, смотрите regex101.com о том, как работает регулярное выражение.
Добавление позднего ответа, потому что мне просто нужно было это...
Вы можете использовать WMI ClassGuids для получения точного списка (COM и LPT), который показывает диспетчер устройств:
$lptAndCom = '{4d36e978-e325-11ce-bfc1-08002be10318}'
get-wmiobject -Class win32_pnpentity | where ClassGuid -eq $lptAndCom | select name
Подтверждено для работы с несколькими картами расширения LPT / COM (Brain Boxes / Exar) с использованием Windows 8.1 до сервера 2019 (Powershell 4 и более поздние версии).
Полный список ClassGuids находится здесь: https://docs.microsoft.com/en-us/windows-hardware/drivers/install/system-defined-device-setup-classes-available-to-vendors
Вот более актуальное решение для получения информации о COM-порте:
cls
$portList = get-pnpdevice -class Ports -ea 0
$portCount = 0
if ($portList) {
$now = get-date
foreach($device in $portList) {
$id = $device.InstanceId
if ($device.Present) {
$date = $now
} else {
$info = Get-PnpDeviceProperty -InstanceId $id
$latest = $info | ?{$_.KeyName -eq "DEVPKEY_Device_LastRemovalDate"}
$date = [datetime]$latest.Data
}
$age = $now-$date
if ($age.Days -lt 14) {
"port name : $name"
"last active: $date"
""
$portCount++
}
}
}
"number of active COM-port devices in last 14 days: $portCount"