2017-07-18 8 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

Invoke-Commandへのパラメータとして、コンピュータ名の配列を使用することについてConvertTo-Json

+0

foreachは '$ computers'の長さに依存してX個のジョブを生成しますが、' Wait-Job'はそれらの1つのみを待ちますか? –

+0

@KolobCanyon 'Get-Job 'これは実行中のジョブをそれに渡します:-)。リンクされたドキュメントの例1を参照してください。 – gms0ulman

0

方法を実行する前Get-Job | Wait-Jobを使用してください。既定では、32の同時リモートセッションが実行されます。数値は-Throttleパラメータで変更できます。

関連する問題