Powershellバックグラウンド・ジョブ、非同期オペレーション・インスタンス

2335 ワード

Powershellは単一スレッドプログラムであり、一度に1つのことしかできません.バックグラウンドジョブでは、Powershellプロセスがバックグラウンドでジョブを処理するのを追加できます.プログラムを同時に実行する必要があり、データ量が大きくない場合は、問題を解決できます.しかし、Powershellのバックグラウンドからデータを返信するのは非常に面倒な仕事であり、多くの時間を浪費します.スクリプトが遅くなります.
ここには3つの同時実行タスクがあります.
 
  
$start = Get-Date

# get all hotfixes
$task1 = { Get-Hotfix }

# get all scripts in your profile
$task2 = { Get-Service | Where-Object Status -eq Running }

# parse log file
$task3 = { Get-Content -Path $env:windir\windowsupdate.log | Where-Object { $_ -like '*successfully installed*' } }

# run 2 tasks in the background, and 1 in the foreground task
$job1 =  Start-Job -ScriptBlock $task1
$job2 =  Start-Job -ScriptBlock $task2
$result3 = Invoke-Command -ScriptBlock $task3

# wait for the remaining tasks to complete (if not done yet)
$null = Wait-Job -Job $job1, $job2

# now they are done, get the results
$result1 = Receive-Job -Job $job1
$result2 = Receive-Job -Job $job2

# discard the jobs
Remove-Job -Job $job1, $job2

$end = Get-Date
Write-Host -ForegroundColor Red ($end - $start).TotalSeconds

上記のすべてのタスクを実行するのに5.9秒かかりました.3つのタスクの結果は、$result 1,$result 2,$result 3にそれぞれ格納されます.引き続き、フロントでコマンドを実行するのにどれくらいの時間がかかるかを確認します.
 
  
$start = Get-Date

# get all hotfixes
$task1 = { Get-Hotfix }

# get all scripts in your profile
$task2 = { Get-Service | Where-Object Status -eq Running }

# parse log file
$task3 = { Get-Content -Path $env:windir\windowsupdate.log | Where-Object { $_ -like '*successfully installed*' } }

# run them all in the foreground:
$result1 = Invoke-Command -ScriptBlock $task1
$result2 = Invoke-Command -ScriptBlock $task2
$result3 = Invoke-Command -ScriptBlock $task3

$end = Get-Date
Write-Host -ForegroundColor Red ($end - $start).TotalSeconds

結局、今回は5.05秒しかかかりませんでした.バックグラウンドジョブとほぼ同時に完了するので、バックグラウンドジョブは長時間実行するタスクを解決するのに適しています.3つのタスクから返されるデータを見ると、このような順数でフロントでデータを取得することで、実行プロセスのオーバーヘッドを削減できるという利点があります.