Список всех 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"
Другие вопросы по тегам