このページの本文へ

前へ 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,413
2
【Amazon.co.jp限定】 ロジクール 静音 ワイヤレス トラックボール マウス M575SPd Bluetooth Logibolt 無線 windows mac iPad OS Chrome トラックボールマウス ブラック M575 M575SP 国内正規品 ※Amazon.co.jp限定 壁紙ダウンロード付き
【Amazon.co.jp限定】 ロジクール 静音 ワイヤレス トラックボール マウス M575SPd Bluetooth Logibolt 無線 windows mac iPad OS Chrome トラックボールマウス ブラック M575 M575SP 国内正規品 ※Amazon.co.jp限定 壁紙ダウンロード付き
¥7,313
3
エレコム 電源タップ 6個口 3m 雷ガード 個別スイッチ ほこりシャッター付 耐熱 PSE技術基準適合 ブラック T-K6A-2630BK
エレコム 電源タップ 6個口 3m 雷ガード 個別スイッチ ほこりシャッター付 耐熱 PSE技術基準適合 ブラック T-K6A-2630BK
¥1,899
4
CIO フラットスパイラルケーブル CtoC (Type-C/USB-C) PD 急速充電 平型 磁石 マグネット吸着 まとまる 充電ケーブル PD 240W データ転送 480Mbps 形状記憶 iPhone 17 / 16 / 15 Macbook Pro/Air/iPad用/ノートパソコン Galaxy Google Pixel Android (ライトブラック, 1.5m)
CIO フラットスパイラルケーブル CtoC (Type-C/USB-C) PD 急速充電 平型 磁石 マグネット吸着 まとまる 充電ケーブル PD 240W データ転送 480Mbps 形状記憶 iPhone 17 / 16 / 15 Macbook Pro/Air/iPad用/ノートパソコン Galaxy Google Pixel Android (ライトブラック, 1.5m)
¥2,290
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 ホワイト
¥740
6
Anker Zolo USB-C & USB-C ケーブル (240W, 高耐久ナイロン) 1.8m ブラック iPhone 17 / 16 / 15 Galaxy iPad Pro MacBook Pro/Air 各種対応
Anker Zolo USB-C & USB-C ケーブル (240W, 高耐久ナイロン) 1.8m ブラック iPhone 17 / 16 / 15 Galaxy iPad Pro MacBook Pro/Air 各種対応
¥1,590
7
Anker Nano Charging Station (7-in-1, 100W, 巻取り式 USB-C ケーブル) (USBタップ 電源タップ) 【PSE技術基準適合】MacBook iPad iPhone Galaxy Android ブラック
Anker Nano Charging Station (7-in-1, 100W, 巻取り式 USB-C ケーブル) (USBタップ 電源タップ) 【PSE技術基準適合】MacBook iPad iPhone Galaxy Android ブラック
¥9,990
8
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
9
Verbatim バーベイタム 1回録画用 ブルーレイディスク BD-R 25GB 50枚+3枚増量パック インクジェットプリンタ対応 ホワイト 片面1層 1-6倍速
Verbatim バーベイタム 1回録画用 ブルーレイディスク BD-R 25GB 50枚+3枚増量パック インクジェットプリンタ対応 ホワイト 片面1層 1-6倍速
¥2,480
10
ソニー ゲーミングイヤホン 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

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

デジタル用語辞典

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