Geek School:PowerShellでジョブを使用する方法を学ぶ

目次:

Geek School:PowerShellでジョブを使用する方法を学ぶ - ブログ 2023
Geek School:PowerShellでジョブを使用する方法を学ぶ - ブログ 2023
Anonim
PowerShellには、バックグラウンドジョブ、リモートジョブ、WMIジョブ、およびスケジュールされたジョブの4種類のジョブがあります。彼らが何であり、どのように使用できるかを知るときに私たちと一緒にいてください。
PowerShellには、バックグラウンドジョブ、リモートジョブ、WMIジョブ、およびスケジュールされたジョブの4種類のジョブがあります。彼らが何であり、どのように使用できるかを知るときに私たちと一緒にいてください。

シリーズの前の記事を必ず読んでください:

  • PowerShellでWindowsを自動化する方法を学ぶ
  • PowerShellでコマンドレットを使用する方法の学習
  • PowerShellでオブジェクトを使用する方法を学習する
  • PowerShellでの書式設定、フィルタリング、および比較の学習
  • PowerShellでRemotingを使用する方法を学ぶ
  • PowerShellを使用してコンピュータ情報を取得する
  • PowerShellでコレクションを操作する

そして、一週間中、残りのシリーズのために調整しておいてください。

バックグラウンドジョブ

今まで私がPowerShellの中で示してきたことはすべて同期していました。つまり、シェルに何かを入力して、コマンドが実行を終了するまでは実際にはあまりできません。これはバックグラウンドジョブが入ってくる場所です。バックグラウンドを開始するには、スクリプトブロックをStart-Jobコマンドレットに渡します。

Start-Job –Name GetFileList –Scriptblock {Get-ChildItem C: –Recurse}

スクリプトブロックがバックグラウンドで実行されている間、シェル内で必要なことを自由に実行できるようになりました。
スクリプトブロックがバックグラウンドで実行されている間、シェル内で必要なことを自由に実行できるようになりました。
新しいジョブを開始すると、PowerShellはそのジョブを表す新しいジョブオブジェクトを作成します。 Get-Jobコマンドレットを実行すると、いつでもすべてのジョブの一覧を取得できます。
新しいジョブを開始すると、PowerShellはそのジョブを表す新しいジョブオブジェクトを作成します。 Get-Jobコマンドレットを実行すると、いつでもすべてのジョブの一覧を取得できます。
ジョブオブジェクトは、ジョブのステータスを表示します。たとえば、上記のスクリーンショットでは、GetFileListというBackgroundJobがまだ実行されていますが、データの返却を開始していることがわかります。いつでもジョブが長時間実行されていると判断した場合は、ジョブをStop-Jobにパイプして簡単に停止できます。
ジョブオブジェクトは、ジョブのステータスを表示します。たとえば、上記のスクリーンショットでは、GetFileListというBackgroundJobがまだ実行されていますが、データの返却を開始していることがわかります。いつでもジョブが長時間実行されていると判断した場合は、ジョブをStop-Jobにパイプして簡単に停止できます。

Get-Job –Name GetFileList | Stop-Job

しかし、いったんジョブを停止すると、そのデータを停止した時点までに受け取ったデータはそのまま残っています。しかし、邪魔があります。 PowerShellでは、ジョブの結果を受け取ると、それらは削除されます。それらを残すには、Receive-Jobのkeep switchパラメータを指定する必要があります。
しかし、いったんジョブを停止すると、そのデータを停止した時点までに受け取ったデータはそのまま残っています。しかし、邪魔があります。 PowerShellでは、ジョブの結果を受け取ると、それらは削除されます。それらを残すには、Receive-Jobのkeep switchパラメータを指定する必要があります。

Get-Job –Name GetFileList | Receive-Job –Keep

仕事を終えたら、それを削除することをお勧めします。ジョブを削除するには、ジョブをRemove-Jobコマンドレットにパイプするだけです。
仕事を終えたら、それを削除することをお勧めします。ジョブを削除するには、ジョブをRemove-Jobコマンドレットにパイプするだけです。

Get-Job –Name GetFileList | Remove-Job

これにより、Get-Jobによって返されるジョブの一覧から削除されます。

Image
Image

リモートジョブ

いくつかのレッスン前に、Invoke-Commandを使用してリモートマシンでリモート処理を使用してPowerShellコマンドを実行する方法を見てきましたが、Invoke-Commandを使用してバックグラウンドでリモートジョブを開始できることも知っていましたか?これを行うには、単にコマンドの最後に-AsJobパラメータを追加します。

Invoke-Command -ComputerName Flash,Viper -Credential administrator -ScriptBlock {gci} –AsJob

これは簡単なコマンドであり、今実行しているはずですので、私たちの仕事の状態を見てみましょう。
これは簡単なコマンドであり、今実行しているはずですので、私たちの仕事の状態を見てみましょう。
うーん、失敗したようだ。これは仕事で私の最初の邪魔に私をもたらします。 PowerShellで任意の種類の新しいジョブを作成すると、ジョブを実行しているすべてのコンピュータに対して、1つの子ジョブに加えて1つの親ジョブが作成されます。 Get-Jobコマンドレットを使用すると、親ジョブのみが表示され、stateプロパティは最悪のシナリオです。つまり、コマンドが100台のコンピュータのうちの1台で実行されなかったとしても、親ジョブの状態では失敗しました。子ジョブのリストを表示するには、IncludeChildJobパラメーターを使用する必要があります。
うーん、失敗したようだ。これは仕事で私の最初の邪魔に私をもたらします。 PowerShellで任意の種類の新しいジョブを作成すると、ジョブを実行しているすべてのコンピュータに対して、1つの子ジョブに加えて1つの親ジョブが作成されます。 Get-Jobコマンドレットを使用すると、親ジョブのみが表示され、stateプロパティは最悪のシナリオです。つまり、コマンドが100台のコンピュータのうちの1台で実行されなかったとしても、親ジョブの状態では失敗しました。子ジョブのリストを表示するには、IncludeChildJobパラメーターを使用する必要があります。
あなたがもっと見ると、実際には1台のコンピューターでしか失敗していないことがわかります。これが次の問題につながります。ジョブの結果を取得しようとすると、親のジョブ名またはIDを指定すると、PowerShellはすべての子ジョブのデータを返します。問題は、子ジョブの1つにエラーがあった場合、赤いテキストが残ってしまうことです。
あなたがもっと見ると、実際には1台のコンピューターでしか失敗していないことがわかります。これが次の問題につながります。ジョブの結果を取得しようとすると、親のジョブ名またはIDを指定すると、PowerShellはすべての子ジョブのデータを返します。問題は、子ジョブの1つにエラーがあった場合、赤いテキストが残ってしまうことです。
これを回避するには2つの方法があります。まず、結果を求めるコンピュータがわかっている場合は、Recieve -JobコマンドレットのComputerNameパラメータを使用します。
これを回避するには2つの方法があります。まず、結果を求めるコンピュータがわかっている場合は、Recieve -JobコマンドレットのComputerNameパラメータを使用します。

Get-Job –Id 3 | Receive-Job –Keep –ComputerName Viper

または、そのジョブIDを使用して特定の子ジョブから結果を取得することもできます。
または、そのジョブIDを使用して特定の子ジョブから結果を取得することもできます。

Get-Job -Id 3 –IncludeChildJob

Image
Image

Get-Job -Id 5 | Receive-Job –Keep

Image
Image

WMIジョブ

WMIジョブは、リモートジョブとほぼ同じです。このため、-AsJobパラメータのみをGet-WmiObjectコマンドレットに追加する必要があります。

Image
Image
残念ながら、これはリモートジョブの項で述べたのと同じ問題を抱えていることを意味します。
残念ながら、これはリモートジョブの項で述べたのと同じ問題を抱えていることを意味します。

スケジュールされたジョブ

最後に見た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)

そのコマンドにはかなり多くのことがありますので、それを分解しましょう。

  • まず、Scheduled JobにGetEventLogsという名前を付けます。
  • その後トリガされると、指定されたスクリプトブロックの内容を実行し、基本的にセキュリティイベントログの最新の100エントリを取得するようにします。
  • 次に、トリガーを指定します。トリガ・パラメータはトリガ・オブジェクトを入力として使用するため、括弧内のコマンドを使用して毎日午後5時にトリガするトリガを生成します。
  • イベントログを扱っているので、新しいScheduledJobOptionオブジェクトを作成し、それをScheduledJobOptionパラメータに渡すことで指定できる管理者として実行する必要があります。
これはジョブの種類が多少異なるため、マシン上のすべてのスケジュールされたジョブのリストを取得するために、別のコマンドを使用する必要もあります。
これはジョブの種類が多少異なるため、マシン上のすべてのスケジュールされたジョブのリストを取得するために、別のコマンドを使用する必要もあります。

Get-ScheduledJob

Image
Image

それがすべてです。

人気のあるトピック

専門家の助言