我获得了端点列表作为脚本的参数,我想向所有端点发送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请求?
答案 0 :(得分:1)
foreach -parallel
是PowerShell Workflow的构造。不要将工作流与常规PowerShell混淆,因为它们使用可以工作subtly differently的其他引擎。
但是首先,您需要实际调用工作流程。您发布的代码仅对其进行定义,而无需调用它。接下来,由于上述差异,您的代码存在几个问题:
自动变量$args
在工作流程中不可用。相反,您必须定义工作流程应接受的参数。
Write-Host
cmdlet在工作流中不可用。而是使用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', ...