Return to Snippet

Revision: 40143
at January 26, 2011 22:00 by itsvetkov


Initial Code
ParallelForEach-Object(
    [ScriptBlock] $Script = { param([Object] $Data) Write-Output $Data },
    [Int] $Threads = 0
)
{

    begin {
        $Jobs = @()
        if ($Threads -eq 0) {
            Get-WmiObject Win32_Processor | ForEach-Object { $Threads = $Threads + $_.NumberOfLogicalProcessors }
        }
        Write-Host "Executing $Threads thread(s)"
    }

    process {
        # Write-Host 'Number of jobs:' $Jobs.Length
        if ($Jobs.Length -ge $Threads) {
            # Write-Host 'Waiting for any job to complete'
            $CompletedJob = Wait-Job $Jobs -Any
            $Jobs = $Jobs -ne $CompletedJob
            Receive-Job $CompletedJob
            Remove-Job $CompletedJob
        }
        $Jobs = $Jobs + (Start-Job $Script -ArgumentList $_)
    }

    end {
        while ($Jobs.Length -gt 0) {
            $CompletedJob = Wait-Job $Jobs -Any
            $Jobs = $Jobs -ne $CompletedJob
            Receive-Job $CompletedJob
            Remove-Job $CompletedJob
        }
    }

}

Initial URL


Initial Description


Initial Title
Parallel “For Each”

Initial Tags


Initial Language
Windows PowerShell