Överväganden för att köra Azure CLI i en PowerShell-miljö

Azure CLI är ett verktyg för att hantera Azure-resurser via Azure CLI-referenskommandon som körs i både en Bash- och PowerShell-miljö. Det finns dock små syntaxskillnader i parameterformatering mellan miljöer som kan resultera i oväntade resultat. Syftet med den här artikeln är att hjälpa dig att lösa Azure CLI-syntaxfel när du arbetar i en PowerShell-miljö.

I den här artikeln jämförs syntaxskillnaderna mellan Azure CLI-kommandon som körs i följande miljöer:

  • Bash körs i ett Linux-operativsystem med Hjälp av Azure Cloud Shell.
  • PowerShell körs i ett Linux-operativsystem med Azure Cloud Shell.
  • Windows PowerShell körs i Windows 11 med PowerShell 5-terminalen.
  • PowerShell körs i en Windows 11 med PowerShell 7-terminalen.

Om du inte har använt CLI tidigare kan det vara förvirrande att skilja mellan ett verktyg och en miljö . Att välja rätt kommandoradsverktyg ger en bra jämförelse.

Förutsättningar

Den här artikeln är avsedd för dig att läsa och lära dig. Men om du vill köra exemplen väljer du fliken Prepare your environments för att installera de miljöer som används i den här artikeln.

Viktigt!

När du har ett Azure CLI-skript som skapar ett fel bör du överväga hur miljön du arbetar i parsar Azure CLI-kommandosyntaxen.

Skicka blanksteg i Azure CLI-parametrar

När du i Azure CLI behöver skicka ett parametervärde som innehåller ett blanksteg, finns det skillnader mellan operativsystem och miljöer. I det här exemplet använder du az storage account list och byter namn på utdatakolumner med ett ord som innehåller ett blanksteg.

I det här exemplet bör du lägga märke till den enkla offertomslutningen ('...') med inbäddade dubbla citattecken ("..."). Det här exemplet fungerar också i PowerShell i Linux.

az storage account list --query '[].{"SA Name":name, "Primary endpoint":primaryEndpoints.blob}' --output table

Om du vill lägga till ett filter ändras syntaxen. Observera hur det här exemplet omsluter --query parametervärdet med dubbla citattecken ("...") och använder ett omvänt snedstreck (\) escape-tecken. Det här skriptet körs inte i PowerShell.

 az storage account list --query "[?creationTime >='2024-02-01'].{\"SA Name\":name,\"Primary endpoint\":primaryEndpoints.blob}" --output table

Om du bara försökte köra filtersyntaxen i en PowerShell-miljö fick du felmeddelandet argument --query: invalid jmespath_type value: "[?creationTime >=...". Men i Bash i en Linux-miljö liknar dina utdata följande:

SA Name           Primary Endpoint
-----------       -----------------
msdocssa00000000  https://msdocssa000000000.blob.core.windows.net/

Skicka parametrar i en URL som innehåller en frågesträng

Frågetecken i URL:er anger slutet på URL:en och början av en frågesträng. Här är ett exempel som öppnar steg 3 i Learn för att använda Azure CLI:

https://learn.microsoft.com/en-us/cli/azure/account?view=azure-cli-2020-09-01-hybrid.

Resultatet ?view=azure-cli-2020-09-01-hybrid blir den önskade versionen av Azure CLI-referensinnehållet.

När du kör Azure CLI-kommandon i en PowerShell-miljö tillåter PowerShell att frågetecken ingår i ett variabelnamn. Detta kan skapa förvirring i Azure CLI-parametervärden.

Här är ett exempel från artikeln Använd Azure REST API :

Observera hur $containerRegistryName?api-version sammanfogar utan fel i 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

Skicka parametrar som innehåller ett PowerShell-specialtecken

Det finns specialtecken i PowerShell, till exempel symbolen At (@). Om du vill köra Azure CLI i PowerShell lägger du till en backtick ` före specialtecknet för att undvika det. Du kan också omsluta värdet i enkla (') eller dubbla (") citattecken.

Följande tre exempel fungerar i PowerShell:

  • parameterName @parameters.json
  • parameterName "@parameters.json"
  • parameterName "@parameters.json"

Det här exemplet fungerar inte i PowerShell:

  • parameterName @parameters.json

Skicka parametrar som innehåller JSON

För komplexa argument som en JSON-sträng är det bästa sättet att använda Azure CLI:s @<file> konvention för att läsa in från en fil för att kringgå gränssnittets tolkning. Observera att symbolen At (@) är en splattingoperator i PowerShell, så den bör citeras.

Det finns bra exempel i az ad app create som innehåller både JSON-filinnehåll och kommandoexempel. Här är ett kodfragment:

# Script for a Bash environment

az ad app create --display-name myTestAppName \
    --is-fallback-public-client \
    --required-resource-accesses @manifest.json

Skicka parametrar som innehåller nyckel:värdepar

Vissa Azure CLI-parametervärden, till exempel Azure-resurstaggar, kräver nyckel:värde-par. Om ditt key eller value innehåller ett blanksteg eller specialtecken är Bash- och PowerShell-syntaxen inte alltid desamma.

Se Skapa taggar för att öva på att citera skillnader i självstudiekursen Lär dig att använda Azure CLI . Det här självstudiesteget innehåller exempel för Bash, PowerShell och Cmd för följande key:value pair-scenarier:

  • Utrymmen
  • tomma värden
  • Specialtecken
  • variabler

Felhantering för Azure CLI i PowerShell

Du kan köra Azure CLI-kommandon i PowerShell enligt beskrivningen i Välj rätt Azure-kommandoradsverktyg. Om du gör det bör du vara säker på att du förstår Azure CLI-felhanteringen i PowerShell. I synnerhet skapar Inte Azure CLI undantag för PowerShell att fånga.

Ett alternativ är att använda den $? automatiska variabeln. Den här variabeln innehåller status för det senaste kommandot. Om föregående kommando misslyckas $? har värdet $False. Mer information finns i about_Automatic_Variables.

I följande exempel visas hur den här automatiska variabeln kan fungera för felhantering:

# Script for a PowerShell environment

az group create --name MyResourceGroup
if ($? -eq $false) {
    Write-Error "Error creating resource group."
}

Kommandot az misslyckas eftersom den saknar den obligatoriska --location parametern. Villkorssatsen finner att det $? är falskt och skriver ett fel.

Om du vill använda nyckelorden try och catch kan du använda throw för att skapa ett undantag för blocket try att fånga:

# 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"

Som standard fångar PowerShell endast avslutande fel. I det här exemplet anges den $ErrorActionPreference globala variabeln till så att Stop PowerShell kan hantera felet.

Villkorssatsen testar variabeln $? för att se om föregående kommando misslyckades. I så fall skapar nyckelordet throw ett undantag att fånga. Blocket catch kan användas för att skriva ett felmeddelande eller hantera felet.

Exemplet återställs $ErrorActionPreference till standardvärdet.

Mer information om PowerShell-felhantering finns i Allt du vill veta om undantag.

Aktivera flikens slutförande i PowerShell

Tabbavslut, även kallat "Azure CLI-slutförare", ger slutförande av indata för att ge tips, aktivera identifiering och påskynda inmatning. Kommandonamn, kommandogruppsnamn, parametrar och vissa parametervärden kan automatiskt infogas i kommandoraden genom att trycka på tabbtangenten.

Tabbavslut är aktiverat som standard i Azure Cloud Shell och i de flesta Linux-distributioner. Från och med Azure CLI version 2.49 kan du aktivera tabbar för Azure CLI i PowerShell. Följ de här stegen:

  1. Skapa eller redigera profilen som lagras i variabeln $PROFILE. Det enklaste sättet är att köra notepad $PROFILE i PowerShell. Mer information finns i Så här skapar du din profil och profil och körningsprincip.

  2. Lägg till följande kod i din PowerShell-profil:

    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
    }
    
  3. Om du vill visa alla tillgängliga alternativ på menyn lägger du till Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete i din PowerShell-profil.

Se även