1

我已经通过 成功收集了 AMI ID Get-EC2ImageByName,但我正在尝试确定一种方法来提取最新的“not-rc”AMI。

我目前运行:

Get-EC2ImageByName -Names *amzn-ami-pv*x86_64*ebs* - | Select-Object -ExpandProperty "ImageId" -First 1

它给了我:

ami-978639e4

当我运行时:

Get-EC2ImageByName -Names *amzn-ami-pv*x86_64*ebs*

前 2 个条目是:

Architecture        : x86_64
BlockDeviceMappings : {/dev/sda1}
CreationDate        : 2016-02-27T22:30:03.000Z
Description         : Amazon Linux AMI 2016.03.rc-0 x86_64 PV EBS
Hypervisor          : xen
ImageId             : ami-978639e4
ImageLocation       : amazon/amzn-ami-pv-2016.03.rc-0.x86_64-ebs
ImageOwnerAlias     : amazon
ImageType           : machine
KernelId            : aki-52a34525
Name                : amzn-ami-pv-2016.03.rc-0.x86_64-ebs
OwnerId             : 137112412989
Platform            : 
ProductCodes        : {}
Public              : True
RamdiskId           : 
RootDeviceName      : /dev/sda1
RootDeviceType      : ebs
SriovNetSupport     : 
State               : available
StateReason         : 
Tags                : {}
VirtualizationType  : paravirtual

Architecture        : x86_64
BlockDeviceMappings : {/dev/sda1}
CreationDate        : 2016-02-10T22:22:22.000Z
Description         : Amazon Linux AMI 2015.09.2 x86_64 PV EBS
Hypervisor          : xen
ImageId             : ami-a93484da
ImageLocation       : amazon/amzn-ami-pv-2015.09.2.x86_64-ebs
ImageOwnerAlias     : amazon
ImageType           : machine
KernelId            : aki-52a34525
Name                : amzn-ami-pv-2015.09.2.x86_64-ebs
OwnerId             : 137112412989
Platform            : 
ProductCodes        : {}
Public              : True
RamdiskId           : 
RootDeviceName      : /dev/sda1
RootDeviceType      : ebs
SriovNetSupport     : 
State               : available
StateReason         : 
Tags                : {}
VirtualizationType  : paravirtual

我试图忽略“rc”条目,并选择名称中没有“rc”的第一个 AMI ID,或者只是第一个“not rc”AMI ID。在这个例子中,我想要的 AMI-ID 是:

ami-a93484da

有谁知道在不使用“ -Skip 1”的情况下实现这一目标的方法?(我避免使用“ -Skip 1”,因为我试图使脚本可重复,例如,如果有 2 个或更多“rc”版本。

谢谢你的帮助!

4

1 回答 1

2

假设名称的其他部分都没有改变,您可以使用正则表达式来防止将来增加“rc- digits ”值。你可以使用这个表达式:

".rc-\d+."

此表达式检查字符串“.rc- digits ”。字符串中的任何位置,其中数字可以是一个或多个数字。从那里,您可以对所需的输出进行排序和过滤。

下面是一个快速的实时测试,我在其中执行以下操作:

  • 获取与您提供的名称匹配的图像。
  • 将结果通过管道传输到 Where-Object(别名:?)并使用 过滤掉结果-notmatch,我在其中明确查找与我的表达式不匹配的结果。
  • 按最近的 AMI CreationDate 排序。(这假设稍后发布较新的版本)
  • 选择要输出的 ImageId、Name 和 CreationDate。
  • 包装整个表达式@()以强制作为集合输出,然后通过指定 检索该集合中的第一项[0]

例子:

PS C:/> @(Get-EC2ImageByName -Names "amzn-ami-pv*x86_64*ebs*" | `
Where-Object { $_.Name -notmatch ".rc-\d+." } | `
Sort CreationDate -Desc | `
Select ImageId, Name, CreationDate)[0]

输出:

ImageId 名称 创建日期
-------- ---- ------------
ami-d4f7ddbe amzn-ami-pv-2015.09.2.x86_64-ebs 2016-02-10T22:21:22.000Z
于 2016-03-11T00:24:05.663 回答