我最近确定我能够并行运行工作流而无需使用 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 参数执行此操作将使报告变得容易得多。
答案1
否 - “并行”不支持节流限制
我认为您混淆了 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