Este dilema se puede abordar de diversas formas, por lo tanto te damos la resolución más completa para nosotros.
Solución:
Puede buscar trabajos o espacios de ejecución. Aquí hay un ejemplo de trabajos:
$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
En el código anterior lo tengo donde cada $file
está funcionando en paralelo entre sí (hasta 4 funcionando simultáneamente).
EDITAR: en respuesta a los comentarios, aquí hay alguna documentación sobre scriptblocks. La breve razón por la que debe incluir el parámetro es que, a diferencia de las funciones de PowerShell, los bloques de secuencias de comandos no pueden especificar parámetros fuera de las llaves .
Powershell 7 presenta foreach-object -parallel
:
https://devblogs.microsoft.com/powershell/powershell-foreach-object-parallel-feature/
Tu script diría entonces
$files | ForEach-Object -parallel
[Do something]
[Do something]
[Do something]
De acuerdo a Get-Help about_Foreach-Parallel
, ForEach -Parallel...
procesará todo el bloque de secuencias de comandos en paralelo para cada elemento, pero los comandos en el bloque de secuencias de comandos se procesarán secuencialmente (aunque presumiblemente se paralelizarán si están entre paréntesis con Parallel ...
). Sin embargo, su secuencia de comandos debe ser un flujo de trabajo de PowerShell para que se acepte; los Parallel
y Sequence
las palabras clave solo son efectivas dentro de los flujos de trabajo.
Tienes la opción de respaldar nuestra función mostrando un comentario o valorándolo te lo agradecemos.