Как передать args на параллельный foreach - PullRequest
0 голосов
/ 10 декабря 2018

Я получаю список конечных точек в качестве аргументов моего скрипта, я хочу отправить http-запрос всем им, но я не хочу делать это последовательно, а скорее одновременно.Я обнаружил, что есть что-то вроде параллельного foreach, однако я не могу получить к нему доступ args.

$errors = @()

workflow a {
    foreach -Parallel ($endpoint in $args) { 
        $HTTP_Request = [System.Net.WebRequest]::Create($endpoint)

        try {
            $HTTP_Response = $HTTP_Request.GetResponse()
            $HTTP_Status = [int]$HTTP_Response.StatusCode

            if ($HTTP_Status -eq 200) {
                Write-Host "OK"
            }
        } catch {
            $errors += $endpoint + ": " + $_.Exception.Message
        }
    }
}

Вопрос: Как отправить этот HTTP-запрос в параллельном режиме?

1 Ответ

0 голосов
/ 10 декабря 2018

foreach -parallel является PowerShell Workflow конструкцией.Рабочие процессы не следует путать с обычным PowerShell, поскольку они используют другой движок, который работает немного по-другому .

Но, прежде всего, вам нужно фактически запустить рабочий процесс.Код, который вы разместили, просто определяет его, даже не вызывая его.Далее, есть несколько проблем с вашим кодом из-за вышеупомянутых различий:

  • Автоматическая переменная $args недоступна в рабочих процессах.Вместо этого вы должны определить параметры, которые должен принимать ваш рабочий процесс.

  • Командлет Write-Host недоступен в рабочих процессах.Вместо этого используйте Write-Verbose или Write-Debug для вывода статуса.

  • Нельзя обновлять переменные, определенные вне рабочего процесса, из рабочего процесса.Вместо этого соберите выходные данные рабочего процесса в переменную.

# define the workflow
workflow a {
    Param($endpointList)

    foreach -parallel ($endpoint in $endpoint_list) {
        Write-Output $endpoint     # <-- workflow will return this
        'something'                # <-- this too
        ...
    }
}

# invoke the workflow and collect its output
$errors = a 'https://example.org/foo', 'https://example.com/bar', ...
...