powershell wait オプションの基本と活用法

PowerShellスクリプト実行時、特定の処理が終わるまで待機させたい場面は多くあります。powershell wait オプションと検索された方は、おそらく特定のプロセス終了を待つ方法や、イベント終了を監視する具体的な活用方法についてお調べのことでしょう。

Windows powershellで実行待ち(Wait)をかける方法

単にスクリプトを一時停止させるだけでなく、例えば1つのプロセスが完了するまで次の処理へ進まないように制御したり、パイプライン処理の中で待機を組み込んだりする必要があります。

Wait-Processコマンドレットのオプション一覧や、Start-Processの-Waitパラメータなど、PowerShellには様々な待機(wait)の方法が用意されています。

これは単なる強制停止とは異なり、スクリプトの実行順序を制御する上で欠かせない技術です。

この記事では、そうしたPowerShellにおけるwaitのオプションや、それぞれの利用シーンについて詳しく解説します。

  • Wait-Processコマンドレットの主要なオプション
  • Start-Process -Waitなど他の待機方法との違い
  • プロセスやジョブ、イベントを待機させる具体的な使い方
  • スクリプト実行を一時停止させるStart-Sleepの活用
スポンサーリンク

Wait-Processのpowershell wait オプション

  • プロセス終了を待つ基本的な利用シーン
  • Wait-Processの主要オプション一覧
  • 1つのプロセスをIDや名前で指定
  • パイプライン経由での待機
  • -Timeoutで待機時間を設定

プロセス終了を待つ基本的な利用シーン

PowerShellスクリプトを実行する際、ある処理(プロセス)が完了してから次の処理へ進みたいケースがあります。例えば、外部のアプリケーションを起動し、そのアプリケーションが完全に終了するまでスクリプトの実行を一時停止させたい場合などです。

Wait-Processコマンドレットは、まさにこのような状況で役立ちます。このコマンドレットを使用すると、指定したプロセスが停止するのを待機できます。

具体的な利用シーンとしては、インストーラー(.exeファイル)を実行した後、インストールが完了するのを待ってから設定変更のスクリプトを実行する場合や、重いバッチ処理が完了するのを待ってから結果をログファイルに書き込む場合などが考えられます。

もしWait-Processを使わずにプロセスを起動するだけだと、スクリプトはプロセスの終了を待たずに即座に次の行へ進んでしまいます。これにより、ファイルがまだ生成されていないのにアクセスしようとしてエラーになる、といった意図しない動作を引き起こす可能性があります。

Wait-Processは、ローカルコンピュータ上で実行されているプロセスにのみ機能する点に注意が必要ですが、スクリプトの実行順序を確実に制御するための基本的なコマンドレットと言えます。

Wait-Processの主要オプション一覧

Wait-Processコマンドレットには、待機するプロセスをどのように指定し、どのように待機するかを制御するためのオプション(パラメーター)が用意されています。

待機対象を指定する方法は、主に「プロセス名(-Name)」「プロセスID(-Id)」「プロセスオブジェクト(-InputObject)」の3種類です。これらは構文(Syntax)が分かれており、状況に応じて使い分けることになります。

また、待機時間や待機条件を変更するオプションも存在します。

ここでは、Wait-Processでよく使用される主要なパラメーターを表形式でまとめます。

パラメーター説明PowerShell 7.4での追加
-Name <String[]>待機対象のプロセス名を指定します。複数の名前を指定可能です。
-Id <Int32[]>待機対象のプロセスID(PID)を指定します。複数指定可能です。
-InputObject <Process[]>待機対象のプロセスオブジェクトを指定します。
-Timeout <Int32>最大待機時間(秒単位)を指定します。タイムアウトするとエラー終了します。
-Any複数のプロセスを指定した際、いずれか1つが終了した時点で待機を解除します。(デフォルトでは全てが終了するまで待機)
-PassThru待機が完了した後、終了したプロセスオブジェクトを出力します。(デフォルトでは何も出力しません)

特にPowerShell 7.4で追加された -Any-PassThru は、複数のプロセスを扱う際や、待機後の処理を柔軟にする上で便利なオプションです。

1つのプロセスをIDや名前で指定

Wait-Processコマンドレットで最も基本的な使い方は、特定の1つのプロセスを指定して、その終了を待つことです。

プロセスを指定する方法として、プロセスID(PID)を使用する -Id パラメーターと、プロセス名を使用する -Name パラメーターがあります。

-Id (プロセスID) による指定

プロセスIDは、プロセスが実行されるたびにOSによって一意に割り当てられる番号です。Get-Process コマンドレットなどで事前にIDを取得しておき、それを -Id パラメーターに渡すことで、特定のプロセス(例えば、PIDが「3416」のメモ帳)の終了を正確に待機できます。

この方法は、同じプロセス名(例: notepad.exe)のアプリケーションが複数起動している場合でも、特定のプロセスだけを対象にできる利点があります。

-Name (プロセス名) による指定

-Name パラメーターでは、プロセス名(例: “notepad”)を指定します。

ただし、この方法には注意点があります。もし指定したプロセス名(例: “notepad”)を持つプロセスが複数実行されている場合、Wait-Processは、それら全てのプロセスが終了するまで待機を続けます。

1つのプロセスだけを待つつもりで -Name を使用すると、意図せず長時間待機してしまう可能性があるため、対象のプロセスが確実に1つであると分かっている場合や、特定の名前のプロセス群全てを待ちたい場合に適しています。

パイプライン経由での待機

Wait-Processコマンドレットは、パイプライン(|)からの入力を受け取ることができます。具体的には、Get-Process コマンドレットなどで取得したプロセスオブジェクトを、直接Wait-Processに渡す方法です。

この方法は、-InputObject パラメーターを使用する構文に該当します。

例えば、Get-Process -Name "notepad" でメモ帳のプロセスオブジェクトを取得し、それをパイプラインで Wait-Process に渡すことができます。

Get-Process -Name "notepad" | Wait-Process

このように記述すると、Get-Process が見つけた全ての「notepad」プロセスが終了するまで待機します。

また、Start-Process コマンドレットを -PassThru オプション付きで実行し、起動したプロセスの情報を変数に格納しておき、その変数を Wait-Process に渡す(またはパイプする)といった使い方も一般的です。

$p = Start-Process notepad -PassThru

$p | Wait-Process

この手法は、スクリプト内で起動した特定のプロセスの終了を待ちたい場合に非常に有効であり、可読性も高くなります。

-Timeoutで待機時間を設定

Wait-Processコマンドレットは、デフォルトでは指定したプロセスが終了するまで無期限に待機を続けます。しかし、スクリプトの自動化においては、予期せぬ理由でプロセスが終了しない場合、スクリプト全体が停止してしまう事態は避けたいものです。

そこで役立つのが -Timeout パラメーターです。

このパラメーターを使用すると、待機する最大時間(秒単位)を指定できます。

例えば、Wait-Process -Name “notepad” -Timeout 30 と指定した場合、メモ帳プロセスが終了するのを最大30秒間待ちます。

もし30秒以内にプロセスが終了すれば、Wait-Processは正常に終了し、スクリプトは次の処理に進みます。

一方で、30秒が経過してもプロセスが終了しなかった場合、Wait-Processは待機を打ち切り、終了しないエラー(non-terminating error)を発生させて処理を終了します。

このタイムアウト機能は、プロセスのハングアップ(応答なし)などに備え、スクリプトが無限に待機し続けるのを防ぐための重要な仕組みです。

他のpowershell wait オプションと活用

  • Start-Process -Waitの活用方法
  • 強制停止とは異なるWait-Process
  • Wait-Jobでジョブ終了を監視
  • Wait-Eventでイベント終了を待つ
  • Start-Sleepで指定時間待機する
  • powershell wait オプションのまとめ

Start-Process -Waitの活用方法

PowerShellでプロセスを起動し、その終了を待つ場合、Wait-Process を使う以外にも方法があります。それが Start-Process コマンドレットの -Wait パラメーターを使用する方法です。

Start-Process はプロセスを新しく開始するためのコマンドレットですが、-Wait パラメーターを同時に指定すると、そのプロセスが終了するまでPowerShellの制御を返しません。つまり、コマンドの実行がそこで一時停止します。

Start-Process notepad.exe -Wait

このように記述するだけで、「notepad.exeを起動し、それが閉/られるまで待機する」という動作を実現できます。

Wait-Process を使う場合は、「プロセスを起動する処理」と「終了を待つ処理」の2段階(例: Start-Process してから Wait-Process)が必要になることがありますが、Start-Process -Wait であれば1行で完結できる手軽さがあります。

ただし、Start-Process -Wait は、プロセスツリー(起動したプロセスがさらに子プロセスを作成した場合、その子孫プロセス全て)が終了するまで待機する点が、Wait-Process(特定されたプロセスのみを待機)とは異なります。

注意点

-Wait パラメーターは、外部のEXEファイルなどを実行する際に有効ですが、Out-Null のような他のコマンドレットとパイプラインで組み合わせると、意図した通りに待機しない場合があるため注意が必要です。

強制停止とは異なるWait-Process

PowerShellにおける「Wait(待機)」の概念を理解する上で、Stop-Process(強制停止)との違いを明確にしておくことが大切です。

Wait-Process コマンドレットは、あくまでプロセスが「自然に終了するのを待つ」だけです。プロセスに対して終了するように命令したり、強制的に停止させたりする機能はありません。スクリプトの実行を一時停止し、プロセスの状態を監視しているに過ぎません。

一方、Stop-Process コマンドレットは、指定したプロセスを強制的に終了させるためのものです。アプリケーションが応答しなくなった場合などに使用されます。

インプットされた「記事のデータベース」の例にもあるように、プロセスを停止させてから待機する、という組み合わせは可能です。

$nid = (Get-Process notepad).Id

Stop-Process -Id $nid

Wait-Process -Id $nid

この例では、まず Stop-Process でプロセスに終了シグナルを送り、その後 Wait-Process でプロセスがOSから完全に消去される(=停止処理が完了する)のを待っています。

このように、Wait-Process は「待機」、Stop-Process は「停止」と、役割が全く異なることを理解しておく必要があります。

Wait-Jobでジョブ終了を監視

PowerShellには、処理をバックグラウンドで非同期に実行するための「ジョブ」機能があります。Start-Job コマンドレットを使うと、時間のかかる処理をメインのスクリプトとは別のプロセスで実行させることができます。

Wait-Job コマンドレットは、このバックグラウンドジョブが完了するのを待機するために使用されます。

Wait-Process がOSの「プロセス」を対象とするのに対し、Wait-Job はPowerShellの「ジョブ」を対象とします。

使い方の例としては、まず Start-Job でジョブを開始し、そのジョブオブジェクトを変数に格納します。

$job = Start-Job -ScriptBlock { Start-Sleep -Seconds 10 }

その後、メインのスクリプトで他の処理を実行し、ジョブの結果が必要になったタイミングで Wait-Job $job を呼び出します。

すると、$job が完了する(この例では10秒経過する)まで、スクリプトの実行が一時停止します。

ジョブが完了したら、Receive-Job $job を使ってジョブの実行結果(出力)を取得できます。

このように Wait-Job は、非同期処理の完了を待機し、処理の同期を取るために不可欠なコマンドレットです。

Wait-Eventでイベント終了を待つ

PowerShellには、システムやアプリケーション内で発生する「イベント」を扱う仕組みがあります。Wait-Event コマンドレットは、特定のイベントがトリガーされる(発生する)までスクリプトの実行を待機させるために使用されます。

これは、プロセスやジョブの「終了」を待つのとは異なり、何らかの「発生」を待つという点で特徴的です。

Wait-Event を使用するには、まず Register-EngineEvent などのコマンドレットで、どのようなイベントを購読(監視)するかを登録しておく必要があります。イベントには「ソース識別子(SourceIdentifier)」という名前を付けておきます。

Register-EngineEvent -SourceIdentifier "MyEvent" -Action { Write-Host "イベント受信!" }

上記のようにイベントを登録した後、スクリプトの別の場所(または別のPowerShellセッション)から New-Event コマンドレットでイベントを発生させることができます。

Wait-Event -SourceIdentifier “MyEvent” を実行すると、”MyEvent” という識別子のイベントが発生するまで、スクリプトは待機状態になります。

この仕組みは、例えば、特定のファイルが作成されたこと(WMIイベント)をトリガーにしたり、異なるスクリプト間で通信を行ったりするなど、高度なイベント駆動型の自動化を実現する際に活用されます。

Start-Sleepで指定時間待機する

これまで解説してきた「Wait」関連のコマンドレットは、何らかの「対象」(プロセス、ジョブ、イベント)の状態変化を待つものでした。

一方で、Start-Sleep コマンドレットは、特定の対象を待つのではなく、単純に「指定した時間」だけスクリプトの実行を一時停止させます。

Start-Sleep -Seconds 5

上記のように実行すると、スクリプトは理由に関わらず5秒間停止します。

-Seconds と -Milliseconds

待機時間は -Seconds(秒単位)または -Milliseconds(ミリ秒単位)で指定できます。

-Seconds は Start-Sleep 5 のようにパラメーター名を省略して数値を直接指定することも可能です。

Start-Sleep -Milliseconds 500 (0.5秒待機)

Start-Sleep は、例えばループ処理の中で一定間隔を空けたい場合(例: 1秒ごとにAPIを叩く)や、プロセスが起動するまでのわずかな「間」を確保したい場合など、簡易的な待機処理として非常に便利です。

ただし、プロセスの完了を待つ目的で「多分5秒くらいで終わるだろう」と Start-Sleep 5 を使うのは不確実です。そのような場合は、Wait-Process を使用する方が確実なスクリプトとなります。

powershell wait オプションのまとめ

この記事では、PowerShellで処理の待機(Wait)を行うための様々なオプションとコマンドレットについて解説しました。

以下に、重要なポイントを箇条書きでまとめます。

  • PowerShellでの「待機」はスクリプトの実行順序制御に不可欠
  • Wait-Processは指定したプロセスが終了するまで待機する
  • 待機対象はプロセス名(-Name)で指定可能
  • 待機対象はプロセスID(-Id)で指定可能
  • 待機対象はプロセスオブジェクト(-InputObject)で指定可能
  • -Nameで複数プロセスが該当すると全てが終了するまで待機する
  • -Idは特定の1プロセスを指定するのに確実
  • パイプライン経由(Get-Process | Wait-Process)でも使用できる
  • -Timeoutで最大待機時間(秒)を指定し無限待機を防ぐ
  • -Any(PS 7.4+)は複数指定時にどれか1つが終了すれば待機解除
  • -PassThru(PS 7.4+)は待機完了後にプロセスオブジェクトを返す
  • Start-Process -Waitはプロセスの起動と待機を1行で実行できる
  • Wait-Processは「待機」でありStop-Process(強制停止)とは異なる
  • Wait-JobはStart-Jobで開始したバックグラウンドジョブの完了を待つ
  • Wait-Eventは特定のイベントが発生するまで待機する
  • Start-Sleepは指定した時間(秒またはミリ秒)だけ無条件に待機する
タイトルとURLをコピーしました