首页 文章

如何将args传递给平行的foreach

提问于
浏览
0

我得到 endpoints 列表作为我的脚本的参数,我想向所有人发送http请求,但我不能在那里访问我的 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
        }
    }
}

Question: 如何以并行方式发送此HTTP请求?

1 回答

  • 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) {
            ...
        }
    }
    
    # invoke the workflow and collect its output
    $error = a 'https://example.org/foo', 'https://example.com/bar', ...
    

相关问题