Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Azure CLI je nástroj pro správu prostředků Azure prostřednictvím referenčních příkazů Azure CLI, které běží v Bashu i skriptovacím jazyce PowerShellu. Mezi skriptovacími jazyky ale 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 při řešení chyb syntaxe Azure CLI při práci ve skriptovacím jazyce PowerShellu.
Tento článek porovnává rozdíly syntaxe příkazů Azure CLI spuštěných v následujících skriptovacích jazycí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 skriptovacím jazykem matoucí. Jak si vybrat správný nástroj příkazového řádku nabízí dobré srovná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 skriptovacího jazyka použitého v tomto článku.
Důležité
Pokud máte skript Azure CLI, který vytváří chybu, zvažte, jak skriptovací jazyk, ve který 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 skriptovacími jazyky. V tomto příkladu použijte az storage account list a přejmenujte výstupní sloupce se slovem, které obsahuje 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á escape 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 ve skriptovacím jazyce PowerShellu, 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:
/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ž spustíte příkazy Azure CLI ve skriptovacím jazyce PowerShellu, 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 prostředí 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
Předání parametrů obsahujících symbol ampersand
Pokud máte scénář, ve kterém potřebujete předat ampersand v hodnotě parametru, mějte na paměti, že powershell interpretuje symbol ampersand (&). K tomu dochází pomocí parametru --debug :
az "a&b" --debug
# output
'a' is misspelled or not recognized by the system.
'b' is not recognized as an internal or external command
Pokud ale použijete stejný test k přidání značky do skupiny prostředků, ampersand v hodnotě značky nezpůsobuje chybu.
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"
}
Pokud máte scénář, ve kterém ampersand v hodnotě parametru způsobuje chybu, tady jsou některá řešení:
# 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']
Předání parametrů obsahujících symbol at (@)
Existují speciální znaky PowerShellu, například symbol at (@), což je operátor splatting v PowerShellu. Přidejte zpětný apostrof ` před speciální znak, aby ho unikl. 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
Tady je další příklad příkazu az ad app create : Všimněte si dvojitých uvozovek ("...") kolem názvu souboru JSON potřebného ve skriptovacím jazyce PowerShellu.
# Script for a PowerShell scripting language
az ad app create --display-name myTestAppName `
--is-fallback-public-client `
--required-resource-accesses "@manifest.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í. Příklady syntaxe JSON pro Bash, PowerShell a Cmd.exenajdete v tématu Citace rozdílů mezi skriptovacími jazyky – řetězce 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é.
Příklady syntaxe pro Bash, PowerShell a Cmd najdete v části Vytvořte značky pro procvičení rozdílů v uvozování v kurzu Naučte se používat Azure CLI. Tento krok kurzu obsahuje příklady pro následující scénáře páru klíč:hodnota:
- mezery
- prázdné hodnoty
- speciální znaky
- proměnné
Symbol zastavení analýzy
Symbol zastavení analýzy (--%) zavedený v PowerShellu 3.0 přesměruje PowerShell, aby nepřekládaly vstup jako příkazy nebo výrazy PowerShellu. Když narazí na symbol zastavení analýzy, PowerShell považuje zbývající znaky na řádku za doslovný text.
az --% vm create --name xxx
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 nevytváří výjimky, které může PowerShell zachytit.
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. Viz about_Automatic_Variablespro více informací.
Následující příklad ukazuje, jak tato automatická proměnná může fungovat pro zpracování chyb:
# Script for a PowerShell scripting language
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á slova try a catch, můžete použít throw k vytvoření výjimky pro blok try, který se má zachytit:
# 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"
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, kterou lze zachytit. Blok catch lze použít k zápisu chybové zprávy nebo zpracování chyby.
Příklad obnoví $ErrorActionPreference 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í pomocí klávesy Tab v PowerShellu
Dokončování tabulátorem, označované také jako "dokončovače pro Azure CLI", nabízí doplnění vstupů, které poskytuje nápovědu, umožňuje prozkoumávání a urychluje zadávání. 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 verzí 2.49 Azure CLI můžete v PowerShellu povolit dokončování tabulátoru pro Azure CLI. Postupujte takto:
Vytvořte nebo upravte profil uložený v proměnné
$PROFILE. Nejjednodušší způsob je spustitnotepad $PROFILEv 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 MenuCompletedo svého profilu PowerShell.
Viz také
- Technické poznámky Azure CLI k problémům s citacemi v PowerShellu
- Porovnejte syntaxi prostředí Bash, PowerShell a Cmd v těchto článcích: