Предоставление входного файла через '@' приводит к ошибке: оператор сплаттинга '@' не может использоваться для ссылки на переменные в выражении - PullRequest
1 голос
/ 19 января 2020

Следуя этому примеру здесь 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'.

Помещение в кавычки только передает содержимое в кавычках, а не содержимое сценария.

Ответы [ 2 ]

0 голосов
/ 19 января 2020

Вы можете использовать это:

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

В PowerShell специальный символ Stop Parsing --% является сигналом для PowerShell, чтобы прекратить интерпретировать любые оставшиеся символы в строке. Это может быть использовано для вызова утилиты не-PowerShell и передачи некоторых параметров в кавычках в точности как есть.

0 голосов
/ 19 января 2020

Примечание:

  • Этот ответ показывает как escape / quote символ @. правильно в контексте обычных правил синтаксического анализа PowerShell.

  • Если ваша командная строка содержит только дословно аргументы - т.е. только литералы токены, а не PowerShell ссылки на переменные (например, $file) или выражения (например, ($dir + '\script.ps1')) - вы можете альтернативно разместить --%, символ остановки разбора перед аргументом передачи s, как показано в ответ Васифа Хасана ; обратите внимание, что ссылки на переменные в стиле cmd.exe, такие как %FOO%, все еще расширяются, однако.


@ является метасимволом в PowerShell (символ с синтаксисом c, означающим [1] ), поэтому, чтобы передать его дословно до az, необходимо либо указать весь аргумент или ` -экранирование @ индивидуально :

с именем файла сценария literal :

# 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] @ имеет несколько синтактических c применений, а заданное c использование зависит от того, какой символ последует. В вашем случае @ в @script.ps1 было интерпретировано как оператор с переменной script, а часть .ps1 интерпретирована как попытка доступа к свойству ps1 на эту переменную - отсюда сообщение об ошибке.

...