multithreadingpowershellparallel-processing

Can Powershell Run Commands in Parallel?


I have a powershell script to do some batch processing on a bunch of images and I'd like to do some parallel processing. Powershell seems to have some background processing options such as start-job, wait-job, etc, but the only good resource I found for doing parallel work was writing the text of a script out and running those (PowerShell Multithreading)

Ideally, I'd like something akin to parallel foreach in .net 4.

Something pretty seemless like:

foreach-parallel -threads 4 ($file in (Get-ChildItem $dir))
{
   .. Do Work
}

Maybe I'd be better off just dropping down to c#...


Solution

  • You can execute parallel jobs in Powershell 2 using Background Jobs. Check out Start-Job and the other job cmdlets.

    # Loop through the server list
    Get-Content "ServerList.txt" | %{
     
      # Define what each job does
      $ScriptBlock = {
        param($pipelinePassIn) 
        Test-Path "\\$pipelinePassIn\c`$\Something"
        Start-Sleep 60
      }
     
      # Execute the jobs in parallel
      Start-Job $ScriptBlock -ArgumentList $_
    }
     
    Get-Job
     
    # Wait for it all to complete
    While (Get-Job -State "Running")
    {
      Start-Sleep 10
    }
     
    # Getting the information back from the jobs
    Get-Job | Receive-Job