Назад | Перейти на главную страницу

Параллельный рабочий процесс Powershell

Недавно я определил, что могу запускать рабочий процесс как параллельный без использования foreach. Синтаксис ниже.

workflow Get-OS {
parallel {
    Get-WmiObject -Class Win32_OperatingSystem
    }
}

Можно ли регулировать этот рабочий процесс без использования «foreach»? Если да, могу ли я использовать параметр pscomputer при его вызове? Я знаю, что это работает ...

workflow Get-OS {
param(
[string[]]$computers
)
foreach -parallel -throttlelimit 50 ($computer in $computers) {
    Get-WmiObject -ComputerName $computer -Class Win32_OperatingSystem
    }
}

Я не уверен, как это сделать, не создав вручную параметр «$ computers» и не вызывая его в foreach. Выполнение этого с параметром PSComputerName значительно упростило бы создание отчетов.

Нет - «Параллельный» не поддерживает ограничение газа.


Я думаю, вы путаете две разные функции в рабочих процессах PowerShell:

  • Parallel (что является ключевым словом Workflow Foundation)
  • -Parallel (зависящий от рабочего процесса параметр для foreach петля)

В Parallel ключевое слово означает: «Каждый из следующих операторов / последовательностей может выполняться параллельно».

Так что Parallel блок в рабочем процессе, например:

Workflow Test-Parallel {
    Parallel{
        1
        2
        3
        4
    }
}

Не гарантируется возврат @(1,2,3,4) - он мог возвращать числа в любом порядке.

Чтобы продемонстрировать это, попробуйте следующее:

function Do-Stuff {
    param($i)

    Start-Sleep -Milliseconds $(Get-Random -Minimum 10 -Maximum 400)
    return $i
}

Workflow Test-Parallel {
    Parallel {
        Do-Stuff -i 1
        Do-Stuff -i 2
        Do-Stuff -i 3
        Do-Stuff -i 4
        Do-Stuff -i 5
        Do-Stuff -i 6
        Do-Stuff -i 7
        Do-Stuff -i 8
        Do-Stuff -i 9
        Do-Stuff -i 10
    }
}

Test-Parallel

Вы должны увидеть, что числа от 1 до 10 возвращаются в несколько перемешанном порядке.


Итак, если вы заранее знаете все переменные (т.е. имена компьютеров), вы можете сделать:

Workflow Get-ParallelCS {
    Parallel {
        Get-WmiObject -PSComputerName "client01.domain.tld" -Class "Win32_ComputerSystem"
        Get-WmiObject -PSComputerName "client02.domain.tld" -Class "Win32_ComputerSystem"
        Get-WmiObject -PSComputerName "client03.domain.tld" -Class "Win32_ComputerSystem"
        Get-WmiObject -PSComputerName "client04.domain.tld" -Class "Win32_ComputerSystem"
        Get-WmiObject -PSComputerName "client05.domain.tld" -Class "Win32_ComputerSystem"
        Get-WmiObject -PSComputerName "client06.domain.tld" -Class "Win32_ComputerSystem"
        Get-WmiObject -PSComputerName "client07.domain.tld" -Class "Win32_ComputerSystem"
    }
}

Get-ParallelCS