PowerShell 7+中ForEach-Object -Parallel如何将结果追加到数组
报错原因
$using: 前缀仅支持读取父作用域变量的只读快照,不支持直接对其执行赋值操作,这是触发报错的直接原因。
此外,ForEach-Object -Parallel 的每个执行块都运行在独立隔离的运行空间中,即便绕过赋值限制,修改的也只是当前块内的变量副本,无法同步到父作用域的原始变量。
解决方案
该场景下最简便的实现方式是直接接收所有并行块的标准输出作为结果,PowerShell 会自动将所有并行块的输出汇总后赋值给外部变量,不需要手动操作集合追加。
修改后的代码如下:
$AllSubs = Get-AzSubscription $Date = (Get-Date).AddDays(-2).ToString("yyyy-MM-dd") # 直接接收所有并行块的输出结果赋值给$Costs $Costs = $AllSubs | Sort-Object -Property Name | ForEach-Object -Parallel { Set-AzContext $_.Name | Out-Null # 日志输出改用Write-Host,不会混入标准输出流的查询结果 Write-Host "Fetching Costs from '$($_.Name)' ..." # 直接输出查询结果即可,外部会自动收集汇总 Get-AzConsumptionUsageDetail -StartDate $using:Date -EndDate $using:Date -IncludeAdditionalProperties -IncludeMeterDetails -ErrorAction SilentlyContinue }
如果存在需要跨线程写入变量的复杂场景,可以使用线程安全集合类,例如 [System.Collections.Concurrent.ConcurrentBag] 实现跨运行空间的变量写入。
内容的提问来源于stack exchange,提问作者Gill-Bates
相关产品推荐
相关产品推荐

