このページの本文へ

前へ 1 2 次へ

Windows Info 第411回

Windows PowerShellでバックグラウンドタスクを扱う

2023年12月24日 10時00分更新

文● 塩田紳二 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

 実行時間の長いコマンドを使うとき、実行している間に別の作業をしたくなることがある。WindowsはGUIなので、別のコンソールウィンドウを開けば、別のセッションとしてシェルが起動するので、基本はこれで間に合う。

 しかし、今のセッションと同じ環境でコマンドを使いたいといった場合は、この方法は使えない。たとえば、すでに変数などを使って何かの作業をしているときなど、別のセッション(ウィンドウ)では実行環境が異なる。こうした場合、PowerShellにはバックグラウンド実行という方法がある。

まずは簡単な例を紹介

 まずは簡単な例を使って、バックグラウンド実行を使ってみよう。たとえば、dirコマンド(get-childItemコマンドのエイリアス)をバックグラウンドで実行させてみる。簡易な方法としてバックグラウンド演算子“&”を使う方法がある。これは、Linuxのbashなどと同じ記法だ。ただし、この記法は、Windows標準搭載のWindows PowerShell(Ver.5.1)では利用できない。PowerShell Ver.6以降が必要となる。

dir &

 このときのコマンドの出力は、dirコマンドの出力ではなく、ジョブ(Job)オブジェクトになる。

Windows PowerShellでバックグラウンドタスクを扱う

PowerShell Ver.6以降では、行末にBackground演算子“&”を付けることでコマンドラインをバックグラウンド実行させることができる

 これは略記法で、正式にはJob関連のコマンドのStart-Jobコマンドでする(https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/start-job?view=powershell-7.4)。

Windows PowerShellでバックグラウンドタスクを扱う

 この場合、実行させるコマンドを波括弧「{ }」でくくってスクリプトブロックにする必要がある。

Windows PowerShellでバックグラウンドタスクを扱う

実行に9秒かかったWindows Updateの情報更新も、バックグラウンドで実行すれば、すぐにプロンプトに戻る。実行終了後にReceive-Josコマンドでコマンド実行結果を受け取れる

 以降、このスクリプトブロックやバックグラウンド演算子を使ったコマンドラインを「ジョブコマンド」と表記する。

start-job -ScriptBlock { dir }

 なお、「-ScriptBlock」オブションは省略して「start-job {dir}」とすることもできる。また、エイリアスとしてsajbが定義されているので「sajb {dir}」でも可能だ。

 実際に時間が掛かるコマンドをバックグラウンド処理してみよう。たとえば、Windows Updateの現在の状態を取得するには少し時間がかかる。

((New-Object -ComObject Microsoft.Update.Session).CreateUpdateSearcher()).Search("IsInstalled=0 OR IsInstalled=1").updates &

 ジョブコマンドの実行状態を調べるには、Get-Jobを使う(https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/get-job)。ジョブを起動したときに表示されるIdを覚えているなら、それを使って特定のJobの情報のみを「Get-Job -Id <ジョブのID>」で表示できる。何も指定しなければ、すべてのジョブが表示される。

 なお、ジョブオブジェクトは、起動したらジョブコマンドの実行が終了しても、残ったままになる。不要ならRemove-Jobで削除することができる(https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/remove-job)。

ジョブコマンドの出力を受け取るにはReceive-Jobコマンドを使う(https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/receive-job)。このとき、ジョブのIDを指定する必要がある。Receive-Jobの実行結果を変数に代入することで、ジョブコマンドの出力を変数に入れることができる。

 ジョブコマンドが終了するまで待つには、Wait-Jobコマンドを使う(https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/wait-job)。

 コマンドをJobとして起動すると、実行時間が長いコマンドであっても、すぐにプロンプトに戻ってくる。Jobは別プロセスとしてPowerShellを起動し、その中で指定したコマンドを実行する。単純なPowerShellコマンドや、外部コマンド(Windowsに付属のExe実行形式ファイルになっているコマンド)の実行には問題はないが、別プロセスとなるため、現在の環境が持つ変数や関数などを使うことはできない。この点には注意が必要だ。

前へ 1 2 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン