実行時間の長いコマンドを使うとき、実行している間に別の作業をしたくなることがある。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実行形式ファイルになっているコマンド)の実行には問題はないが、別プロセスとなるため、現在の環境が持つ変数や関数などを使うことはできない。この点には注意が必要だ。
この連載の記事
-
第460回
PC
Windowsでsftpを使う -
第459回
PC
WSL 2.4.4ではtar形式でのディストリビューションが配布でき、企業での利用が容易になってきた -
第458回
PC
Windows上でhostsファイルを活用する -
第457回
PC
IPv6アドレスは先頭を見ればどんな種類かわかる -
第456回
PC
あらためてIPv6基本のキ -
第455回
PC
Windowsで現在どのネットワークアダプタがインターネット接続に使われているかを調べる方法 -
第454回
PC
Windows 11 24H2では「デバイスの暗号化」の条件が変わり、より多くのPCでドライブが暗号化される -
第453回
PC
Windows 11 24H2の配布開始後もすぐにはやってこない Windows UpdateとSafeguard Holds -
第452回
PC
Windows 11 Ver.24H2が登場 Copilot+ PCとそうでないPCで実質Windowsが2つに分かれる -
第451回
PC
新しいWindowsサンドボックスではコマンドラインからの制御が可能に -
第450回
PC
ユニコードで文字数を数える方法 - この連載の一覧へ