PowerShell には、バックグラウンド ジョブ、リモート ジョブ、WMI ジョブ、スケジュールされたジョブの 4 種類のジョブがあります。それらが何であり、どのように使用できるかを調べてみましょう。
このシリーズの以前の記事を必ずお読みください。
- PowerShell を使用して Windows を自動化する方法を学ぶ
- PowerShell でオブジェクトを使用する方法を学ぶ
- PowerShell での書式設定、フィルタリング、比較を学習する
- PowerShell でのリモート処理の使用方法を学ぶ
- PowerShell を使用してコンピューター情報を取得する
- PowerShell でのコレクションの操作
今週はシリーズの残りの部分もお楽しみに。
バックグラウンドジョブ
これまで、PowerShell 内で説明してきたことはすべて同期でした。つまり、シェルに何かを入力しても、そのコマンドの実行が終了するまではほとんど何もできません。ここでバックグラウンド ジョブが登場します。バックグラウンドを開始するには、ジョブはスクリプト ブロックを Start-Job コマンドレットに渡すだけです。
Start-Job –Name GetFileList –Scriptblock {Get-ChildItem C:\ –Recurse}
これで、スクリプト ブロックがバックグラウンドで実行されている間、シェル内で自由に何でもできるようになります。
新しいジョブを開始すると、PowerShell はそのジョブを表す新しいジョブ オブジェクトを作成します。 Get-Job コマンドレットを実行すると、いつでもすべてのジョブのリストを取得できます。
ジョブ オブジェクトは、ジョブのステータスを示します。たとえば、上のスクリーンショットでは、GetFileList という BackgroundJob がまだ実行中ですが、すでにデータを返し始めていることがわかります。ジョブの実行時間が長すぎると判断した場合は、Stop-Job にパイプすることで簡単にジョブを停止できます。
Get-Job –Name GetFileList |ジョブの停止
ただし、ジョブを停止すると、停止した時点までに受信したデータは引き続き使用できます。ただし、落とし穴があります。 PowerShell では、ジョブの結果を受信すると、結果は削除されます。それらを維持するには、Receive–Job の keep スイッチ パラメーターを指定する必要があります。
Get-Job –Name GetFileList |ジョブ受信 – 保持
ジョブが終了したら、削除することをお勧めします。ジョブを削除するには、ジョブを Remove-Job コマンドレットにパイプするだけです。
Get-Job –Name GetFileList |ジョブの削除
これにより、Get-Job によって返されるジョブのリストからそのジョブが削除されます。
リモートジョブ
いくつかのレッスン前のレッスンでは、Invoke-Command を使用してリモート マシン上で PowerShell コマンドを実行するリモート処理の方法について説明しましたが、Invoke-Command を使用してバックグラウンドでリモート処理ジョブを開始することもできることをご存知ですか?これを行うには、コマンドの最後に –AsJob パラメータを追加するだけです。
Invoke-Command -ComputerName Flash,Viper -CredentialAdministrator -ScriptBlock {gci} –AsJob
これは単純なコマンドであり、すでに実行が完了しているはずなので、ジョブのステータスを見てみましょう。
うーん、失敗したようですね。これが私に仕事に関する最初の落とし穴をもたらしました。 PowerShell で任意の種類の新しいジョブを作成すると、ジョブを実行しているコンピューターごとに 1 つの子ジョブに加えて 1 つの親ジョブが作成されます。 Get-Job コマンドレットを使用すると、親ジョブのみが表示され、状態プロパティは最悪のシナリオです。つまり、コマンドが 100 台のコンピューターのうち 1 台でのみ実行に失敗した場合でも、親ジョブの状態は次のようになります。失敗した。子ジョブのリストを表示するには、IncludeChildJob パラメーターを使用する必要があります。
よく見てみると、実際にジョブが失敗したのは 1 台のコンピュータだけであることがわかり、次の課題が見えてきます。ジョブの結果を取得しようとするときに、親のジョブ名または ID を指定すると、PowerShell はすべての子ジョブからデータを返します。問題は、子ジョブの 1 つにエラーがあった場合、赤いテキストが残ることです。
これを回避するには 2 つの方法があります。まず、どのコンピューターの結果が必要かわかっている場合は、Recieve –Job コマンドレットの ComputerName パラメーターを使用するだけです。
ジョブの取得 –ID 3 | Receive-Job –Keep –ComputerName Viper
あるいは、ジョブ ID を使用して特定の子ジョブから結果を取得することもできます。
Get-Job -Id 3 –IncludeChildJob
ジョブの取得 -ID 5 |ジョブ受信 – 保持
WMI ジョブ
WMI ジョブはリモート ジョブとほぼ同じで、Get-WmiObject コマンドレットに –AsJob パラメーターを追加するだけで済みます。
残念ながら、これは、リモート ジョブのセクションで説明したのと同じ問題の影響を受けることを意味します。
スケジュールされたジョブ
ここで確認した最後の 3 種類のジョブは永続的ではありません。つまり、現在のセッションでのみ使用可能です。基本的に、これは、ジョブを開始してから別の PowerShell コンソールを開いて Get-Job を実行すると、ジョブが表示されないことを意味します。ただし、ジョブを開始したコンソールに戻ると、そのステータスを確認できるようになります。これは 、永続的な スケジュールされたジョブとは対照的です。基本的に、スケジュールされたジョブは、スケジュールに従って実行されるスクリプト ブロックです。以前は、Windows タスク スケジューラを使用して同じ効果を実現できましたが、実際に内部で起こっているのはこれです。新しいスケジュールされたジョブを作成するには、次の手順を実行します。
Register-ScheduledJob -Name GetEventLogs -ScriptBlock {Get-EventLog -LogName Security -Newest 100} -Trigger (New-JobTrigger -Daily -At 5pm) -ScheduledJobOption (New-ScheduledJobOption -RunElevated)
このコマンドでは非常に多くの処理が行われているので、詳しく見てみましょう。
- まず、スケジュールされたジョブに GetEventLogs という名前を付けます。
- 次に、トリガーされたときに、指定されたスクリプト ブロックの内容を実行するように指示します。これにより、基本的にセキュリティ イベント ログの最新の 100 エントリが取得されます。
- 次にトリガーを指定します。トリガー パラメーターはトリガー オブジェクトを入力として受け取るため、括弧内のコマンドを使用して、毎日午後 5 時に作動するトリガーを生成しました。
- イベント ログを処理しているため、管理者として実行する必要があります。これは、新しい ScheduledJobOption オブジェクトを作成し、それを ScheduledJobOption パラメータに渡すことで指定できます。
これは少し異なるタイプのジョブであるため、マシン上でスケジュールされたすべてのジョブのリストを取得するには、別のコマンドを使用する必要もあります。
スケジュールされたジョブの取得
それだけです。





