web-dev-qa-db-ja.com

cmdまたはPowershellで他のプログラムによって開かれたシリアルポートを強制的に閉じる/解放する方法

この投稿 に続いて、cmdmodeコマンドを使用して、使用可能な/空きポートを確認できます。 PowerShell(PS)のワンライナーを使用することもできます。

_Get-WMIObject Win32_SerialPort | Select-Object DeviceID
_

既存のすべてのポートを表示します。違いは、開いている/ビジーポートを示します。

ここで、cmd/PSの外部で開かれているポートを含め、何らかの方法で開いているポートを中断(強制終了)したいと思います。考えてください

  1. ポートは必ずしもPS内で開かれているとは限りません。それ以外の場合は、$<PortName>.Close()を使用してこれを行うことができます。
  2. レジストリの編集やオペレーティングシステムの再記述などのGUIソリューションではなく、cmdまたはPSコマンドである必要があります。
  3. ポートを削除/破棄したくありません。私はそれらが無料であることを確認したいだけです(開く準備ができています)
  4. できればワンライナーにする必要があります。たった1行で実行できるもの。配管を使用しても大丈夫です。

P.S。私も質問を投稿しました ここRedditに

1
Foad

DevCon再起動:指定されたデバイスを停止して再起動します。ローカルコンピューターでのみ有効です。

例38:デバイスを再起動します

次のコマンドは、DevConの再起動操作を使用して、ローカルコンピューターのループバックアダプターを再起動します。このコマンドは、検索をNetセットアップクラスに制限し、そのクラス内で、ループバックアダプターのデバイスインスタンスID ROOT * MSLOOP\0000を指定します。 at文字(@)は、文字列をデバイスインスタンスIDとして識別します。リテラル検索を要求する一重引用符( ')は、DevConがID内のアスタリスクをワイルドカード文字として解釈するのを防ぎます。

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

または、何が利用可能で、何に対してアクションを実行できるかを掘り下げます。

理解-シリアルポートからの情報の書き込みと読み取り

http://www.powertheshell.com/reference/wmireference/root/cimv2/Win32_SerialPorthttp://www.powertheshell.com/reference/wmireference/root/cimv2/Win32_SerialPort/リセット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のResetメソッドを参照してください。

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()
1
postanote

\ Device\Serial n、ここでnは0から始まり、シリアルポートの内部デバイス名であり、閉じる必要があるのはこれらのハンドルです。

一行にはなりませんが...

SysInternalsツールから「handle」ユーティリティをダウンロードします。

管理者特権のコマンドプロンプトから、handle device\serial >temp.txtを実行します

このファイルには、次の形式の行が多数含まれています。

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

そのような行ごとに、(管理者として)実行します:handle -p <pid> -c <handleValue> -y

handle出力の各行の最後の16進値(示されている例では4C)は、必要なハンドル値です。たとえば、次の方法でそのハンドルを閉じます。

handle -p 24944 -c 4c -y

0
Jamie Hanrahan