首页 > 解决方案 > Powershell 的 Invoke-RestMethod 在循环中调用时不等待响应

问题描述

有一些类似的帖子,但没有完全相同(或者他们没有清楚地描述这个问题,如果他们是相同的)。

我有一个脚本,它使用 Invoke-RestMethod 进行一次 API 调用,然后迭代该调用的结果,使用其中的值进行其他调用。值替换等很好,我可以看到(通过使用 Write-Host 转储 Uri 以及从 API 日志本身)调用正在成功进行。

如果我这样做:

$team = @{ "id" = 5 }
$response = Invoke-RestMethod -Uri https://theUri/$($team.id) -Headers $header -Method Get

然后 $response 会按照您的预期填充,并包含来自 API 端点的 json 响应。响应时间为几百毫秒。

另一方面,如果我有一组团队对象并执行以下操作:

foreach ($team in $teams)
{
    $response = Invoke-RestMethod -Uri https://theUri/$($team.id) -Headers $header -Method Get
    Write-Host $response
}

然后它遍历整个 $teams 数组并在每个 Write-Host 行上输出空值(无论你用它做什么都会发生同样的情况,我只是在这里使用 Write-Host 作为示例;发送它到 Select-Object 等显示它仍然是空白的)。

这是故意的吗?我认为不会,因为它很生气。我有一个临时解决方法(是的,这太糟糕了......)将第一次 Api 调用的结果写出到一个文件,然后遍历该列表调用一个脚本,该脚本在没有 foreach 循环情况下执行后续调用每一行的脚本。有没有更好的办法?

我试过 -DisableKeepAlive - 没有区别。我尝试将 -TimeoutSec 值设置为一个小数字、一个大数字等 - 没有区别。我试过 -OutFile 并写出一堆空文件。

感觉——在没有任何证据的情况下——当在循环内调用它时,它正在等待 HTTP 响应(即 200),然后不下载任何响应正文。

这是 Powershell 7.1.3,顺便说一句。

提前干杯!

标签: powershellpowershell-7.0

解决方案


推荐阅读