Windows PowerShell でのバックグラウンドジョブ ~ その1 ローカルコンピュータでのバックグラウンドジョブ~

PowerShell V1.0 では、バックグラウンドでのジョブ実行ができなかったため、コマンドが完了するまでプロンプト操作をすることができませんでした。

PowerShell 2.0からは、簡単にバックグラウンドジョブの実行することができるようになりました。

今回は、

について説明します。



ローカルコンピューターでのジョブ実行

ローカルコンピュータでバックグラウンドジョブを実行するには、Start-Jobというコマンドプロンプトを使用します。

Satrt-Jobコマンドレットの基本構文は

 

Start-Job -ScriptBlock { バックグラウンドで実行するコマンド }

 

です。

次のコマンドは、Get-Serviceコマンドレットをバックグラウンドで実行します。

実行したバックグランドジョブにはユニークな識別番号(Id)が付きます。

PS> Start-Job -ScriptBlock { Get-Service }

Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Running True localhost Get-Service
どんなに時間がかかる処理でも、すぐにコマンドプロンプトに制御が戻るので、次のコマンドを実行することが可能になります。

実行ジョブの取得と確認

Start-Jobで実行したコマンドは、バックグラウンドで動作するため、後から実行結果を取得しなければなりません。

現在いくつのジョブがバックグラウンドで動作しているのかを確認するには、Get-Jobコマンドレットを使用します。

PS> Get-Job

Id Name State HasMoreData Location Command
-- ---- ----- ----------- -------- -------
1 Job1 Completed True localhost Get-Service
3 Job3 Running True localhost Get-Process...

上記はIdが1と2のジョブが実行されていることがわかります。

またStateの列を見ると、CompletedやRunningとなっており、そのジョブが完了しているのか実行中なのかを確認することができます。

ジョブが失敗した場合には、Failedと表示されます。


ジョブ結果の取得

今度は、バックグラウンドで実行したジョブ結果を取得する方法について説明します。

バックグラウンドで実行したジョブ結果を取得するにはReceive-Jobコマンドレットを使用します。

Receive-Jobコマンドレットの基本構文は

 

Receive-Job -Id ジョブID

 

です。

次のコマンドはジョブIDが1の実行結果を変数に代入しています

$JobResult = Receive-Job -Id 1

 


ジョブ結果取得時の注意点

最後にジョブ結果取得時の注意点について説明します。

バックグラウンドジョブの実行結果はキャッシュに保存されています。

Receive-Jobコマンドレットは、既定ではジョブの結果をキャッシュから削除します。

ジョブの実行が完了している場合には、すべての実行結果が取り出されますが、実行途中のジョブは途中までの結果を返してその分の結果をキャッシュから削除します。

もう1度Receive-Jobコマンドレットを実行すると、先ほど取得した結果の続きを返します。

もしも、キャッシュから削除したくない場合にはkeepパラメータを使用します。

たとえば次のコマンドは、ジョブ結果をキャッシュから取得しますが、キャッシュの中身は削除されません。

$Jobresult =Receive-Job -Id 1 -Keep

 

 

*本記事はWindows XPにインストールしたWindows PowerShell 2.0 RCで検証しております。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>