列出任何 Windows 终端上的所有串行端口(可用和繁忙)

列出任何 Windows 终端上的所有串行端口(可用和繁忙)

cmdmode命令显示所有可用(待打开)的串行端口,忽略被其他程序占用的端口。PowerShell 命令:

[System.IO.Ports.SerialPort]::getportnames()

显示所有现有端口,即使它们已被其他软件打开。但是,它不会显示 PS 本身内部打开的端口。例如,如果我通过以下方式定义一个新的端口对象:

$port= new-Object System.IO.Ports.SerialPort COM3,9600,None,8,one

mode命令未列出“COM3”,表明该端口实际上是在另一个程序(即 PS)中打开的。但上面的第一个 PS 命令仍显示它可用。不知何故,PS 在定义对象时已经打开了端口,但仍然将它们列为可用!现在,如果我在 PS 中打开端口:

$port.Open()

PS 不再列出。

我想要的是有一个cmd或 PS 命令来列出所有串行端口,无论它们是否在程序中打开。

答案1

尝试这个 :

  1. 点击开始菜单
  2. 转到“运行”
  3. 在字段中输入 CMD
  4. 按以下顺序执行命令:a) C:>powershell b) PS> Get-WMIObject Win32_SerialPort

如果您是 x64,则输入 win64。

我想它应该可以工作。

答案2

要列出 Windows 系统上的所有串行端口(无论它们是可用还是繁忙),可以使用此 PowerShell 脚本。此脚本增强了 CMD 和 PowerShell 中提到的功能,提供了系统上串行端口状态的全面视图。以下是脚本的工作原理和功能摘要:

脚本概述

该脚本利用该类.NET检索[System.IO.Ports.SerialPort]::getportnames()系统上的所有串行端口名称。然后,它会尝试打开每个串行端口以确定其状态。如果某个端口可以成功打开,则认为该端口“可用”。如果脚本在尝试打开端口时遇到错误(表明该端口正在使用或不可用),它会将该端口标记为“繁忙”。

怎么运行的

  1. 检索串行端口:脚本首先获取系统上所有可用的串行端口名称列表。
  2. 检查端口状态:对于每个端口,脚本都会尝试初始化并打开端口。如果此过程成功,脚本会立即关闭端口(以避免干扰后续操作)并将端口标记为可用。如果脚本无法打开端口(由于正在使用或任何其他错误),它会捕获异常并将端口标记为繁忙。
  3. 报告结果:最后,脚本为每个端口生成一个自定义的 PowerShell 对象,指示端口名称及其状态(可用或繁忙)。这些对象被收集到一个数组中并以表格形式输出,提供系统上所有串行端口状态的清晰简洁的概览。

剧本

# Initialize an array to hold the port status objects
$portStatuses = @()

# Get all serial port names
$ports = [System.IO.Ports.SerialPort]::getportnames()

foreach ($port in $ports) {
    try {
        # Try to initialize the port
        $testPort = new-Object System.IO.Ports.SerialPort $port,9600,None,8,one
        $testPort.Open() # Try to open the port
        $testPort.Close() # Close the port if it was successfully opened
        
        # Create a custom object with port details and status
        $portStatus = New-Object PSObject -Property @{
            PortName = $port
            Status = 'Available'
        }
    }
    catch {
        # If an exception is caught, the port is busy
        $portStatus = New-Object PSObject -Property @{
            PortName = $port
            Status = 'Busy'
        }
    }
    # Add the custom object to the array
    $portStatuses += $portStatus
}

# Output the array as a table
$portStatuses | Format-Table -AutoSize

此解决方案提供了一种比仅使用 CMDmode命令或 PowerShell 命令列出端口更详细、更动态的方法[System.IO.Ports.SerialPort]::getportnames()。它会主动检查每个端口的状态,从而更清楚地了解哪些端口当前正在使用以及哪些端口可用于新连接。

相关内容