start-job Run command in parallel and output result as they arrive

Fenomatik picture Fenomatik · Mar 28, 2013 · Viewed 22.8k times · Source

I am trying to get specific KBXXXXXX existence on a list of servers , but once my script one server it takes time and return result and come back and then move to next one . this script works perfectly fine for me . I want my script to kick off and get-hotfix as job and other process just to collect the results and display them.

$servers = gc .\list.txt 
foreach ($server in $servers) 
{ 
    $isPatched = (Get-HotFix -ComputerName $server | where HotFixID -eq 'KBxxxxxxx') -ne $null 
    If ($isPatched) 
    { 
    write-host $server + "Exist">> .\patchlist.txt} 
    Else  
    { 
    Write-host $server +"Missing"
$server  >> C:\output.txt
    } 

}

The objective it to make the list execute faster rather than running serially.

Answer

Paul Rowland picture Paul Rowland · Mar 28, 2013

With Powershell V2 you can use jobs as in @Andy answer or also in further detail in this link Can Powershell Run Commands in Parallel?

With PowerShell V2 you may also want to check out this script http://gallery.technet.microsoft.com/scriptcenter/Foreach-Parallel-Parallel-a8f3d22b using runspaces

With PowerShell V3 you have the foreach -parallel option.

for example (NB Measure-Command is just there for timing so you could make a comparison)

Workflow Test-My-WF {  
  param([string[]]$servers)

  foreach -parallel ($server in $servers) {

    $isPatched = (Get-HotFix -ComputerName $server | where {$_.HotFixID -eq 'KB9s82018'}) -ne $null     
    If ($isPatched) 
    { 
        $server | Out-File -FilePath "c:\temp\_patchlist.txt" -Append
    } 
    Else  
    { 
        $server | Out-File -FilePath "c:\temp\_output.txt" -Append 
    } 
  }
}

Measure-Command -Expression { Test-My-WF   $servers }