我最近确定,我能够运行一个平行的工作stream程,而不使用foreach。 语法如下。
workflow Get-OS { parallel { Get-WmiObject -Class Win32_OperatingSystem } }
是否有可能扼杀这个工作stream程,而不使用“foreach”? 如果是这样,我打电话时还可以使用pscomputer参数吗? 我知道这是有效的…
workflow Get-OS { param( [string[]]$computers ) foreach -parallel -throttlelimit 50 ($computer in $computers) { Get-WmiObject -ComputerName $computer -Class Win32_OperatingSystem } }
我不知道如何做到这一点,而不需要手动创build“$ computers”参数并在foreach中调用它。 与PSComputerName参数一起使用会使报告更容易。
我认为你在PowerShell工作stream中混淆了两个不同的function:
Parallel (这是一个工作stream基础关键字) -Parallel (一个工作stream特定于foreach循环的参数) Parallel关键字表示:“以下每个语句/序列可以并行执行”。
所以在工作stream程中的一个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以一种有序的顺序返回。
所以,如果你事先知道所有的variables(即计算机名称),你可以这样做:
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