4

在此处遵循此示例https://docs.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

错误:

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

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

4

3 回答 3

3

笔记:

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

  • 如果您的命令行仅包含逐字参数- 即,仅包含文字标记,而不是 PowerShell变量引用(例如,$file)或表达式(例如,($dir + '\script.ps1')) - 您也可以传递参数s之前放置停止解析符号--%,如显示在Wasif Hasan 的回答中;请注意,cmd.exe-style 变量引用,例如%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'

将脚本文件名存储在变量中,$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"

注意:您可以仅在可变情况下逃脱@$file,但鉴于这不适用于任何字符。除了$遵循之外@,最好养成总是逐字引用/转义的习惯@


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

于 2020-01-19T05:25:30.057 回答
0

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

于 2022-01-29T09:45:10.297 回答
0

你可以使用这个:

az --% vm run-command invoke  --command-id RunPowerShellScript --name win-vm -g my-resource-group --scripts @script.ps1

在 PowerShell 中,特殊的停止解析符号--%是 PowerShell 停止解释行中任何剩余字符的信号。这可用于调用非 PowerShell 实用程序并按原样传递一些引用的参数。

于 2020-01-19T15:30:44.943 回答