実行時間の長いコマンドを使うとき、実行している間に別の作業をしたくなることがある。WindowsはGUIなので、別のコンソールウィンドウを開けば、別のセッションとしてシェルが起動するので、基本はこれで間に合う。
しかし、今のセッションと同じ環境でコマンドを使いたいといった場合は、この方法は使えない。たとえば、すでに変数などを使って何かの作業をしているときなど、別のセッション(ウィンドウ)では実行環境が異なる。こうした場合、PowerShellにはバックグラウンド実行という方法がある。
まずは簡単な例を紹介
まずは簡単な例を使って、バックグラウンド実行を使ってみよう。たとえば、dirコマンド(get-childItemコマンドのエイリアス)をバックグラウンドで実行させてみる。簡易な方法としてバックグラウンド演算子“&”を使う方法がある。これは、Linuxのbashなどと同じ記法だ。ただし、この記法は、Windows標準搭載のWindows PowerShell(Ver.5.1)では利用できない。PowerShell Ver.6以降が必要となる。
dir &
このときのコマンドの出力は、dirコマンドの出力ではなく、ジョブ(Job)オブジェクトになる。
これは略記法で、正式にはJob関連のコマンドのStart-Jobコマンドでする(https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/start-job?view=powershell-7.4)。
この場合、実行させるコマンドを波括弧「{ }」でくくってスクリプトブロックにする必要がある。
以降、このスクリプトブロックやバックグラウンド演算子を使ったコマンドラインを「ジョブコマンド」と表記する。
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実行形式ファイルになっているコマンド)の実行には問題はないが、別プロセスとなるため、現在の環境が持つ変数や関数などを使うことはできない。この点には注意が必要だ。
この連載の記事
-
第429回
PC
Windows Updateの「利用可能になったらすぐに最新の更新プログラムを入手する」はオンにした方がいいか? -
第428回
PC
Google/Bingで使える検索オプション -
第427回
PC
WindowsのPowerShellのプロファイルを設定する -
第426回
PC
WindowsでAndroidスマホをWebカメラにする機能を試した -
第425回
PC
無料で使えるExcelにWord、Microsoft 365のウェブ版を調べた -
第424回
PC
Windowsの基本機能であるクリップボードについてあらためて整理 -
第423回
PC
PowerShellの今を見る 2つあるPowerShellはどっち使えばいい? -
第422回
PC
Windows 11の目玉機能が早くも終了、Windows Subsystem for Android(WSA)を振り返る -
第421回
PC
進化しているPowerToys LANで接続したマシンでキーボード/マウス共有機能などが追加 -
第420回
PC
Windowsプレビュー版に搭載されたsudoを試す -
第419回
PC
Windows Insider Previewが変わって、今秋登場のWindows 11 Ver.24H2の新機能が見えてきた? - この連載の一覧へ