

的版本 5 (V5) AWS Tools for PowerShell 已经发布！

有关重大更改和迁移应用程序的信息，请参阅[迁移主题](https://docs.aws.amazon.com/powershell/v5/userguide/migrating-v5.html)。

 [https://docs.aws.amazon.com/powershell/v5/userguide/migrating-v5.html](https://docs.aws.amazon.com/powershell/v5/userguide/migrating-v5.html)

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 中的流水线、输出和迭代 AWS Tools for PowerShell
<a name="pstools-pipelines"></a>

## 流水线
<a name="pstools-pipelining"></a>

PowerShell 鼓励用户将 cmdlet 连接到[管道，这些管道](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_pipelines)将一个 cmdlet 的输出定向到下一个的 cmdlet 的输入。以下示例显示了使用时的这种行为 AWS Tools for PowerShell。该命令获取并停止当前默认区域中的所有 Amazon EC2 实例。

```
PS > Get-EC2Instance | Stop-EC2Instance
```

## Cmdlet 输出
<a name="pstools-output"></a>

为了更好地支持流水线，默认情况下， 适用于 .NET 的 AWS SDK 可能会丢弃来自响应的某些数据。 AWS Tools for PowerShell cmdlet 的输出不会被重塑为包含服务响应和结果实例作为发出的集合`Note`对象的属性。相反，对于那些将单个集合作为输出的调用，该集合现在被枚举到管道中。 PowerShell 这意味着 SDK 响应和结果数据不能存在于管道中，因为没有可以将其附加到的包含集合对象。

尽管大多数用户可能不需要这些数据，但它可用于诊断目的，因为您可以确切地看到 cmdlet 发出的底层 AWS 服务调用发送和接收的内容。Cmdlet 可以使用`-Select *`参数和参数返回整个服务响应。

为了说明如何返回来自响应的所有数据，请考虑以下示例。

第一个示例仅返回 Amazon S3 存储桶的列表。这是默认行为。

```
PS > Get-S3Bucket

CreationDate           BucketName
------------           ----------
9/22/2023 10:54:35 PM  amzn-s3-demo-bucket1
9/22/2023 11:04:37 AM  amzn-s3-demo-bucket2
9/22/2023 12:54:34 PM  amzn-s3-demo-bucket3
```

第二个示例返回一个 适用于 .NET 的 AWS SDK 响应对象。由于`-Select *`已指定，因此输出包含整个 API 响应，其中包含`Buckets`属性中的存储桶集合。在此示例中，`Format-List`cmdlet 并不是严格必需的，而是为了确保显示所有属性而存在的。

```
PS > Get-S3Bucket -Select * | Format-List

LoggedAt          : 10/1/2023 9:45:52 AM
Buckets           : {amzn-s3-demo-bucket1, amzn-s3-demo-bucket2,
                    amzn-s3-demo-bucket3}
Owner             : Amazon.S3.Model.Owner
ContinuationToken :
ResponseMetadata  : Amazon.Runtime.ResponseMetadata
ContentLength     : 0
HttpStatusCode    : OK
```

## 迭代分页数据
<a name="pstools-iteration"></a>

以下各节描述了各种可能的迭代类型。

### 自动迭代
<a name="pstools-iteration-auto"></a>

对于为给定调用规定默认最大返回对象数或支持可分页结果集的服务 APIs ，大多数 cmdlet 都实现自动迭代，从而启用 “” 的默认行为。page-to-completion在这种情况下，cmdlet 会代表您进行任意数量的调用，以将完整的数据集返回到管道。

在以下使用 [Get-S3Object](https://docs.aws.amazon.com/powershell/v5/reference/index.html?page=Get-S3Object.html&tocid=Get-S3Object)cmdlet 的示例中，该`$result`变量包含名为的存储桶中每个密钥的`S3Object`实例`amzn-s3-demo-bucket1`，该存储桶可能是一个非常大的数据集。

```
PS > $result = Get-S3Object -BucketName amzn-s3-demo-bucket1
```

以下示例将自动迭代期间每个页面的结果数从默认值 1000 减少到 500。该示例执行的自动迭代调用次数是原来的两倍，因为每次调用只返回一半的结果。

```
PS > $result = Get-S3Object -BucketName amzn-s3-demo-bucket1 -MaxKey 500
```

### 禁用自动迭代
<a name="pstools-iteration-disable-auto"></a>

如果您希望工具仅 PowerShell 返回第一页数据，则可以添加`-NoAutoIteration`参数以防止返回其他数据页。

以下示例使用`-NoAutoIteration`和`-MaxKey`参数将返回的`S3Object`实例数限制为不超过存储桶中找到的前 500 个。

```
PS > $result = Get-S3Object -BucketName amzn-s3-demo-bucket1 -MaxKey 500 -NoAutoIteration
```

要确定是否有更多数据可用但未返回，请使用`-Select *`参数和参数并检查下一个令牌属性中是否有值。

`$true`如果存储桶中的对象超过 500 个，则以下示例返`$false`回。

```
PS > $result = Get-S3Object -BucketName amzn-s3-demo-bucket1 -MaxKey 500 -NoAutoIteration -Select *
PS > $null -eq $result.NextMarker
```

**注意**  
下一个令牌响应属性的名称和 cmdlet 参数的名称在 cmdlet 之间有所不同。有关详细信息，请参阅每个 cmdlet 的帮助文档。

### 手动迭代
<a name="pstools-iteration-manual"></a>

以下示例使用 [do](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_do) 循环返回存储桶中的所有 S3 对象，该循环会在每次迭代后评估条件。该`do`循环会执行迭代，直到`Get-S3Object`设置`$result.NextMarker`为`$null`，表示不再剩下分页数据。循环的输出被分配给`$s3Objects`变量。

```
$s3Objects = do
{
    $splatParams = @{
        BucketName = 'amzn-s3-demo-bucket1'
        MaxKey = 500 
        Marker = $result.NextMarker 
        NoAutoIteration = $true
        Select = '*'
    }
    $result = Get-S3Object @splatParams
    
    $result.S3Objects
}
while ($null -ne $result.NextMarker)
```

此示例使用 PowerShell [splatting](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_splatting) 来避免因内联声明参数和参数而导致的长行代码。