Sdílet prostřednictvím


Důležité informace o spuštění Azure CLI v prostředí PowerShellu

Azure CLI je nástroj pro správu prostředků Azure prostřednictvím referenčních příkazů Azure CLI, které běží v prostředí Bash i PowerShellu. Mezi prostředími však existují mírné rozdíly v syntaxi formátování parametrů, které můžou vést k neočekávaným výsledkům. Účelem tohoto článku je pomoct vyřešit chyby syntaxe Azure CLI při práci v prostředí PowerShell.

Tento článek porovnává rozdíly syntaxe příkazů Azure CLI spuštěných v následujících prostředích:

  • Bash spuštěný v operačním systému Linux pomocí Azure Cloud Shellu
  • PowerShell spuštěný v operačním systému Linux pomocí Azure Cloud Shellu
  • Windows PowerShell spuštěný ve Windows 11 pomocí terminálu PowerShellu 5.
  • PowerShell spuštěný ve Windows 11 pomocí terminálu PowerShellu 7

Pokud s rozhraním příkazového řádku začínáte, může být rozdíl mezi nástrojem a prostředím matoucí. Volba správného nástroje příkazového řádku poskytuje dobré porovnání.

Požadavky

Tento článek je určený ke čtení a učení. Pokud ale chcete spustit příklady, vyberte Prepare your environments kartu pro instalaci prostředí použitých v tomto článku.

Důležité

Pokud máte skript Azure CLI, který vytváří chybu, zvažte, jak prostředí, ve kterých pracujete, parsuje syntaxi příkazů Azure CLI.

Předání mezer v parametrech Azure CLI

Pokud v Azure CLI potřebujete předat hodnotu parametru obsahující mezeru, existují rozdíly v uvozování mezi operačními systémy a prostředími. V tomto příkladu použijte příkaz az storage account list a přejmenujte výstupní sloupce s slovem obsahujícím mezeru.

V tomto příkladu si všimněte obálky jednoduchých uvozovek ('...') s vloženými dvojitými uvozovkami ("..."). Tento příklad funguje také v PowerShellu v Linuxu.

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

Pokud chcete přidat filtr, syntaxe se změní. Všimněte si, jak tento příklad zabalí hodnotu parametru --query do dvojitých uvozovek ("...") a používá řídicí znak zpětného lomítka (\). Tento skript se nespustí v PowerShellu.

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

Pokud jste se právě pokusili spustit syntaxi filtru v prostředí PowerShell, zobrazila se chybová zpráva argument --query: invalid jmespath_type value: "[?creationTime >=...". V prostředí Bash v linuxovém prostředí je ale výstup podobný tomuto:

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

Předání parametrů v adrese URL obsahující řetězec dotazu

Otazníky v adresách URL označují konec adresy URL a začátek řetězce dotazu. Tady je příklad, který otevře krok 3 v části Learn pro použití Azure CLI:

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

Výsledkem ?view=azure-cli-2020-09-01-hybrid je požadovaná verze referenčního obsahu Azure CLI.

Když v prostředí PowerShellu spouštíte příkazy Azure CLI, PowerShell umožňuje, aby otazníky byly součástí názvu proměnné. To může způsobit nejasnosti v hodnotách parametrů Azure CLI.

Tady je příklad z článku Použití rozhraní Azure REST API :

Všimněte si, jak $containerRegistryName?api-version zřetězí dohromady bez chyby v Bashu.

# 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

Předání parametrů obsahujících speciální znak PowerShellu

Existují speciální znaky PowerShellu , například symbol At (@). Pokud chcete spustit Azure CLI v PowerShellu, přidejte před speciální znak zpětné znaméčko ` , abyste ho utekli. Hodnotu můžete také uzavřít do jednoduchých (') nebo dvojitých (") uvozovek.

V PowerShellu budou fungovat následující tři příklady:

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

Tento příklad nebude v PowerShellu fungovat:

  • Parametername @parameters.json

Předání parametrů obsahujících JSON

U složitých argumentů, jako je řetězec JSON, je osvědčeným postupem použít konvenci Azure CLI @<file> k načtení ze souboru a obejít interpretaci prostředí. Všimněte si, že symbol At (@) je operátor splatting v PowerShellu, takže by se měl uvozovat.

Existují dobré příklady v az ad app create , které obsahují jak obsah souboru JSON, tak příklady příkazů. Tady je fragment kódu:

# Script for a Bash environment

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

Předání parametrů obsahujících páry klíč:hodnota

Některé hodnoty parametrů Azure CLI, jako jsou značky prostředků Azure, vyžadují páry klíč:hodnota. Pokud máte key mezeru nebo value speciální znak, syntaxe Bash a PowerShellu nejsou vždy stejné.

Informace o používání kurzu Azure CLI najdete v tématu Vytvoření značek, které vám použijí rozdíly v uvozování v kurzech Learn. Tento krok kurzu obsahuje příklady pro Bash, PowerShell a Cmd pro následující scénáře páru klíč:hodnota:

  • Mezery
  • prázdné hodnoty
  • speciální znaky
  • proměnné

Zpracování chyb pro Azure CLI v PowerShellu

Příkazy Azure CLI můžete spouštět v PowerShellu, jak je popsáno v části Volba správného nástroje příkazového řádku Azure. Pokud ano, ujistěte se, že rozumíte zpracování chyb Azure CLI v PowerShellu. Konkrétně Azure CLI nevytáčí výjimky, které powershell zachytí.

Alternativou je použití $? automatické proměnné. Tato proměnná obsahuje stav posledního příkazu. Pokud předchozí příkaz selže, $? má hodnotu $False. Další informace najdete v tématu about_Automatic_Variables.

Následující příklad ukazuje, jak tato automatická proměnná může fungovat pro zpracování chyb:

# Script for a PowerShell environment

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

Příkaz az selže, protože chybí požadovaný --location parametr. Podmíněný příkaz najde hodnotu $? false a zapíše chybu.

Pokud chcete použít klíčová try slova a catch klíčová slova, můžete vytvořit throw výjimku pro try blok, který se má zachytit:

# 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 ve výchozím nastavení zachytává jenom ukončující chyby. Tento příklad nastaví globální proměnnou $ErrorActionPreference tak Stop , aby PowerShell mohl chybu zpracovat.

Podmíněný příkaz otestuje proměnnou $? a zjistí, jestli předchozí příkaz selhal. Pokud ano, throw klíčové slovo vytvoří výjimku, která se má zachytit. Blok catch lze použít k zápisu chybové zprávy nebo zpracování chyby.

Příklad se $ErrorActionPreference obnoví na výchozí hodnotu.

Další informace o zpracování chyb PowerShellu najdete v tématu Vše, co jste chtěli vědět o výjimkách.

Povolení dokončování tabulátoru v PowerShellu

Dokončování tabulátoru, označované také jako dokončené rozhraní příkazového řádku Azure, poskytuje dokončování vstupů, které poskytují rady, umožňují zjišťování a urychlují zadávání vstupu. Názvy příkazů, názvy skupin příkazů, parametry a určité hodnoty parametrů lze automaticky vložit do příkazového řádku stisknutím klávesy Tab .

Dokončování tabulátoru je ve výchozím nastavení povolené ve službě Azure Cloud Shell a ve většině linuxových distribucí. Počínaje Azure CLI verze 2.49 můžete povolit dokončování tabulátoru pro Azure CLI v PowerShellu. Postupujte následovně:

  1. Vytvořte nebo upravte profil uložený v proměnné $PROFILE. Nejjednodušší způsob je spustit notepad $PROFILE v PowerShellu. Další informace najdete v tématu Vytvoření profilu a profilů a zásad spouštění.

  2. Do profilu PowerShellu přidejte následující kód:

    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. Pokud chcete zobrazit všechny dostupné možnosti v nabídce, přidejte Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete ho do profilu PowerShellu.

Viz také