のタスクを並列実行します。私は同時に4つのファイルを扱いたい。は、私はこのようにPowerShellスクリプトを持っているのPowerShell
私はforeach-parallelループについて知っていますが、それは[do something]タスクを並行して実行します。私は基本的にforeachループ全体を並列に実行したい。
これをPowerShellでどうすれば実現できますか?
のタスクを並列実行します。私は同時に4つのファイルを扱いたい。は、私はこのようにPowerShellスクリプトを持っているのPowerShell
私はforeach-parallelループについて知っていますが、それは[do something]タスクを並行して実行します。私は基本的にforeachループ全体を並列に実行したい。
これをPowerShellでどうすれば実現できますか?
$block = {
Param([string] $file)
"[Do something]"
}
#Remove all jobs
Get-Job | Remove-Job
$MaxThreads = 4
#Start the jobs. Max 4 jobs running simultaneously.
foreach($file in $files){
While ($(Get-Job -state running).count -ge $MaxThreads){
Start-Sleep -Milliseconds 3
}
Start-Job -Scriptblock $Block -ArgumentList $file
}
#Wait for all jobs to finish.
While ($(Get-Job -State Running).count -gt 0){
start-sleep 1
}
#Get information from each job.
foreach($job in Get-Job){
$info= Receive-Job -Id ($job.Id)
}
#Remove all jobs created.
Get-Job | Remove-Job
各$file
は互いにと並列に実行されている私はそれを持っている上記のコードで(4個まで同時に実行されている):ここでジョブの一例です。
編集:コメントに応じて、hereはscriptblocksに関するドキュメントです。 PowerShell関数とは異なり、scriptblockは中括弧{}の外側にあるパラメータを指定することができないため、パラメータを含める必要がある理由についての短い理由があります。
Get-Help about_Foreach-Parallel
によれば、ForEach -Parallel...
は、各項目の平行全体スクリプトブロックを処理しますが、(Parallel {...}
で括弧に入れた場合、おそらくそれらが並列されるが)スクリプトブロック内のコマンドを順次処理されます。ただし、このスクリプトを受け入れるには、スクリプトがPowerShellのワークフローである必要があります。 Parallel
およびSequence
のキーワードは、ワークフロー内でのみ有効です。
https://msdn.microsoft.com/en-us/powershell/reference/5.1/psworkflow/about/about_foreach-parallelから:Windows PowerShell WorkflowのForEach -Parallel言語の構成について説明します。ワークフローを使用していない場合は、-Parallelパラメータは存在しません。私は、OPがワークフローで作業していると感じることはありませんでした。 – tommymaynard
@tommymaynard - はい、 'Parallel'スイッチと構造はワークフローにのみ適用でき、私はそれに注意しました。 querentは、彼の質問で「Foreach-parallel」の構文について言及しましたが、その影響を誤解しているように見えました。そのため、ワークフローが可能であると仮定し、それに基づいて答えました。彼がいない場合、奇妙な人が与えた仕事の解決策が行く方法かもしれません。 –
あなたは本当に正しいです、あなたはワークフローについて言及しました。それについて申し訳ありません! – tommymaynard
実行中のジョブを取得して完了するのを待つために含まれている全てのファンシーロジックではなく、 'Wait-Job'コマンドレットの使用をお勧めします。 [私が個人的にそれを学んだ、そして好きなラン空間の代替ウォークスルーへのリンク](https://foxdeploy.com/2016/05/17/part-v-powershell-guis-responsive-apps-with-progress- bar /) – TheMadTechnician
ああ、おそらく '$ file'パラメータをあなたのscriptblockに渡さなければならない理由を説明するべきでしょう。 – TheMadTechnician
これについては、今後のスクリプトで検討します。私はWait-Jobが存在するかどうか分からなかった。 – CuriousOne