Az Azure CLI PowerShell-szkriptelési nyelven való futtatásának szempontjai
Az Azure CLI egy olyan eszköz, amellyel Azure-erőforrások kezelhetők Bash- és PowerShell-szkriptelési nyelven futó Azure CLI-referenciaparancsokkal. A szkriptnyelvek közötti paraméterformázásban azonban enyhe szintaktikai különbségek vannak, amelyek váratlan eredményeket eredményezhetnek. A cikk célja, hogy segítsen megoldani az Azure CLI szintaxishibáit a PowerShell-szkriptelési nyelv használatakor.
Ez a cikk a következő szkriptnyelveken végrehajtott Azure CLI-parancsok szintaxisbeli különbségeit hasonlítja össze:
- Linux operációs rendszeren futó Bash az Azure Cloud Shell használatával.
- Linux operációs rendszeren futó PowerShell az Azure Cloud Shell használatával.
- A Windows 11-ben futó Windows PowerShell a PowerShell 5 terminállal.
- Windows 11-ben futó PowerShell a PowerShell 7 terminállal.
Ha még csak most ismerkedik a parancssori felülettel, az eszköz és a szkriptnyelv megkülönböztetése zavaró lehet. A megfelelő parancssori eszköz kiválasztása jó összehasonlítást biztosít.
Előfeltételek
Ez a cikk olvasásra és tanulásra szolgál. Ha azonban futtatni szeretné a példákat, válassza a lapot a Prepare your environments
cikkben használt szkriptnyelvek telepítéséhez.
Fontos
Ha olyan Azure CLI-szkripttel rendelkezik, amely hibát okoz, gondolja át, hogy a szkriptnyelv, amelyben dolgozik, hogyan elemzi az Azure CLI parancs szintaxisát.
Szóközök átadása az Azure CLI-paraméterekben
Az Azure CLI-ben, amikor egy szóközt tartalmazó paraméterértéket kell átadnia, az operációs rendszerek és a szkriptnyelvek közötti különbségek vannak. Ebben a példában használja az az storage-fióklistát , és nevezze át a kimeneti oszlopokat egy szóközt tartalmazó szóval.
- Bash Linuxban
- PowerShell Linuxban
- PowerShell 7.4.1 Windows rendszerben
- PowerShell 5.1 Windows rendszerben
Ebben a példában figyelje meg az egyetlen idézőjel ('...'
) burkolót beágyazott dupla idézőjelekkel ("..."
).
Ez a példa linuxos PowerShellben is működik.
az storage account list --query '[].{"SA Name":name, "Primary endpoint":primaryEndpoints.blob}' --output table
Ha szűrőt szeretne hozzáadni, a szintaxis megváltozik. Figyelje meg, hogy ez a példa dupla idézőjelek ("..."
) közé csomagolja a --query
paraméter értékét, és fordított perjelet (\
) használ. Ez a szkript nem fut a PowerShellben.
az storage account list --query "[?creationTime >='2024-02-01'].{\"SA Name\":name,\"Primary endpoint\":primaryEndpoints.blob}" --output table
Ha csak powerShell-szkriptnyelven próbálta futtatni a szűrőszintaxisát, hibaüzenetet argument --query: invalid jmespath_type value: "[?creationTime >=..."
kapott. Linux-környezeten belüli Bash esetén azonban a kimenet a következőhöz hasonló:
SA Name Primary Endpoint
----------- -----------------
msdocssa00000000 https://msdocssa000000000.blob.core.windows.net/
Paraméterek átadása lekérdezési sztringet tartalmazó URL-címben
Az URL-címek kérdőjelei az URL-cím végét és a lekérdezési sztring elejét jelölik. Íme egy példa, amely megnyitja a Learn 3. lépését az Azure CLI használatához:
https://learn.microsoft.com/cli/azure/account?view=azure-cli-2020-09-01-hybrid
.
Az ?view=azure-cli-2020-09-01-hybrid
eredmények az Azure CLI referenciatartalma kívánt verziójában lesznek.
Amikor Azure CLI-parancsokat hajt végre Egy PowerShell-szkriptnyelven, a PowerShell lehetővé teszi, hogy a kérdőjelek egy változónév részei legyenek. Ez zavart okozhat az Azure CLI paraméterértékeiben.
Íme egy példa az Azure REST API használata című cikkből:
Figyelje meg, hogy a $containerRegistryName?api-version
Bashben hiba nélkül összefűz.
# 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
Az ampers és szimbólumot tartalmazó paraméterek átadása
Ha olyan forgatókönyve van, amelyben egy paraméterértékben meg kell adnia egy ampersand értéket, vegye figyelembe, hogy az ampersand (&
) szimbólumot a PowerShell értelmezi. Ez a következő paraméterrel --debug
látható:
az "a&b" --debug
# output
'a' is misspelled or not recognized by the system.
'b' is not recognized as an internal or external command
Ha azonban ugyanezt a tesztet használja egy címke erőforráscsoporthoz való hozzáadásához, akkor a címke értékének amperje nem okoz hibát.
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"
}
Ha olyan forgatókönyve van, amelyben a paraméterérték amperei és értéke hibát okoz, az alábbiakban néhány megoldást talál:
# 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']
At (@
) szimbólumot tartalmazó paraméterek átadása
A PowerShellnek vannak speciális karakterei, például az at (@
) szimbólum, amely egy splatting operátor a PowerShellben. Adjon hozzá egy háttérjelet `
a speciális karakter elé, hogy elkerülje a karaktert. Az értéket egyetlen ('
) vagy dupla ("
) idézőjelbe is csatolhatja.
Az alábbi három példa a PowerShellben fog működni:
- parameterName '@parameters.json
- parameterName "@parameters.json"
- parameterName "@parameters.json"
Ez a példa nem működik a PowerShellben:
- parameterName @parameters.json
Íme egy másik példa a az ad app create
parancsban: Figyelje meg a PowerShell-szkriptnyelvben szükséges JSON-fájlnév körüli dupla idézőjeleket ("..."
).
# Script for a PowerShell scripting language
az ad app create --display-name myTestAppName `
--is-fallback-public-client `
--required-resource-accesses "@manifest.json"
JSON-t tartalmazó paraméterek átadása
Összetett argumentumok, például JSON-sztringek esetén ajánlott az Azure CLI konvenciójával @<file>
betölteni egy fájlból a rendszerhéj értelmezésének megkerülése érdekében. A Bash, a PowerShell és a Cmd.exe JSON-szintaxisra vonatkozó példáiért lásd : A szkriptnyelvek – JSON-sztringek közötti különbségek idézése.
Kulcs:érték párokat tartalmazó paraméterek átadása
Egyes Azure CLI-paraméterértékekhez, például az Azure-erőforráscímkékhez kulcs:érték párokra van szükség. Ha szóközt key
vagy value
speciális karaktert tartalmaz, a Bash és a PowerShell szintaxisa nem mindig egyezik meg.
A Bash, a PowerShell és a Cmd szintaxissal kapcsolatos példáiért tekintse meg a Címkék létrehozása című témakört az Azure CLI-oktatóanyagban szereplő különbségek idézéséhez. Ez az oktatóanyag-lépés példákat ad a következő kulcs:értékpáros forgatókönyvekre:
- Terek
- üres értékek
- speciális karakterek
- változók
Stop-parsing szimbólum
A PowerShell 3.0-ban bevezetett stop-parsing szimbólum (--%
) arra utasítja a PowerShellt, hogy ne értelmezze a bemenetet PowerShell-parancsként vagy -kifejezésként. Amikor stop-parsing szimbólummal találkozik, a PowerShell a sor többi karakterét konstansként kezeli.
az --% vm create --name xxx
Az Azure CLI hibakezelése a PowerShellben
Azure CLI-parancsokat futtathat a PowerShellben a Megfelelő Azure parancssori eszköz kiválasztása című cikkben leírtak szerint. Ha igen, győződjön meg arról, hogy ismeri az Azure CLI-hibakezelést a PowerShellben. Az Azure CLI nem hoz létre kivételeket a PowerShell számára.
Egy másik lehetőség az automatikus változó használata $?
. Ez a változó a legutóbbi parancs állapotát tartalmazza. Ha az előző parancs sikertelen, $?
akkor a következő érték van $False
megadva: . További információ: about_Automatic_Variables.
Az alábbi példa bemutatja, hogyan működik ez az automatikus változó a hibakezeléshez:
# Script for a PowerShell scripting language
az group create --name MyResourceGroup
if ($? -eq $false) {
Write-Error "Error creating resource group."
}
A az
parancs meghiúsul, mert hiányzik a szükséges --location
paraméter. A feltételes utasítás hamisnak találja, $?
és hibát ír.
Ha a kulcsszavakat és catch
a try
kulcsszavakat szeretné használni, kivételt hozhat throw
létre a blokk számára a try
fogáshoz:
# 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"
Alapértelmezés szerint a PowerShell csak a megszüntetési hibákat rögzíti. Ez a példa úgy állítja be a $ErrorActionPreference
globális változót, hogy Stop
a PowerShell kezelni tudja a hibát.
A feltételes utasítás ellenőrzi a változót $?
, hogy az előző parancs nem sikerült-e. Ha igen, a throw
kulcsszó kivételt hoz létre a fogáshoz. A catch
blokk használható hibaüzenet írására vagy a hiba kezelésére.
A példa visszaállítja $ErrorActionPreference
az alapértelmezett értékét.
A PowerShell-hibakezeléssel kapcsolatos további információkért lásd : Minden, amit tudni szeretne a kivételekről.
Lapkiegészítés engedélyezése a PowerShellben
A tabulátorkiegészítés, más néven "Azure CLI-kiegészítések" a bemenetek kiegészítését biztosítják, hogy tippeket adjanak, lehetővé tegyék a felderítést és felgyorsíthassák a bemeneti bevitelt. A tabulátorbillentyűvel automatikusan beszúrhatók a parancssorba a parancsnevek, a parancscsoportok nevei, a paraméterek és bizonyos paraméterértékek.
A tabulátorkizárás alapértelmezés szerint engedélyezve van az Azure Cloud Shellben és a legtöbb Linux-disztribúcióban. Az Azure CLI 2.49-es verziójától kezdve engedélyezheti az Azure CLI lapkiegészítését a PowerShellben. Tegye a következők egyikét:
Hozza létre vagy szerkessze a változóban
$PROFILE
tárolt profilt. A legegyszerűbb módszer a PowerShellben való futtatásnotepad $PROFILE
. További információ: A profil és a profilok létrehozása és a végrehajtási szabályzat.Adja hozzá a következő kódot a PowerShell-profilhoz:
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 }
A menüben elérhető összes lehetőség megjelenítéséhez adja hozzá
Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete
a PowerShell-profiljához.