PowerShellで名前付きパイプを使ったプロセス間通信

Tech

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

スクリプトの使い方

  1. サーバースクリプトの起動:
    • PowerShellを開き、サーバースクリプトを保存したファイルを実行します。
    • 例: .\ServerScript.ps1
  2. クライアントスクリプトの起動:
    • 別のPowerShellウィンドウを開き、クライアントスクリプトを保存したファイルを実行します。
    • 例: .\ClientScript.ps1

操作例

  1. サーバースクリプトを起動:
    • サーバースクリプトを実行すると、「サーバーが起動しました。クライアントからの接続を待っています…」と表示されます。
  2. クライアントスクリプトを起動:
    • クライアントスクリプトを実行すると、「サーバーに接続しています…」と表示され、接続が確立されると「サーバーに接続しました」と表示されます。
  3. メッセージの送信:
    • クライアントスクリプトのプロンプトでメッセージを入力し、Enterキーを押します。
    • 例: Hello Server
    • サーバースクリプトのウィンドウに「クライアントからのメッセージ: Hello Server」と表示され、クライアントスクリプトのウィンドウに「サーバーからの返事: Hello Hello Server」と表示されます。

ライセンス:本記事のテキスト/コードは特記なき限り CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。

コメント

タイトルとURLをコピーしました