如何将args传递给并行foreach

时间:2018-12-10 08:30:45

标签: multithreading powershell-workflow

我获得了端点列表作为脚本的参数,我想向所有端点发送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 :(得分:1)

foreach -parallelPowerShell Workflow的构造。不要将工作流与常规PowerShell混淆,因为它们使用可以工作subtly differently的其他引擎。

但是首先,您需要实际调用工作流程。您发布的代码仅对其进行定义,而无需调用它。接下来,由于上述差异,您的代码存在几个问题:

  • 自动变量$args在工作流程中不可用。相反,您必须定义工作流程应接受的参数。

  • Write-Host cmdlet在工作流中不可用。而是使用Write-VerboseWrite-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', ...