在 foreach powershell 中添加值

Add values inside foreach powershell

我有以下代码:

foreach ($region in (Get-AWSRegion)) {
    $images = aws ec2 describe-instances --output text --query 'Reservations[*].Instances[*].[ImageId]' | sort | uniq -c
}

$images

上面的代码给我类似的东西:

3 ami-123**

但我正在尝试将所有区域内的所有 AMI 集中在一起,因此它应该类似于:

9 ami-123**

当我尝试类似的操作时:

$images += aws ec2 describe-instances --output text --query 'Reservations[*].Instances[*].[ImageId]' | sort | uniq -c

我得到: 3 ami-123** 3 ami-123** 3 ami-123**

有办法吗?

三个紧迫的问题 - 首先,您在循环内不断覆盖 $images 的值,正如您发现的那样,您可以通过将 添加 来解决这个问题上一个结果集。

第二个问题是您实际上并没有针对 $region,因此您不断从为 aws 配置的默认区域获得相同的结果 - 在循环内指定 --region $region (假设 Get-AWSRegion returns 区域标识符为字符串)。

第三个问题有点……基础 - aws cli returns 一个字符串,所以你需要手动解析它并汇总结果 - 你可以这样做一个 [hashtable] 和一个简单的正则表达式模式:

# Create hashtable to aggregate results
$ImageIDCounts = @{}

foreach($region in Get-AWSRegion){
    $perRegionCount = aws ec2 describe-instances --region $region --output text --query 'Reservations[*].Instances[*].[ImageId]' | sort | uniq -c
    foreach($entry in $perRegionCount){
        if($entry -match '^\s*(\d+)\s+(.*)$'){
            $Count = $Matches[1] -as [int]
            $ImageID = $Matches[2].Trim()

            $ImageIDCounts[$ImageID] += $Count 
        }
    }
}

$ImageIDCounts 现在每个唯一的 ImageID 包含一个条目,因此您可以:

$ami123count = $ImageIDCounts['ami-123']