简体   繁体   中英

Wait until all threads complete before running next task

I would wrap everything inside foreach($computer in $computers) in a Start-Job to make them run simultaneously. The only problem is, I need to wait for all the jobs to complete before I do the ConvertTo-Json at the bottom.

$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

Use a Get-Job | Wait-Job Get-Job | Wait-Job before executing the ConvertTo-Json

How about using the array of computer names as a parameter to Invoke-Command . It will run, by default, 32 concurrent remote sessions. The number can be changed with the -Throttle parameter.

$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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM