PowerShellで名前付きパイプを使用してプロセス間通信(IPC)を実現する方法を紹介します。名前付きパイプを使用すると、同一マシン上の異なるプロセス間で通信が可能になります。
サーバースクリプト
まず、クライアントが接続するのを待ち、メッセージを交換するサーバースクリプトを作成します。
$pipeName = "MyNamedPipe"
# 名前付きパイプを作成
$pipeServer = New-Object System.IO.Pipes.NamedPipeServerStream($pipeName, [System.IO.Pipes.PipeDirection]::InOut)
Write-Host "サーバーが起動しました。クライアントからの接続を待っています..."
# クライアントからの接続を待機
$pipeServer.WaitForConnection()
Write-Host "クライアントが接続しました"
$reader = New-Object System.IO.StreamReader($pipeServer)
$writer = New-Object System.IO.StreamWriter($pipeServer)
$writer.AutoFlush = $true
while ($true) {
# クライアントからのメッセージを読み取る
$message = $reader.ReadLine()
if ($message -eq $null) { break }
Write-Host "クライアントからのメッセージ: $message"
# 返事を送信
$response = "Hello " + $message
$writer.WriteLine($response)
}
$pipeServer.Dispose()
クライアントスクリプト
次に、サーバーに接続してメッセージを送信するクライアントスクリプトを作成します。
$pipeName = "MyNamedPipe"
# 名前付きパイプに接続
$pipeClient = New-Object System.IO.Pipes.NamedPipeClientStream(".", $pipeName, [System.IO.Pipes.PipeDirection]::InOut)
Write-Host "サーバーに接続しています..."
$pipeClient.Connect()
Write-Host "サーバーに接続しました"
$reader = New-Object System.IO.StreamReader($pipeClient)
$writer = New-Object System.IO.StreamWriter($pipeClient)
$writer.AutoFlush = $true
while ($true) {
# メッセージを入力
$message = Read-Host "メッセージを入力してください (終了するには 'exit' と入力)"
if ($message -eq "exit") { break }
# メッセージを送信
$writer.WriteLine($message)
# サーバーからの返事を読み取る
$response = $reader.ReadLine()
Write-Host "サーバーからの返事: $response"
}
$pipeClient.Dispose()
スクリプトの使い方
- サーバースクリプトの起動:
- PowerShellを開き、サーバースクリプトを保存したファイルを実行します。
- 例:
.\ServerScript.ps1
- クライアントスクリプトの起動:
- 別のPowerShellウィンドウを開き、クライアントスクリプトを保存したファイルを実行します。
- 例:
.\ClientScript.ps1
操作例
- サーバースクリプトを起動:
- サーバースクリプトを実行すると、「サーバーが起動しました。クライアントからの接続を待っています…」と表示されます。
- クライアントスクリプトを起動:
- クライアントスクリプトを実行すると、「サーバーに接続しています…」と表示され、接続が確立されると「サーバーに接続しました」と表示されます。
- メッセージの送信:
- クライアントスクリプトのプロンプトでメッセージを入力し、Enterキーを押します。
- 例:
Hello Server - サーバースクリプトのウィンドウに「クライアントからのメッセージ: Hello Server」と表示され、クライアントスクリプトのウィンドウに「サーバーからの返事: Hello Hello Server」と表示されます。


コメント