このページの本文へ

前へ 1 2 次へ

Windows Info 第411回

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

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

文● 塩田紳二 編集● ASCII

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

そもそもジョブとは何?

 コマンドをバックグラウンドで実行するとき、PowerShellでは、「ジョブ」オブジェクトを使って、バックグラウンド実行を表現する。コマンドをバックグラウンド実行すると、ジョブオブジェクトが作られ、このオブジェクトに対して操作を行うことで、実行を停止させる、あるいは状態を調べることができる。ジョブの状態はStateプロパティが表わす。

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

 Stateプロパティを確認するにはGet-Jobコマンドを使う。なお、バックグラウンドジョブは、停止させることは可能だが、中断させることや停止したジョブを再開させることはできない。Running、Completed以外の場合、実行が失敗あるいは他の理由でバックグラウンドジョブは停止している。再実行させるには同じStart-Jobコマンドを実行するしかない。

 バックグラウンド演算子やStart-Jobコマンドで起動するジョブを「Background Job」という。これは複数あるPowerShellジョブの1つだ。

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

 そのほか、WorkflowやCIMJobなどもあるが、特定目的のオブジェクト処理に関するものであり、ここでは解説しない。スケジュールジョブは、タスクスケジューラーのタスクをPowerShellのジョブとして扱うものだ。ここでは、バックグラウンドジョブとスレッドジョブのみを扱う。

 ジョブは、実行中のPowerShellとは別プロセスで起動されるため、ジョブコマンドからは実行中のPowerShellにある変数や関数などにアクセスできない。同様にジョブコマンド側で変数に定義しても、PowerShell側に持ち込むこともできない。

 関数定義や変数へのアクセスが必要になる場合、-InitializationScriptオプションや-ArgumentListオプションを使って必要な情報を渡す。-InitializationScriptオプションを使うと、ジョブコマンドで利用できる関数を定義することができる。

Start-Job -InitializationScript {function mydir($x){ Get-ChildItem $x }} { mydir "D:\temp" }

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

ユーザー定義の関数をジョブコマンド内で使いたい場合には、-InitializationScriptで渡すスクリプトブロックの中に必要な関数定義を入れておく

 -ArgumentListオプションを使うことで、ジョブコマンドに引数を与えることができる。

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

変数の内容を渡したい場合には、-ArgumentListオプションに変数を並べ、ジョブコマンド側でParamステートメントを使って受け取る

 ただし、スクリプトブロック内でParmステートメントを使って受け取る引数を定義しておく必要がある。

$mypath="D:\temp"
start-job -ScriptBlock { param($p); dir $p } -ArgumentList $mypath

 実行結果を受け取る場合には、ジョブコマンドは代入文とせず実行するだけにしてReceive-Jobコマンドの出力を変数に代入する。ただし、-keepオプションを付けないで実行するとその時点の実行結果は消えてしまう。これは、長い実行時間の間に散発的に出力を行うようなコマンドの場合、-keepオプションを付けないReceive-Jobを繰り返すことで最新の出力のみを受け取り可能にするためだ。

Start-Job -ScriptBlock { dir }
$r=Receive-Job -id <ジョブID>

 バックグラウンドジョブが終了し、結果も受け取って用済みとなったときには、Remove-Jobで削除することができる。すべてのジョブを削除したいときには、

Get-Job | Remove-Job

とする。

スレッドジョブ

 スレッドジョブは、現在のPowerShellと同じプロセス内で、スレッドとして実行される。バックグラウンドジョブは、別プロセスを起動するため起動に時間がかかり、メモリなどのリソースを消費する。大量のジョブを並列実行させたときには、起動時間のオーバーヘッドが大きくなる。

 スレッドジョブは、プロセスを生成しないので高速に起動する。しかし、スレッドジョブはジョブコマンド側のエラーが実行中のPowerShellに影響を与える可能性があり、最悪、ジョブコマンドとともにクラッシュする可能性がある。

 速度を取るか、安全性を取るかといった問題だが、単純な外部コマンドなどの実行であれば、起動のオーバーヘットはそれほど問題にならないので、わざわざスレッドジョブを使う必要はないだろう。スレッドジョブは、クラッシュする危険がないコマンドを大量に並行実行させるときに使う。

 スレッドジョブは、起動にStart-ThreadJobコマンド(https://learn.microsoft.com/ja-jp/powershell/module/threadjob/start-threadjob)を用いる以外は、バックグラウンドジョブと同じで、他のバックグラウンドジョブ用のコマンド(Get-Jobなど)をそのまま使う。また、起動オプションに関しても共通して使えるものがある。

 ただし、PowerShell環境としては分離されている(PowerShellのRunspaceを使っている)ため、バックグラウンドジョブと同じく、実行中のPowerShellで定義した関数や変数をジョブコマンドで直接利用できない。Start-Jobと同じく-InitializationScriptオプションや、-ArgumentListオプションを使って必要な情報を渡す。

 かなり時間のかかるUpdate-Helpコマンド(https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/update-help)などもバックグラウンドで処理すれば終了を待つ必要もない。

 PowerShellのバックグラウンド実行には制限も多いが、内部コマンドだけ、あるいは外部コマンドなら、あまり気にする必要はない。自作の関数があるときや変数でパラメーターを指定しているときのみ注意すればよい。

前へ 1 2 次へ

カテゴリートップへ

本記事はアフィリエイトプログラムによる収益を得ている場合があります

この連載の記事

ASCII倶楽部

注目ニュース

  • 角川アスキー総合研究所

プレミアム実機レビュー

ピックアップ
1
KIOXIA(キオクシア) 旧東芝メモリ microSD 128GB UHS-I Class10 (最大読出速度100MB/s) Nintendo Switch動作確認済 国内サポート正規品 メーカー保証5年 KLMEA128G
KIOXIA(キオクシア) 旧東芝メモリ microSD 128GB UHS-I Class10 (最大読出速度100MB/s) Nintendo Switch動作確認済 国内サポート正規品 メーカー保証5年 KLMEA128G
¥2,249
2
【Amazon.co.jp限定】Meta Quest 3S(128GB)購入で『Gorilla Tag』ゲームを無料プレゼント|VRヘッドセット|メモリが33%増加 | 2倍のグラフィック処理性能 |ワイヤレスのVR体験
【Amazon.co.jp限定】Meta Quest 3S(128GB)購入で『Gorilla Tag』ゲームを無料プレゼント|VRヘッドセット|メモリが33%増加 | 2倍のグラフィック処理性能 |ワイヤレスのVR体験
¥50,490
3
Anker PowerLine III Flow USB-C & USB-C ケーブル Anker絡まないケーブル 240W 結束バンド付き USB PD対応 シリコン素材採用 iPhone 17 / 16 / 15 / Galaxy iPad Pro MacBook Pro/Air 各種対応 (1.8m ミッドナイトブラック)
Anker PowerLine III Flow USB-C & USB-C ケーブル Anker絡まないケーブル 240W 結束バンド付き USB PD対応 シリコン素材採用 iPhone 17 / 16 / 15 / Galaxy iPad Pro MacBook Pro/Air 各種対応 (1.8m ミッドナイトブラック)
¥1,290
4
ソニー ゲーミングイヤホン INZONE Buds:WF-G700N Fnatic監修/ワイヤレス / 低遅延2.4GHzワイヤレス接続 USBType-Cトランシーバー同梱/LE Audio対応/アクティブノイズキャンセリング/立体音響 / 最大約24時間バッテリー / 急速充電/マイク付き / PS5 スマホ PC Switch グラスパープル
ソニー ゲーミングイヤホン INZONE Buds:WF-G700N Fnatic監修/ワイヤレス / 低遅延2.4GHzワイヤレス接続 USBType-Cトランシーバー同梱/LE Audio対応/アクティブノイズキャンセリング/立体音響 / 最大約24時間バッテリー / 急速充電/マイク付き / PS5 スマホ PC Switch グラスパープル
¥20,800
5
Anker USB Type C ケーブル PowerLine USB-C & USB-A 3.0 ケーブル iPhone 17 / 16 / 15 /Xperia/Galaxy/LG/iPad Pro/MacBook その他 Android 等 USB-C機器対応 テレワーク リモート 在宅勤務 0.9m ホワイト
Anker USB Type C ケーブル PowerLine USB-C & USB-A 3.0 ケーブル iPhone 17 / 16 / 15 /Xperia/Galaxy/LG/iPad Pro/MacBook その他 Android 等 USB-C機器対応 テレワーク リモート 在宅勤務 0.9m ホワイト
¥640
6
Anker iPhone充電ケーブル PowerLine II ライトニングケーブル MFi認証 超高耐久 iPhone 14 / 14 Pro Max / 14 Plus / 13 / 13 Pro / 12 / 11 / X/XS/XR / 8 Plus 各種対応 (0.9m ホワイト)
Anker iPhone充電ケーブル PowerLine II ライトニングケーブル MFi認証 超高耐久 iPhone 14 / 14 Pro Max / 14 Plus / 13 / 13 Pro / 12 / 11 / X/XS/XR / 8 Plus 各種対応 (0.9m ホワイト)
¥990
7
Kindle Paperwhite シグニチャーエディション (32GB) 7インチディスプレイ、明るさ自動調整、色調調節ライト、12週間持続バッテリー、広告なし、メタリックブラック
Kindle Paperwhite シグニチャーエディション (32GB) 7インチディスプレイ、明るさ自動調整、色調調節ライト、12週間持続バッテリー、広告なし、メタリックブラック
¥23,980
8
Amazon Kindle Paperwhite (16GB) 7インチディスプレイ、色調調節ライト、12週間持続バッテリー、広告なし、ブラック
Amazon Kindle Paperwhite (16GB) 7インチディスプレイ、色調調節ライト、12週間持続バッテリー、広告なし、ブラック
¥18,980
9
CIO フラットスパイラルケーブル CtoC 1m (Type-C/USB-C) PD 急速充電 平型 磁石 マグネット吸着 まとまる 充電ケーブル PD 240W データ転送 480Mbps (ブラック, 1m)
CIO フラットスパイラルケーブル CtoC 1m (Type-C/USB-C) PD 急速充電 平型 磁石 マグネット吸着 まとまる 充電ケーブル PD 240W データ転送 480Mbps (ブラック, 1m)
¥1,680
10
エレコム 電源タップ 6個口 3m 雷ガード 個別スイッチ ほこりシャッター付 耐熱 PSE技術基準適合 ブラック T-K6A-2630BK
エレコム 電源タップ 6個口 3m 雷ガード 個別スイッチ ほこりシャッター付 耐熱 PSE技術基準適合 ブラック T-K6A-2630BK
¥1,590

Amazonのアソシエイトとして、ASCII.jpは適格販売により収入を得ています。

デジタル用語辞典

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