【问题标题】:List of all COM ports shown in device manager by using PowerShell使用 PowerShell 在设备管理器中显示的所有 COM 端口列表
【发布时间】:2016-11-01 23:26:28
【问题描述】:

我想合并一个包含可用 COM 端口列表的下拉菜单。我找不到任何方法来轻松获取可用 COM 端口的名称以代替创建 $port 的 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 个可用端口。 Device Manager Snapshot

这是我尝试过的方法,我能够缩小名称范围,但不知道如何仅提取 (COM--) 部分。

Get-WmiObject Win32_pnpentity  -Filter "Name LIKE 'devicemaster port%'" | Select-Object -Property Name 

Result Screenshot

【问题讨论】:

    标签: powershell serial-port win32-process get-wmiobject


    【解决方案1】:

    添加一个迟到的答案,因为我只是需要这个......

    您可以使用 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 至 server 2019(Powershell 4 及更高版本)。

    ClassGuid 的完整列表在这里: https://docs.microsoft.com/en-us/windows-hardware/drivers/install/system-defined-device-setup-classes-available-to-vendors

    【讨论】:

      【解决方案2】:

      这是获取 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"
      

      【讨论】:

        【解决方案3】:

        留给您一些工作来弄清楚,但根据您的结果屏幕截图,您可以执行以下操作:

        $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。

        【讨论】:

        • 感谢 regex101 提示!对我这种菜鸟很有用。这个解决方案效果很好,只需要为额外的数字添加另一个 (.*),而是返回 $matches[2]
        猜你喜欢
        • 2019-05-02
        • 2013-11-30
        • 1970-01-01
        • 1970-01-01
        • 2013-08-22
        • 2011-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多