Как передать args на параллельный foreach

Я получаю список конечных точек в качестве аргументов моего скрипта, я хочу отправить 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 ответ

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', ...
Другие вопросы по тегам