2017-07-18 106 views
0

我會將foreach($computer in $computers)中的所有內容都包含在Start-Job中,以使它們同時運行。唯一的問題是,我需要等待所有的工作完成,然後才能完成底部的ConvertTo-Json等到所有線程完成後再運行下一任務

$sb = "OU=some,OU=ou,DC=some,DC=domain" 
$computers = Get-ADComputer -Filter {(Enabled -eq $true)} -SearchBase "$sb" -Properties * 
$hasmanufacturer = New-Object System.Collections.Generic.List[System.Object] 
foreach($computer in $computers) 
{ 
    $drives = try{@(Get-WMIObject -Class Win32_CDROMDrive -Property * -ComputerName $computer.Name -ErrorAction Stop)} catch {$null} 
    foreach($drive in $drives) 
    { 
     if($drive.Manufacturer) 
     { 
      $hasmanufacturer.Add($computer) 
      continue 
     } 
    } # inner foreach 
} 

ConvertTo-Json $hasmanufacturer 
+0

不相關,但是......爲什麼在出現錯誤時返回'$ null'時爲了使用'-ErrorAction Stop'?刪除'try..catch'和'@()'並使用'-ErrorAction SilentlyContinue'應該具有完全相同的效果。 –

回答

4

執行ConvertTo-Json

+0

這個foreach將創建X個作業(取決於'$ computers'的長度,我認爲'Wait-Job'只等待其中的一個? –

+0

@KolobCanyon也許是它自己的,但不能與'Get-Job '因爲這將正在運行的工作傳遞給它:-)。查看鏈接文檔中的示例1。 – gms0ulman

0

有關使用計算機名稱數組作爲參數Invoke-Command之前如何使用Get-Job | Wait-Job。默認情況下,它將運行32個併發遠程會話。該數字可以通過-Throttle參數進行更改。

$computers = Get-ADComputer -Filter {(Enabled -eq $true)} -SearchBase "OU=Servers,DC=xxx,DC=com" -Properties Name | 
    Where-Object { $_.Name -match 'LAX_*' } | 
    ForEach-Object { $_.Name } 

$computers 

$j = Invoke-Command ` 
    -ComputerName $computers ` 
    -ScriptBlock { Get-WMIObject -Class Win32_CDROMDrive -Property * -ErrorAction Stop } ` 
    -AsJob 

while ((Get-Job -Id $j.Id).Status -eq 'Running') {} 

Get-Job -Id $j.Id | Wait-Job 

$results = Receive-Job -Id $j.Id 
$results 
相關問題