Рекомендации по запуску Azure CLI в среде PowerShell
Azure CLI — это средство для управления ресурсами Azure с помощью ссылочных команд Azure CLI, которые выполняются как в среде Bash, так и в PowerShell. Однако существуют незначительные различия синтаксиса в форматировании параметров между средами, которые могут привести к непредвиденным результатам. Цель этой статьи — устранить синтаксические ошибки Azure CLI при работе в среде PowerShell.
В этой статье сравниваются синтаксические различия команд Azure CLI, выполняемых в следующих средах:
- Bash, работающий в операционной системе Linux с помощью Azure Cloud Shell.
- PowerShell , выполняющаяся в операционной системе Linux с помощью Azure Cloud Shell.
- Windows PowerShell, запущенная в Windows 11 с помощью терминала PowerShell 5.
- PowerShell, работающей в Windows 11 с помощью терминала PowerShell 7.
Если вы не знакомы с ИНТЕРФЕЙСом командной строки, различия между средством и средой могут быть запутанными. Практическое руководство по выбору правильного средства командной строки обеспечивает хорошее сравнение.
Необходимые компоненты
Эта статья предназначена для чтения и изучения. Однако если вы хотите запустить примеры, выберите Prepare your environments
вкладку, чтобы установить среды, используемые в этой статье.
Внимание
Если у вас есть скрипт Azure CLI, создающий ошибку, рассмотрите способ анализа синтаксиса команды Azure CLI.
Сквозные пробелы в параметрах Azure CLI
В Azure CLI, когда необходимо передать значение параметра, содержащее пробел, существуют различия между операционными системами и средами. В этом примере используйте az storage account list и переименуйте выходные столбцы с словом, содержащим пробел.
В этом примере обратите внимание на одну кавычку ('...'
) с внедренными двойными кавычками ("..."
).
Этот пример также работает в PowerShell в Linux.
az storage account list --query '[].{"SA Name":name, "Primary endpoint":primaryEndpoints.blob}' --output table
Если вы хотите добавить фильтр, синтаксис изменится. Обратите внимание, как этот пример упаковывает --query
значение параметра в двойные кавычки ("..."
) и использует символ escape-косой черты (\
). Этот скрипт не выполняется в PowerShell.
az storage account list --query "[?creationTime >='2024-02-01'].{\"SA Name\":name,\"Primary endpoint\":primaryEndpoints.blob}" --output table
Если вы только что попытались запустить синтаксис фильтра в среде PowerShell, вы получили сообщение argument --query: invalid jmespath_type value: "[?creationTime >=..."
об ошибке. Однако в среде Linux выходные данные в Bash аналогичны следующим:
SA Name Primary Endpoint
----------- -----------------
msdocssa00000000 https://msdocssa000000000.blob.core.windows.net/
Передача параметров в URL-адресе со строкой запроса
Вопросительные знаки в URL-адресах указывают конец URL-адреса и начало строки запроса. Ниже приведен пример, который открывает шаг 3 в Learn, чтобы использовать Azure CLI:
https://learn.microsoft.com/en-us/cli/azure/account?view=azure-cli-2020-09-01-hybrid
.
?view=azure-cli-2020-09-01-hybrid
Результаты в требуемой версии справочного содержимого Azure CLI.
При выполнении команд Azure CLI в среде PowerShell PowerShell Позволяет PowerShell быть частью имени переменной. Это может привести к путанице в значениях параметров Azure CLI.
Ниже приведен пример из статьи об использовании REST API Azure:
Обратите внимание, как $containerRegistryName?api-version
объединение объединяется без ошибок в Bash.
# Script for a Bash environment
# Variable block
let "randomIdentifier=$RANDOM*$RANDOM"
subscriptionId="00000000-0000-0000-0000-000000000000"
resourceGroup="msdocs-app-rg$randomIdentifier"
containerRegistryName="msdocscr$randomIdentifier"
# prior to this GET example, the resource group and container registry were created in the article.
az rest --method get --url https://management.azure.com/subscriptions/$subscriptionId/resourceGroups/$resourceGroup/providers/Microsoft.ContainerRegistry/registries/$containerRegistryName?api-version=2023-01-01-preview
Передача параметров, содержащих специальный символ PowerShell
Существуют специальные символы PowerShell, такие как символ At (@
). Чтобы запустить Azure CLI в PowerShell, добавьте обратную черту `
перед специальным символом, чтобы экранировать его. Можно также заключить значение в одинарные ('
) или двойные"
() кавычки.
Следующие три примера будут работать в PowerShell:
- параметрName '@parameters.json
- параметрName "@parameters.json"
- параметрName "@parameters.json"
Этот пример не будет работать в PowerShell:
- parameterName @parameters.json
Передача параметров, содержащих JSON
Для сложных аргументов, таких как строка JSON, рекомендуется использовать соглашение Azure CLI @<file>
для загрузки из файла для обхода интерпретации оболочки. Обратите внимание, что символ At (@
) является оператором сплочения в PowerShell, поэтому его следует кавычек.
В az ad app create есть хорошие примеры, содержащие как содержимое файла JSON, так и примеры команд. Фрагмент кода выглядит следующим образом.
# Script for a Bash environment
az ad app create --display-name myTestAppName \
--is-fallback-public-client \
--required-resource-accesses @manifest.json
Передача параметров, содержащих пары key:value
Для некоторых значений параметров Azure CLI, таких как теги ресурсов Azure, требуются пары key:value. Если или key
value
содержит пробел или специальный символ, синтаксис Bash и PowerShell не всегда одинаковы.
См. статью "Создание тегов для практического применения различий в руководстве по Azure CLI ". В этом руководстве приведены примеры для сценариев пар "Ключ:значение" для Bash, PowerShell и Cmd:
- Пространства
- пустые значения
- специальные символы
- переменные
Обработка ошибок для Azure CLI в PowerShell
Команды Azure CLI можно выполнять в PowerShell, как описано в разделе Выбор подходящего средства командной строки Azure. Если вы будете это делать, разберитесь в механизме PowerShell для обработки ошибок Azure CLI. В частности, Azure CLI не создает исключения, которые могут быть перехвачены PowerShell.
Вместо этого следует использовать автоматическую переменную $?
. Эта переменная содержит сведения о состоянии последней выполненной команды. Если предыдущая команда завершилась ошибкой, $?
имеет значение $False
. Дополнительные сведения см. в статье about_Automatic_Variables.
В следующем примере показано, как эта автоматическая переменная может работать для обработки ошибок:
# Script for a PowerShell environment
az group create --name MyResourceGroup
if ($? -eq $false) {
Write-Error "Error creating resource group."
}
Команда az
завершается ошибкой, так как отсутствует обязательный --location
параметр. Условный оператор определяет, что $?
имеет значение false, и выводит сообщение об ошибке.
Если вы хотите использовать ключевые слова try
и catch
, можно с помощью throw
создать исключение для перехвата в блоке try
:
# Script for a PowerShell environment
$ErrorActionPreference = "Stop"
try {
az group create --name MyResourceGroup
if ($? -eq $false) {
throw 'Group create failed.'
}
}
catch {
Write-Error "Error creating the resource group."
}
$ErrorActionPreference = "Continue"
По умолчанию PowerShell перехватывает только неустранимые ошибки. В этом примере для глобальной переменной $ErrorActionPreference
задается значение Stop
, чтобы эта ошибка могла быть обработана в PowerShell.
Условный оператор проверяет переменную $?
и определяет, был ли сбой в предыдущей команде. Если это так, то с помощью ключевого слова throw
создается исключение для перехвата. Блок catch
можно использовать для вывода сообщения или обработки ошибки.
В нашем примере для $ErrorActionPreference
восстанавливается значение по умолчанию.
Дополнительные сведения об обработке ошибок в PowerShell см. в статье Все, что вы хотели знать об исключениях.
Включение завершения вкладок в PowerShell
Завершение вкладки, также известное как "Завершенные azure CLI", обеспечивает завершение входных данных для предоставления подсказок, включения обнаружения и ускорения ввода. Имена команд, имена групп команд, параметры и определенные значения параметров можно автоматически вставить в командную строку, нажав клавишу TAB .
Завершение вкладок по умолчанию в Azure Cloud Shell и в большинстве дистрибутивов Linux. Начиная с Azure CLI версии 2.49 можно включить завершение вкладки для Azure CLI в PowerShell. Выполните следующие действия:
Создайте или измените профиль, хранящийся в переменной
$PROFILE
. Самый простой способ — запуститьnotepad $PROFILE
в PowerShell. Дополнительные сведения см. в разделах How to create your profile (Как создать свой профиль) и Profiles and execution policy (Профили и политика выполнения).Добавьте следующий код в профиль PowerShell:
Register-ArgumentCompleter -Native -CommandName az -ScriptBlock { param($commandName, $wordToComplete, $cursorPosition) $completion_file = New-TemporaryFile $env:ARGCOMPLETE_USE_TEMPFILES = 1 $env:_ARGCOMPLETE_STDOUT_FILENAME = $completion_file $env:COMP_LINE = $wordToComplete $env:COMP_POINT = $cursorPosition $env:_ARGCOMPLETE = 1 $env:_ARGCOMPLETE_SUPPRESS_SPACE = 0 $env:_ARGCOMPLETE_IFS = "`n" $env:_ARGCOMPLETE_SHELL = 'powershell' az 2>&1 | Out-Null Get-Content $completion_file | Sort-Object | ForEach-Object { [System.Management.Automation.CompletionResult]::new($_, $_, "ParameterValue", $_) } Remove-Item $completion_file, Env:\_ARGCOMPLETE_STDOUT_FILENAME, Env:\ARGCOMPLETE_USE_TEMPFILES, Env:\COMP_LINE, Env:\COMP_POINT, Env:\_ARGCOMPLETE, Env:\_ARGCOMPLETE_SUPPRESS_SPACE, Env:\_ARGCOMPLETE_IFS, Env:\_ARGCOMPLETE_SHELL }
Чтобы отобразить все доступные параметры в меню, добавьте
Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete
в профиль PowerShell.
См. также
- Сравните синтаксис Bash, PowerShell и Cmd в следующих статьях:
- Использование кавычки в параметрах
- Узнайте о проблемах с цитатами в PowerShell
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по