Недавно я определил, что могу запускать рабочий процесс как параллельный без использования 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