如何强制关闭/释放 cmd 或 Powershell 中其他程序打开的串行端口

如何强制关闭/释放 cmd 或 Powershell 中其他程序打开的串行端口

下列的这个帖子,我可以使用cmdmode命令来查看可用/空闲端口。我也可以使用 PowerShell (PS) 的一行程序:

Get-WMIObject Win32_SerialPort | Select-Object DeviceID

查看所有现有端口。差异表示开放/繁忙的端口。

现在我想中断(强制关闭)以任何方式打开的端口,包括在cmd/PS 之外打开的端口。请考虑

  1. PS里面不一定开放这个端口,否则我可以用来$<PortName>.Close()做这个。
  2. 它必须是cmd或 PS 命令,而不是 GUI 解决方案,例如编辑注册表或重新启动操作系统。
  3. 我不想删除/破坏端口。我只是想确保它们是空闲的(准备打开)
  4. 最好是一行代码。我可以在一行代码中运行。使用管道也可以。

附言我也发布了问题在 Reddit 上

答案1

DevCon Restart:停止并重新启动指定的设备。仅在本地计算机上有效。

示例 38:重启设备

以下命令使用 DevCon Restart 操作重新启动本地计算机上的环回适配器。该命令将搜索限制到 Net 安装类,并在该类中指定环回适配器的设备实例 ID,即 ROOT*MSLOOP\0000。at 字符 (@) 将字符串标识为设备实例 ID。单引号字符 (') 请求文字搜索,可防止 DevCon 将 ID 中的星号解释为通配符。

devcon restart =net @'ROOT\*MSLOOP\0000

或者,深入了解可用的内容以及您可以采取的行动。

理解——从串行端口写入和读取信息

http://www.powertheshell.com/reference/wmireference/root/cimv2/Win32_SerialPort http://www.powertheshell.com/reference/wmireference/root/cimv2/Win32_SerialPort/Reset https://devblogs.microsoft.com/powershell/writing-and-reading-info-from-serial-ports

(Get-WMIObject Win32_SerialPort).DeviceID

# COM3

Get-CimClass -ClassName Win32_SerialPort | Format-List -Force

...
CimClassMethods     : {SetPowerState, Reset}
...

方法

Win32_SerialPort 类具有这些方法。

方法描述

重置 未实现。要实现此方法,请参阅 CIM_SerialController 中的重置方法。

SetPowerState 未实现。要实现此方法,请参阅 CIM_SerialController 中的 SetPowerState 方法。

https://docs.microsoft.com/en-us/windows/desktop/CIMWin32Prov/win32-serialport

Get-CimClass -ClassName CIM_LogicalDevice | Format-List -Force

Get-CimInstance -ClassName CIM_LogicalDevice | 
Where-Object -Property DeviceID -EQ $((Get-WMIObject Win32_SerialPort).DeviceID) | 
Select-Object -Property '*' | Get-Member

Get-CimInstance -ClassName CIM_LogicalDevice | 
Where-Object -Property DeviceID -EQ $((Get-WMIObject Win32_SerialPort).DeviceID) | 
Select-Object -Property TimeOfLastReset


# Writing to a Serial Port using .Net namespace accelerator

[System.IO.Ports.SerialPort]::getportnames()
COM3
$port = New-Object System.IO.Ports.SerialPort COM3,9600,None,8,one
$port.open()
$port.WriteLine(“Hello world”)
$port.Close()


# Reading from a Serial Port using .Net namespace accelerator
$port = New-Object System.IO.Ports.SerialPort COM3,9600,None,8,one
$port.Open()
$port.ReadLine()

答案2

\设备\串行n, 在哪里n从 0 开始,是串行端口的内部设备名称,以及您需要关闭的这些设备的句柄。

它不会是一行,但是...

从 SysInternals 工具下载“句柄”实用程序。

从提升的命令提示符下运行handle device\serial >temp.txt

该文件将包含一系列以下形式的行:

image.exe pid: 24944 type: File 4C: \Device\Serialn

对于每一行,运行(以管理员身份):handle -p <pid> -c <handleValue> -y

每行输出的最后一个十六进制值handle(示例中为 4C)是您想要的句柄值。例如,您可以通过以下方式关闭该句柄:

handle -p 24944 -c 4c -y

相关内容