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ě:
Vytvořte nebo upravte profil uložený v proměnné
$PROFILE
. Nejjednodušší způsob je spustitnotepad $PROFILE
v PowerShellu. Další informace najdete v tématu Vytvoření profilu a profilů a zásad spouštění.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 }
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é
- Porovnejte syntaxi prostředí Bash, PowerShell a Cmd v těchto článcích:
- Použití uvozovek v parametrech
- Informace o problémech s uvozováním v PowerShellu