オタク学校はPowerShellで仕事を使用する方法を学びます
PowerShellには、バックグラウンドジョブ、リモートジョブ、WMIジョブ、およびスケジュールジョブの4種類のジョブがあります。それらが何であるか、そしてどのようにそれらを使用することができるかを見つけたら、私たちに加わってください。.
シリーズの前の記事を必ず読んでください。
- PowerShellを使用してWindowsを自動化する方法を学ぶ
- PowerShellでコマンドレットを使用する方法
- PowerShellでオブジェクトを使用する方法を学ぶ
- PowerShellでの書式設定、フィルタリング、および比較の学習
- PowerShellでリモート処理を使用する方法を学ぶ
- PowerShellを使用してコンピューター情報を取得する
- PowerShellでコレクションを操作する
そして、シリーズの残りの部分を一週間中お楽しみに.
バックグラウンドジョブ
今まで私がPowerShellの中であなたが見せてきたものはすべて同期的でした。つまり、シェルに何かをタイプして、そのコマンドが実行を終了するまでそれほど多くのことができないということです。ここでバックグラウンドジョブが発生します。バックグラウンドを開始するには、jobは単にスクリプトブロックを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 switchパラメータを指定する必要があります。.
Get-Job -Name GetFileList |ジョブ受信キープ
仕事が終わったら、それを削除することをお勧めします。ジョブを削除するには、そのジョブをRemove-Jobコマンドレットにパイプ処理するだけです。.
Get-Job -Name GetFileList |削除 - ジョブ
これは、Get-Jobによって返されるジョブのリストからそれを削除します。.
リモートジョブ
先ほど、Invoke-Commandを使用してリモートマシン上でPowerShellコマンドを実行するためにリモート処理を使用する方法について説明しましたが、Invoke-Commandを使用してバックグラウンドでリモート処理ジョブを開始することもできますか。そのためには、単にコマンドの末尾に-AsJobパラメーターを追加します。
起動コマンド-ComputerNameフラッシュ、Viper - 資格管理者-ScriptBlock gci -AsJob
これは簡単なコマンドで、今は実行を終えているはずなので、私たちの仕事の状況を見てみましょう。.
うーん、失敗したようです。これは私が仕事で私の最初の落とし穴に私をもたらします。 PowerShellで任意の種類の新しいジョブを作成すると、ジョブを実行しているすべてのコンピューターに対して1つの子ジョブに加えて1つの親ジョブが作成されます。 Get-Jobコマンドレットを使用すると、親ジョブのみが表示され、stateプロパティは最悪のシナリオになります。つまり、コマンドが100台のコンピュータのうち1台で実行できなかった場合でも、親ジョブの状態は次のようになります。失敗しました。子ジョブのリストを表示するには、IncludeChildJobパラメーターを使用する必要があります。.
あなたがより近くを見れば、あなたは仕事が確かに1台のコンピュータで失敗したことを見るでしょう、そしてそれは次の問題に私達を連れて来ます。ジョブの結果を取得しようとしたときに、親のジョブ名またはIDを指定すると、PowerShellはすべての子ジョブからデータを返します。問題は、いずれかの子ジョブでエラーが発生した場合は、赤いテキストが表示されることです。.
これを回避するには2つの方法があります。まず、どのコンピューターに結果を求めるかがわかっている場合は、Recieve -JobコマンドレットのComputerNameパラメーターを使用するだけです。.
Get-Job-Id 3 |受信 - ジョブ - キープ - コンピュータ名バイパー
あるいは、ジョブIDを使用して特定の子ジョブから結果を取得することもできます。.
Get-Job -Id 3 -IncludeChildJob
Get-Job -Id 5 |ジョブ受信キープ
WMIの仕事
WMIジョブはリモートジョブとほとんど同じで、Get-WmiObjectコマンドレットに追加する必要があるのは-AsJobパラメーターのみです。.
残念ながら、これはそれらが私がRemote Jobsのセクションで述べたのと同じ落とし穴の影響も受けることを意味します。.
スケジュールされた仕事
最後に挙げた3種類の仕事は持続的なものではありませんでした。つまり、現在のセッションでしか利用できないということです。基本的には、ジョブを開始してから別のPowerShellコンソールを開いてGet-Jobを実行した場合、ジョブは表示されません。しかし、あなたが仕事を始めたコンソールに戻ってくると、あなたはそのステータスを見ることができるでしょう。これは、スケジュールされたジョブとは対照的です。 しつこい. 基本的に、Scheduled Jobはスケジュールに従って実行されるスクリプトブロックです。以前は、Windowsタスクスケジューラを使用しても同じ効果が得られた可能性があります。これは、実際にはフードの下で起きていることです。新しいスケジュールジョブを作成するには、次の手順に従います。
Register-ScheduledJob -Name GetEventLogs -ScriptBlock Get-EventLog -LogNameセキュリティ-Trigger(New-JobTrigger - 毎日 - 午後5時)-ScheduledJobOption(New-ScheduledJobOption -RunElevated)
そのコマンドにはたくさんのことが起こっているので、それを分解しましょう。.
- まず、スケジュールされたジョブにGetEventLogsという名前を付けます。.
- その後、トリガーされたときに、指定されたスクリプトブロックの内容を実行するようにします。これにより、基本的にSecurityイベントログの最新の100エントリが取得されます。.
- 次に、トリガーを指定します。 triggerパラメータはトリガオブジェクトを入力として受け取るので、括弧付きのコマンドを使用して毎日午後5時にオフになるトリガを生成しました。.
- イベントログを扱うので、新しいScheduledJobOptionオブジェクトを作成し、それをScheduledJobOptionパラメータに渡すことで指定できる管理者として実行する必要があります。.
これはわずかに異なる種類のジョブであるため、マシン上のすべてのスケジュール済みジョブのリストを取得するためにも異なるコマンドを使用する必要があります。.
Get-ScheduledJob
それだけです。.