通过“@”提供输入文件会出现错误:无法使用展开运算符“@”来引用表达式中的变量

Ryv*_*vik 12 powershell escaping az

按照此处的示例https://learn.microsoft.com/en-us/cli/azure/vm/run-command?view=azure-cli-latest

我在运行命令时遇到错误

az vm run-command invoke  --command-id RunPowerShellScript --name win-vm -g my-resource-group --scripts @script.ps1
Run Code Online (Sandbox Code Playgroud)

错误:

展开运算符“@”不能用于引用表达式中的变量。“@script”只能用作命令的参数。要引用表达式中的变量,请使用“$script”。

将其放在引号中只会传入引号中的内容,而不是脚本的内容。

rez*_*rad 26

如果你安装包whit@你应该使用CMD安装包


mkl*_*nt0 10

笔记:

  • 这个答案展示了如何转义/引用字符@。正确地在 PowerShell 的通常解析规则的上下文中。

  • 如果您的命令行仅包含逐字参数- 即仅包含文字标记,而不包含 PowerShell变量引用(例如,$file)或表达式(例如,($dir + '\script.ps1')) - 您也可以将停止解析标记放置在传递参数之前--%,如下所示在programmer365的回答中;请注意,cmd.exe诸如此类的变量引用%FOO%仍在扩展,并且停止解析标记有许多限制和陷阱 - 请参阅此答案。


@是PowerShell 中的元字符(具有句法含义的字符[1]),因此为了逐字传递它,az您必须引用整个参数或单独`转义@:

使用文字脚本文件名:

# Either: `-escape the @
az ... --scripts `@script.ps1

#`# Or: quote the whole argument
# Use '...' for a literal argument.
az ... --scripts '@script.ps1'
Run Code Online (Sandbox Code Playgroud)

将脚本文件名存储在变量中:$file

# Either: `-escape the @
az ... --scripts `@$file

#`# Or: quote the whole argument
# Use "..." for an argument with variable references, i.e. an expandable string
az ... --scripts "@$file"
Run Code Online (Sandbox Code Playgroud)

注意:您可以只使用@$file变量大小写,但考虑到它不适用于任何字符。除了$遵循@,最好养成总是逐字引用/转义的习惯@。


[1]@有多种语法用途,具体用途取决于接下来的字符。在您的情况下,@in@script.ps1被解释为带有名为 的变量的splatting 运算符script,该.ps1部分被解释为尝试访问ps1该变量上命名的属性 - 因此出现错误消息。