Powershell Workflow Parallel

2

Recentemente, determinei que posso executar um fluxo de trabalho como paralelo sem usar o foreach. A sintaxe está abaixo.

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

É possível limitar esse fluxo de trabalho sem usar "foreach"? Se assim for, ainda posso usar o parâmetro pscomputer quando o chamar? Eu sei que isso funciona ...

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

Não sei como fazer isso sem criar um parâmetro "$ computers" manualmente e chamá-lo no foreach. Fazê-lo com o parâmetro PSComputerName tornaria a reportagem muito mais fácil.

    
por Acerbity 23.03.2015 / 19:31

1 resposta

3

Não - "Paralelo" não suporta um limite de aceleração

Acho que você está confundindo duas funcionalidades distintas nos fluxos de trabalho do PowerShell:

  • Parallel (que é uma palavra-chave do Workflow Foundation)
  • -Parallel (um parâmetro específico do fluxo de trabalho para o loop foreach )

A palavra-chave Parallel significa: "Cada uma das seguintes instruções / sequências pode ser executada em paralelo".

Então, um bloco Parallel em um fluxo de trabalho, como este:

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

Não é garantido que retorne @(1,2,3,4) - poderia retornar os números em qualquer ordem.

Para demonstrar isso, tente o seguinte:

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

Você deve ver que os números de 1 a 10 são retornados de forma embaralhada.

Então, se você conhece todas as variáveis (ou seja, os nomes dos computadores) de antemão, você pode fazer:

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
    
por 23.03.2015 / 21:05

Tags