Как передать 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', ...