J'ai un script PowerShell comme celui-ci:
Foreach ($file in $files) {
[Do something]
[Do something]
[Do something]
}
De cette façon, un fichier est traité après l'autre. Je veux traiter 4 fichiers en même temps.
Je connais la boucle foreach -parallel, mais cela fait les tâches [faire quelque chose] en parallèle. Je veux essentiellement exécuter toute la boucle foreach en parallèle.
Comment puis-je y parvenir dans PowerShell?
Vous pouvez examiner Jobs ou runspaces . Voici un exemple de Jobs:
$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
Dans le code ci-dessus, je l'ai où chaque $file
fonctionne en parallèle les uns avec les autres (jusqu'à 4 fonctionnant simultanément).
EDIT: En réponse aux commentaires, ici est une documentation sur les blocs de script. La courte raison pour laquelle vous devez inclure le paramètre est que, contrairement aux fonctions PowerShell, les blocs de script ne peuvent pas spécifier de paramètres en dehors des accolades {}.
Selon Get-Help about_Foreach-Parallel
, ForEach -Parallel...
traitera le bloc de script entier en parallèle pour chaque élément, mais les commandes du bloc de script seront traitées séquentiellement (bien qu'elles soient vraisemblablement parallélisées si elles sont placées entre crochets avec Parallel {...}
). Cependant, votre script doit être un flux de travail PowerShell pour que cela soit accepté; les mots clés Parallel
et Sequence
ne sont efficaces que dans les workflows.