

**本文档仅适用于 AWS CLI 版本 1。**

我们已宣布即将终止对 AWS CLI 版本 1 的支持。建议您迁移到 AWS CLI 版本 2。有关日期、其它详细信息以及如何迁移的信息，请参阅[公告](https://aws.amazon.com/blogs/developer/cli-v1-maintenance-mode-announcement/)。有关 AWS CLI 版本 2 的相关文档，请参阅[版本 2 用户指南](https://docs.aws.amazon.com/cli/latest/userguide/)。

# 在 AWS CLI 中从文件加载参数
<a name="cli-usage-parameters-file"></a>

有些参数需要文件名作为变量，AWS CLI 将从这些变量中加载数据。其他参数允许您将参数值指定为在命令行上键入的文本或从文件中读取的文本。无论文件是必需的还是可选的，您都必须对文件进行正确编码，以便 AWS CLI 能够理解它。该文件的编码必须与读取系统的默认区域设置相匹配。您可以通过使用 Python `locale.getpreferredencoding()` 方法来确定这一点。

此方法用于为单个参数加载文件。有关使用单个文件加载多个参数的信息，请参阅[在 AWS CLI 中生成 AWS CLI 骨架和输入文件](cli-usage-skeleton.md)。

**注意**  
默认情况下，Windows PowerShell 将文本输出为 UTF-16，这与 JSON 文件和许多 Linux 系统使用的 UTF-8 编码冲突。建议您将 `-Encoding ascii` 与 PowerShell `Out-File` 命令一起使用，以确保 AWS CLI 可以读取生成的文件。

**Topics**
+ [如何从文件加载参数](#cli-usage-parameters-file-how)
+ [二进制文件](#cli-usage-parameters-file-binary)
+ [远程文件](#cli-usage-parameters-file-remote)
+ [将文件作为速记语法值进行加载](#cli-usage-parameters-file-shorthand)

## 如何从文件加载参数
<a name="cli-usage-parameters-file-how"></a>

有时，从文件加载参数值（而不是尝试将其全部键入为命令行参数值）很方便，例如当参数为复杂的 JSON 字符串时。要指定包含该值的文件，请按以下格式指定文件 URL。

```
file://complete/path/to/file
```
+ 前两个斜杠“/”字符是规范的一部分。如果所需的路径以“/”开头，结果为三个斜杠字符：`file:///folder/file`。
+ URL 提供包含实际参数内容的文件的路径。
+ 使用带空格或特殊字符的文件时，请遵循终端的[引用和转义规则](cli-usage-parameters-quoting-strings.md)。

**注意**  
对于本就要求指定 URL 的参数（例如标识 CloudFormation 模板 URL 的参数），将自动禁用该行为。您也可以通过禁用 AWS CLI 配置文件中的 [`cli_follow_urlparam`](cli-configure-files.md#cli-config-cli_follow_urlparam) 设置来禁用此行为。

以下示例中的文件路径被解读为相对于当前工作目录。

------
#### [ Linux or macOS ]

```
// Read from a file in the current directory
$ aws ec2 describe-instances --filters file://filter.json

// Read from a file in /tmp
$ aws ec2 describe-instances --filters file:///tmp/filter.json

// Read from a file with a filename with whitespaces
$ aws ec2 describe-instances --filters 'file://filter content.json'
```

------
#### [ Windows command prompt ]

```
// Read from a file in C:\temp
C:\> aws ec2 describe-instances --filters file://C:\temp\filter.json

// Read from a file with a filename with whitespaces
C:\> aws ec2 describe-instances --filters "file://C:\temp\filter content.json"
```

------

`file://` 前缀选项支持包含“`~/`”、“`./`”和“`../`”的 Unix 式扩展。在 Windows 上，“`~/`”表达式将展开到您的用户目录（存储在 `%USERPROFILE%` 环境变量中）。例如，在 Windows 10 上，您通常在 `%USERPROFILE%` 下有一个用户目录。

仍必须对作为另一个 JSON 文档的值嵌入的 JSON 文档进行转义。

```
$ aws sqs create-queue --queue-name my-queue --attributes file://attributes.json
```

**attributes.json**

```
{
  "RedrivePolicy": "{\"deadLetterTargetArn\":\"arn:aws:sqs:us-west-2:0123456789012:deadletter\", \"maxReceiveCount\":\"5\"}"
}
```

## 二进制文件
<a name="cli-usage-parameters-file-binary"></a>

对于将二进制数据用作参数的命令，请使用 `fileb://` 前缀指定该数据为二进制内容。接受二进制数据的命令包括：
+  **`aws ec2 run-instances:`** `--user-data` 参数。
+  **`aws s3api put-object:`** `--sse-customer-key` 参数。
+  **`aws kms decrypt:`** `--ciphertext-blob` 参数。

以下示例使用 Linux 命令行工具生成一个二进制 256 位 AES 密钥，然后将该密钥提供给 Amazon S3 以对上载的文件服务器端进行加密。

```
$ dd if=/dev/urandom bs=1 count=32 > sse.key
32+0 records in
32+0 records out
32 bytes (32 B) copied, 0.000164441 s, 195 kB/s
$ aws s3api put-object \
    --bucket amzn-s3-demo-bucket \
    --key test.txt \
    --body test.txt \
    --sse-customer-key fileb://sse.key \
    --sse-customer-algorithm AES256
{
    "SSECustomerKeyMD5": "iVg8oWa8sy714+FjtesrJg==",
    "SSECustomerAlgorithm": "AES256",
    "ETag": "\"a6118e84b76cf98bf04bbe14b6045c6c\""
}
```

## 远程文件
<a name="cli-usage-parameters-file-remote"></a>

AWS CLI 还支持使用 `http://` 或 `https://` URL 从 Internet 上托管的文件中加载参数。下面的示例引用存储在 Amazon S3 存储桶中的一个文件。这将允许您从任何计算机访问参数文件，但它的确要求容器可公开访问。

```
$ aws ec2 run-instances \
    --image-id ami-12345678 \
    --block-device-mappings http://amzn-s3-demo-bucket.s3.amazonaws.com/filename.json
```

前面的示例假定 `filename.json` 文件包含以下 JSON 数据。

```
[
  {
    "DeviceName": "/dev/sdb",
    "Ebs": {
      "VolumeSize": 20,
      "DeleteOnTermination": false,
      "VolumeType": "standard"
    }
  }
]
```

有关引用包含 JSON 格式参数的文件的更多示例，请参阅[将 IAM 托管式策略附加到用户](cli-services-iam.md#cli-services-iam-policy)。

## 将文件作为速记语法值进行加载
<a name="cli-usage-parameters-file-shorthand"></a>

如果在值较大或较复杂的情况下使用速记语法，通常更易以值的形式加载文件。要将文件作为速记语法值进行加载，格式将略有变化。使用 `@=` 运算符代替 `=` 运算符，而不使用 `key=value`。`@=` 告知 AWS CLI，值应作为文件路径而不是字符串进行读取。以下示例显示一个键值对，该键值对为其值加载文件。

------
#### [ Linux or macOS ]

```
--option key@=file://template.txt
```

------
#### [ Windows ]

```
--option "key1@=file://template.txt"
```

------

以下示例演示如何为 `aws rolesanywhere create-trust-anchor` 命令加载证书文件。

```
$ aws rolesanywhere create-trust-anchor --name TrustAnchor \
    --source sourceData={x509CertificateData@=file://root-ca.crt},sourceType="CERTIFICATE_BUNDLE"  \ 
    --enabled
```

有关速记语法的更多信息，请参阅[在 AWS CLI 中使用速记语法](cli-usage-shorthand.md)。