【问题标题】:aws cli command in PowerShell gives Missing argument in parameter listPowerShell 中的 aws cli 命令在参数列表中给出缺少参数
【发布时间】:2022-10-15 10:47:29
【问题描述】:

在 PowerShell 中运行命令时,aws s3api put-object-tagging --bucket bucketName --key fileName.tar.gz --tagging TagSet={Key=public,Value=yes} 命令中需要更改哪些特定语法以防止出现如下所示的错误?

请注意,aws s3api put-object-tagging --bucket bucketName --key fileName.tar.gz --tagging TagSet={Key=public,Value=yes} 命令语法在同一台计算机上的 windows cmd 中运行时可以完美运行。

这是 PowerShell 日志,包括该命令在 Windows cmd 中运行的同一台计算机上的命令和错误消息:

PS C:\Users\userName> aws s3api put-object-tagging --bucket bucketName --key fileName.tar.gz --tagging TagSet={Key=public,Value=yes}
At line:1 char:129
+ ... --key fileName.tar.gz --tagging TagSet={Key=public,Value=ye ...
+                                                                 ~
Missing argument in parameter list.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingArgument

PS C:\Users\userName>

另请注意,我是 PowerShell 的新手。我只是有时需要将其他语言的短脚本翻译成 PowerShell。

【问题讨论】:

  • 对于选项,请尝试一个破折号而不是两个破折号。
  • @jdweng,aws CLI 在参数名称前使用 --,而不是 -
  • 虽然乍一看这个问题似乎很有趣,但从 PowerShell-vs.-other-shells 语法的角度来看,它的前提 - “当在同一台计算机上的 windows cmd 中运行时,命令语法完美地工作” - 与您发布的解决方案隐含矛盾在评论中。对我来说,一个本质上存在缺陷的问题——没有得到承认,也无法回答——值得投反对票。万一是您对答案投了反对票(它会尽力解决您有缺陷的问题和随后的反馈):请告诉我们它有什么问题,以便可以改进。
  • @mklement0 OP 中的每个语句都是正确的,可以通过在配置相当的 Windows 笔记本电脑中重复命令来验证。请停止沉迷于问答网站上的一些随机发布。如您的答案下方的评论中所述,此 OP 的发布者在没有您回答的帮助下解决了问题。放手,继续前进。嘘。
  • 这不仅仅是关于你和我,Sheesh(我现在不是你的昵称,但我很高兴使用它 - 增加了熟悉感并培养了合作精神),它是关于留下一些东西是对未来的读者有用.不,您问题中的陈述不正确-如果是,我的原始答案将解决您的问题。您在评论中提到的解决方案是不同的解决问题的方法,例如分心.

标签: windows amazon-web-services powershell amazon-s3 aws-cli


【解决方案1】:

更新

  • 下面的答案解决了你的问题如被问及,基于您(似乎不正确)声称您的问题中提到的第一个命令按原样来自cmd.exe下面提出的要点一般来说适用于传递给 PowerShell 命令的参数语法, 然而。

  • 根据后来的评论,您声明您真正需要传递给aws CLI--tagging 参数的是JSON细绳:

    • 但是,docs for the put-object-tagging subcommand 建议速记语法('TagSet=[{Key=public,Value=yes}]')也应该可以工作- 注意{...} 周围的[...]

    • 您声明 '{"TagSet": [{"Key":"public","Value":"yes"}]}' 为您工作(代表以下逐字JSON字符串:
      {"TagSet": [{"Key":"public","Value":"yes"}])。

      • 这个奇怪的需要手动-escape " 字符在 PowerShell 中确实是一个 - 不幸 - 要求至少 v7.2.x, 由于一个长期存在的错误.
      • 这个可能在未来的版本中得到修复,其中可能需要选择加入.见this answer

代替:

TagSet={Key=public,Value=yes}

和:

'TagSet={Key=public,Value=yes}'

那是,引用你的论点, 哪个阻止 PowerShell 将 {...} 解释为 script block,这就是导致您的问题的原因。

PowerShell 在两个显着方面与其他 shell 不同:

  • 它的转义字符是`(所谓反引号),而不是 (如 Bash 等 POSIX 兼容的 shell)或 ^(如 cmd.exe

  • 它有更多的metacharacters 比其他 shell,例如 {}@


至于你看到的具体错误信息:

脚本块 ({ ... }) 的内容被解析为 PowerShell 代码,而在您的情况下,Key=public,Value=yes 的内容被解析为命令,其语法恰好是无效的

  • Key=public 被解释为命令名称

  • ,Value=yes 被解析为它的论点, 其中 - 由于 , - 被解析作为一个数组, 但作为参数传递的文字数组不能开始使用,,这就是错误消息要说的:它缺少一个数组元素,

  • 您可以通过在命令行上提交以下内容来更轻松地引发此错误:

    foo , bar # -> Error "Missing argument in parameter list."
    

【讨论】:

  • 用于解决 OP 中问题的语法实际上如下:aws s3api put-object-tagging --bucket "myBucketName" --key "nameOfObject" --tagging '{"TagSet": [{"Key":"public","Value":"yes"}]}'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
  • 2018-08-20
  • 2017-07-12
  • 2011-03-24
  • 2016-06-12
相关资源
最近更新 更多