PowerShell で各コマンドが終了するのを待つ

Marion Paul Kenneth Mendoza 2023年1月30日
  1. PowerShell で Out コマンドを使用して各コマンドが終了するのを待つ
  2. PowerShell で Start-Process コマンドレットを使用して各コマンドが終了するのを待つ
  3. PowerShell でバックグラウンドジョブを使用して各コマンドが終了するのを待つ
  4. PowerShell で Wait-Process コマンドレットを使用して、各コマンドが終了するのを待つ
  5. PowerShell で [Diagnostics.Process] クラスを使用して各コマンドが終了するのを待つ
PowerShell で各コマンドが終了するのを待つ

通常、Windows PowerShell は、次のコマンドを開始する前に内部コマンドを待機します。

この規則の 1つの例外は、外部の Windows サブシステムベースの EXE です。さらに、Windows PowerShell は、実行可能プログラムの実行時にコマンドが終了するのを待ちません。

この記事では、Windows PowerShell 環境で、実行可能ファイルを含むコマンドが終了するのを待ってから、次のコマンドに移動する方法を説明します。

PowerShell で Out コマンドを使用して各コマンドが終了するのを待つ

前述のように、実行可能ファイルを実行すると、コマンドが終了するのを待たずに、次のコマンドに直接移動します。特にアプリケーションを順番に実行するスクリプトを作成する場合は、これを回避する必要があるかもしれません。

気の利いたトリックの 1つは、Out-Null のような Out コマンドの 1つを使用することです。アプリケーションを実行するときに、Out-Null コマンドレットをパイプ処理すると、Windows PowerShell がだまされて、実行中のアプリケーション上で基になるコマンドレットが実行されます。

コマンドレット Out-Null はコンソールに何も表示しないため、標準で実行されているアプリケーションのように見えることに注意してください。唯一の違いは、コマンドライン全体が実行されるのを待つことです。

サンプルコード:

Notepad.exe | Out-Null

使用できる Out コマンドの他の例は次のとおりです。

  • Out-Default - 出力をデフォルトのフォーマット環境とデフォルトの出力コマンドレットに送信します。
  • Out-File - 出力をファイルに送信します。
  • Out-GridView - 別のウィンドウのインタラクティブテーブルに出力を送信します。
  • Out-Host - 出力をコマンドラインに送信します。
  • Out-Printer - 出力をプリンターに送信します。
  • Out-String - オブジェクトを一連の文字列としてホストに送信します。

PowerShell で Start-Process コマンドレットを使用して各コマンドが終了するのを待つ

コマンドラインが終了するまで Windows PowerShell を待機させるもう 1つの方法は、Start-Process コマンドレットです。

たとえば、Start-Process コマンドレットの -Wait パラメーターを使用すると、Windows PowerShell はプロセスが終了するのを待ってから、次のコマンドラインを実行します。

Start-Process notepad.exe -NoNewWindow -Wait
上記の例の -NoNewWindow パラメーターは、新しいコンソールウィンドウを開かずに現在のプロセスを開始します。

PowerShell コミュニティ拡張バージョンを使用して、新しいオブジェクトが最初に作成されます。オブジェクトが作成されると、WaitForExit() 関数が呼び出されます。

$proc = Start-Process notepad.exe -NoNewWindow -PassThru
$proc.WaitForExit()

PowerShell でバックグラウンドジョブを使用して各コマンドが終了するのを待つ

コマンドラインが終了するまで Windows PowerShell を待機させる別の方法は、バックグラウンドジョブを使用することです。

バックグラウンドジョブは、ローカルマシンの別のプロセスで実行されるコマンドまたはコマンドのセットです。バックグラウンドジョブの構文例を以下に示します。

$job = Start-Job { notepad.exe }
Wait-Job $job
Receive-Job $job

Wait-Job コマンドレットを呼び出すと、コマンドラインで Receive-Job が呼び出されるまでプロセスが待機します。

PowerShell で Wait-Process コマンドレットを使用して、各コマンドが終了するのを待つ

Windows PowerShell にコマンドラインの終了を待機させるもう 1つの方法は、Wait-Process コマンドレットです。

最初の例のように、これを実行可能ファイルにパイプして、コマンドラインが終了するのを待つことができます。ただし、このコマンドレットの使用は、Windows PowerShell バージョン 5.1 以下でのみ機能し、最新の PowerShell(Core)7 では機能しません。

Notepad.exe | Wait-Process

PowerShell で [Diagnostics.Process] クラスを使用して各コマンドが終了するのを待つ

システムに .NET ライブラリがインストールされている場合は、[Diagnostics.Process] クラスを使用して、プロセスが終了するのを待ってから、次のコマンドラインに移動できます。

ただし、これを使用することはお勧めしません。他のより単純なコマンドレットが Windows PowerShell 内で利用可能であり、十分に活用できるためです。PowerShell コマンドが使用できない場合にのみ、.NET ライブラリを使用してください。

[Diagnostics.Process]::Start('notepad.exe').WaitForExit()
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn