1

我将端点列表作为脚本的参数,我想向所有端点发送 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 请求?

4

1 回答 1

2

foreach -parallel是一个PowerShell 工作流构造。不要将工作流与常规 PowerShell 混淆,因为它们使用不同的引擎,其工作方式略有不同

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

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

  • Write-Hostcmdlet 在工作流中不可用。而是使用Write-VerboseorWrite-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', ...
于 2018-12-10T08:53:59.307 回答