否 - “并行”不支持节流限制

否 - “并行”不支持节流限制

我最近确定我能够并行运行工作流而无需使用 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

相关内容