Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La CLI de Azure es una herramienta para administrar recursos de Azure a través de comandos de referencia de la CLI de Azure que se ejecutan en un lenguaje de scripting de Bash y PowerShell. Sin embargo, hay pequeñas diferencias de sintaxis en el formato de parámetros entre los lenguajes de scripting que pueden dar lugar a resultados inesperados. El propósito de este artículo es ayudarle a resolver errores de sintaxis de la CLI de Azure al trabajar en un lenguaje de scripting de PowerShell.
En este artículo se comparan las diferencias de sintaxis de los comandos de la CLI de Azure ejecutados en los siguientes lenguajes de scripting:
- Bash que se ejecuta en un sistema operativo Linux mediante Azure Cloud Shell.
- PowerShell que se ejecuta en un sistema operativo Linux mediante Azure Cloud Shell.
- Windows PowerShell que se ejecuta en Windows 11 mediante el terminal de PowerShell 5.
- PowerShell que se ejecuta en windows 11 mediante el terminal de PowerShell 7.
Si no está familiarizado con la CLI, diferenciar entre una herramienta y un lenguaje de scripting puede resultar confuso. Cómo elegir la herramienta de línea de comandos adecuada proporciona una buena comparación.
Prerrequisitos
Este artículo está pensado para leer y aprender. Sin embargo, si desea ejecutar los ejemplos, seleccione la Prepare your environments
pestaña para instalar los lenguajes de scripting usados en este artículo.
Importante
Cuando tenga un script de la CLI de Azure que genere un error, considere cómo el lenguaje de scripting que está utilizando interpreta la sintaxis de comandos de la CLI de Azure.
Pasa espacios en los parámetros de la CLI de Azure
En la CLI de Azure, cuando necesitas pasar un valor de parámetro que contenga un espacio, existen diferencias entre los sistemas operativos y los lenguajes de scripting. En este ejemplo, use az storage account list y cambie el nombre de las columnas de salida con una palabra que contiene un espacio.
En este ejemplo, observe el uso de comillas simples ('...'
) que contienen comillas dobles incrustadas ("..."
).
Este ejemplo también funciona en PowerShell en Linux.
az storage account list --query '[].{"SA Name":name, "Primary endpoint":primaryEndpoints.blob}' --output table
Si desea agregar un filtro, la sintaxis cambia. Observe cómo en este ejemplo se ajusta el valor del --query
parámetro entre comillas dobles ("..."
) y se usa un carácter de escape de barra diagonal inversa (\
). Este script no se ejecuta en PowerShell.
az storage account list --query "[?creationTime >='2024-02-01'].{\"SA Name\":name,\"Primary endpoint\":primaryEndpoints.blob}" --output table
Si acaba de intentar ejecutar la sintaxis de filtro en un lenguaje de secuencias de comandos de PowerShell, recibió el mensaje de error argument --query: invalid jmespath_type value: "[?creationTime >=..."
. Sin embargo, en Bash dentro de un entorno de Linux, la salida es similar a esta:
SA Name Primary Endpoint
----------- -----------------
msdocssa00000000 https://msdocssa000000000.blob.core.windows.net/
Paso de parámetros en una dirección URL que contiene una cadena de consulta
Las marcas de interrogación en direcciones URL indican el final de la dirección URL y el principio de una cadena de consulta. Este es un ejemplo que abre el paso 3 en Learn para usar la CLI de Azure:
/cli/azure/account?view=azure-cli-2020-09-01-hybrid
.
El ?view=azure-cli-2020-09-01-hybrid
resultado es la versión deseada del contenido de referencia de la CLI de Azure.
Al ejecutar comandos de la CLI de Azure en un lenguaje de scripting de PowerShell, PowerShell permite que los signos de interrogación formen parte de un nombre de variable. Esto podría crear confusión en los valores de parámetros de la CLI de Azure.
Este es un ejemplo del artículo Uso de la API REST de Azure :
Observe cómo $containerRegistryName?api-version
concatena juntos sin errores en Bash.
# Script for a Bash scripting language
# 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
Pasar parámetros que contienen el símbolo ampersand
Si tiene un escenario en el que necesita pasar un símbolo ampersand ('&') en un valor de parámetro, tenga en cuenta que PowerShell interpreta el símbolo. Puede ver que esto sucede mediante el --debug
parámetro :
az "a&b" --debug
# output
'a' is misspelled or not recognized by the system.
'b' is not recognized as an internal or external command
Sin embargo, si usa esta misma prueba para agregar una etiqueta a un grupo de recursos, el ampersand del valor de etiqueta no produce un error.
az group create --location eastus2 --name "msdocs-rg-test"
az group update --name "msdocs-rg-test" --tags "company name=Contoso & Sons"
# output
{
"id": "/subscriptions/3618afcd-ea52-4ceb-bb46-53bb962d4e0b/resourceGroups/msdocs-rg-test",
"location": "eastus2",
"managedBy": null,
"name": "msdocs-rg-test",
"properties": {
"provisioningState": "Succeeded"
},
"tags": {
"company name": "Contoso & Sons"
},
"type": "Microsoft.Resources/resourceGroups"
}
Si tiene un escenario en el que el ampersand en el valor de un parámetro está causando un error, hay algunas soluciones:
# When quoted by single quotes ('), double quotes (") are preserved by PowerShell and sent
# to Command Prompt, so that ampersand (&) is treated as a literal character
> az '"a&b"' --debug
Command arguments: ['a&b', '--debug']
# Escape double quotes (") with backticks (`) as required by PowerShell
> az "`"a&b`"" --debug
Command arguments: ['a&b', '--debug']
# Escape double quotes (") by repeating them
> az """a&b""" --debug
Command arguments: ['a&b', '--debug']
# With a whitespace in the argument, double quotes (") are preserved by PowerShell and
# sent to Command Prompt
> az "a&b " --debug
Command arguments: ['a&b ', '--debug']
# Use --% to stop PowerShell from parsing the argument
> az --% "a&b" --debug
Command arguments: ['a&b', '--debug']
Pasar parámetros que contienen un símbolo at (@
)
Hay caracteres especiales de PowerShell, como el símbolo at (@
), que es un operador de expansión en PowerShell. Agregue un acento grave `
antes del carácter especial para excluirlo. También puede incluir el valor entre comillas simples ('
) o dobles ("
).
Los tres ejemplos siguientes funcionarán en PowerShell:
- parameterName '@parameters.json
- parameterName '@parameters.json'
- parameterName "@parameters.json"
Este ejemplo no funcionará en PowerShell:
- nombreParámetro @parameters.json
Este es otro ejemplo del az ad app create
comando: observe las comillas dobles ("..."
) alrededor del nombre de archivo JSON necesario en un lenguaje de scripting de PowerShell.
# Script for a PowerShell scripting language
az ad app create --display-name myTestAppName `
--is-fallback-public-client `
--required-resource-accesses "@manifest.json"
Pasar parámetros que contienen JSON
Para argumentos complejos como una cadena JSON, el procedimiento recomendado es usar la convención de la CLI de @<file>
Azure para cargar desde un archivo para omitir la interpretación del shell. Para ver ejemplos de sintaxis JSON para Bash, PowerShell y Cmd.exe, consulte Quoting differences between scripting languages - JSON strings ( Diferencias entre lenguajes de scripting: cadenas JSON).
Pasar parámetros que contienen pares clave:valor
Algunos valores de parámetros de la CLI de Azure, como etiquetas de recursos de Azure, requieren pares clave:valor. Si key
o value
contiene un espacio o un carácter especial, la sintaxis de Bash y PowerShell no siempre es la misma.
Para obtener ejemplos de sintaxis para Bash, PowerShell y Cmd, consulte Cree etiquetas para practicar las diferencias entre comillas en el tutorial Aprenda a usar la CLI de Azure. En este paso del tutorial se proporcionan ejemplos para los siguientes escenarios de pares clave:valor:
- espacios
- valores vacíos
- caracteres especiales
- Variables
Símbolo de parada del análisis
El símbolo de detención del análisis (--%
), introducido en PowerShell 3.0, dirige PowerShell para evitar interpretar la entrada como comandos o expresiones de PowerShell. Cuando encuentra un símbolo que detiene el procesamiento, PowerShell trata los caracteres restantes de la línea como un literal.
az --% vm create --name xxx
Control de errores de la CLI de Azure en PowerShell
Puede ejecutar comandos de la CLI de Azure en PowerShell, como se describe en Elección de la herramienta de línea de comandos de Azure adecuada. Si lo hace, asegúrese de que comprende el control de errores de la CLI de Azure en PowerShell. En concreto, la CLI de Azure no crea excepciones para que PowerShell las capture.
Una alternativa es usar la $?
variable automática. Esta variable contiene el estado del comando más reciente. Si se produce un error en el comando anterior, $?
tiene el valor de $False
. Para obtener más información, consulte sobre_Variables_Automáticas.
En el ejemplo siguiente se muestra cómo puede funcionar esta variable automática para el control de errores:
# Script for a PowerShell scripting language
az group create --name MyResourceGroup
if ($? -eq $false) {
Write-Error "Error creating resource group."
}
Se produce un error en el az
comando porque falta el parámetro necesario --location
. La instrucción condicional determina que $?
es falso y escribe un error.
Si desea usar las palabras clave try
y catch
, puede usar throw
para crear una excepción que el bloque try
pueda capturar.
# Script for a PowerShell scripting language
$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"
De forma predeterminada, PowerShell detecta solo errores de terminación. En este ejemplo se establece la $ErrorActionPreference
variable global en Stop
para que PowerShell pueda controlar el error.
La instrucción condicional prueba la $?
variable para ver si se produjo un error en el comando anterior. Si es así, la throw
palabra clave crea una excepción para detectar. El catch
bloque se puede usar para escribir un mensaje de error o controlar el error.
En el ejemplo se restaura $ErrorActionPreference
a su valor predeterminado.
Para obtener más información sobre el control de errores de PowerShell, consulte Todo lo que quiere saber sobre las excepciones.
Habilitar la finalización de pestañas en PowerShell
El autocompletado de comandos, también conocidos como "finalizadores de la CLI de Azure", permite completar inputs para proporcionar pistas, facilitar el descubrimiento y agilizar el ingreso de datos. Los nombres de comandos, grupos de comandos, parámetros y determinados valores de parámetros pueden insertarse automáticamente en la línea de comandos pulsando la tecla Tabulador.
El autocompletado mediante tabulador está habilitado de manera predeterminada en Azure Cloud Shell y en la mayoría de las distribuciones de Linux. A partir de la versión 2.49 de la Interfaz de la línea de comandos de Azure, puede habilitar la finalización de pestañas para Azure CLI en PowerShell. Siga estos pasos:
Crear o editar el perfil almacenado en la variable
$PROFILE
. La manera más sencilla es ejecutarnotepad $PROFILE
en PowerShell. Para obtener más información, vea Cómo crear el perfil y Los perfiles y la directiva de ejecución.Agregue el siguiente código a su perfil 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 }
Para mostrar todas las opciones disponibles en el menú, agregue
Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete
al perfil de PowerShell.
Consulte también
- Notas de ingeniería sobre problemas de comillas con PowerShell en la CLI de Azure
- Compare la sintaxis de Bash, PowerShell y Cmd en estos artículos: