Zagadnienia dotyczące uruchamiania interfejsu wiersza polecenia platformy Azure w środowisku programu PowerShell
Interfejs wiersza polecenia platformy Azure to narzędzie do zarządzania zasobami platformy Azure za pomocą poleceń referencyjnych interfejsu wiersza polecenia platformy Azure uruchamianych zarówno w środowisku powłoki Bash, jak i programu PowerShell. Istnieją jednak niewielkie różnice składni w formatowaniu parametrów między środowiskami, które mogą powodować nieoczekiwane wyniki. Celem tego artykułu jest pomoc w rozwiązywaniu problemów ze składnią interfejsu wiersza polecenia platformy Azure podczas pracy w środowisku programu PowerShell.
W tym artykule porównano różnice składni poleceń interfejsu wiersza polecenia platformy Azure wykonywane w następujących środowiskach:
- Powłoka Bash działająca w systemie operacyjnym Linux przy użyciu usługi Azure Cloud Shell.
- Program PowerShell uruchomiony w systemie operacyjnym Linux przy użyciu usługi Azure Cloud Shell.
- Program Windows PowerShell uruchomiony w systemie Windows 11 przy użyciu terminalu programu PowerShell 5.
- Program PowerShell uruchomiony w systemie Windows 11 przy użyciu terminalu programu PowerShell 7.
Jeśli dopiero zaczynasz korzystać z interfejsu wiersza polecenia, różnicowanie między narzędziem a środowiskiem może być mylące. Sposób wybierania odpowiedniego narzędzia wiersza polecenia zapewnia dobre porównanie.
Wymagania wstępne
Ten artykuł jest przeznaczony do czytania i nauki. Jeśli jednak chcesz uruchomić przykłady, wybierz kartę Prepare your environments
, aby zainstalować środowiska używane w tym artykule.
Ważne
Jeśli masz skrypt interfejsu wiersza polecenia platformy Azure, który generuje błąd, rozważ, w jaki sposób środowisko, w którym pracujesz, analizuje składnię polecenia interfejsu wiersza polecenia platformy Azure.
Przekazywanie przestrzeni w parametrach interfejsu wiersza polecenia platformy Azure
W interfejsie wiersza polecenia platformy Azure, gdy musisz przekazać wartość parametru zawierającą spację, istnieją różnice między systemami operacyjnymi i środowiskami. W tym przykładzie użyj polecenia az storage account list i zmień nazwę kolumn wyjściowych na wyraz zawierający spację.
- Powłoka Bash w systemie Linux
- Program PowerShell w systemie Linux
- Program PowerShell 7.4.1 w systemie Windows
- Program PowerShell 5.1 w systemie Windows
W tym przykładzie zwróć uwagę na otokę pojedynczego cudzysłowu ('...'
) z osadzonymi podwójnymi cudzysłowami ("..."
).
Ten przykład działa również w programie PowerShell w systemie Linux.
az storage account list --query '[].{"SA Name":name, "Primary endpoint":primaryEndpoints.blob}' --output table
Jeśli chcesz dodać filtr, składnia ulegnie zmianie. Zwróć uwagę, że ten przykład opakowuje wartość parametru --query
w cudzysłowach ("..."
) i używa znaku ucieczki ukośnika odwrotnego (\
). Ten skrypt nie jest uruchamiany w programie PowerShell.
az storage account list --query "[?creationTime >='2024-02-01'].{\"SA Name\":name,\"Primary endpoint\":primaryEndpoints.blob}" --output table
Jeśli właśnie podjęto próbę uruchomienia składni filtru w środowisku programu PowerShell, został wyświetlony komunikat argument --query: invalid jmespath_type value: "[?creationTime >=..."
o błędzie . Jednak w powłoce Bash w środowisku systemu Linux dane wyjściowe są podobne do następujących:
SA Name Primary Endpoint
----------- -----------------
msdocssa00000000 https://msdocssa000000000.blob.core.windows.net/
Przekazywanie parametrów w adresie URL zawierającym ciąg zapytania
Znaki zapytania w adresach URL wskazują koniec adresu URL i początek ciągu zapytania. Oto przykład, który otwiera krok 3 w artykule Dowiedz się, jak używać interfejsu wiersza polecenia platformy Azure:
https://learn.microsoft.com/en-us/cli/azure/account?view=azure-cli-2020-09-01-hybrid
.
Wyniki ?view=azure-cli-2020-09-01-hybrid
w żądanej wersji zawartości referencyjnej interfejsu wiersza polecenia platformy Azure.
Podczas wykonywania poleceń interfejsu wiersza polecenia platformy Azure w środowisku programu PowerShell program PowerShell umożliwia używanie znaków zapytania jako części nazwy zmiennej. Może to spowodować zamieszanie w wartościach parametrów interfejsu wiersza polecenia platformy Azure.
Oto przykład z artykułu Korzystanie z interfejsu API REST platformy Azure:
Zwróć uwagę, jak $containerRegistryName?api-version
łączy się ze sobą bez błędu w powłoce 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
Przekazywanie parametrów zawierających znak specjalny programu PowerShell
Istnieją znaki specjalne programu PowerShell, takie jak symbol At (@
). Aby uruchomić interfejs wiersza polecenia platformy Azure w programie PowerShell, dodaj backtick `
przed znakiem specjalnym, aby go uniknąć. Wartość można również ująć w cudzysłowy pojedyncze ('
) lub podwójne ("
).
Następujące trzy przykłady będą działać w programie PowerShell:
- nazwa_parametru '@parameters.json
- nazwa parametru "@parameters.json"
- parameterName "@parameters.json"
Ten przykład nie będzie działać w programie PowerShell:
- Parametername @parameters.json
Przekazywanie parametrów zawierających kod JSON
W przypadku złożonych argumentów, takich jak ciąg JSON, najlepszym rozwiązaniem jest użycie konwencji interfejsu wiersza polecenia @<file>
platformy Azure do załadowania z pliku w celu obejścia interpretacji powłoki. Należy pamiętać, że symbol At (@
) jest operatorem platania w programie PowerShell, więc powinien być cytowany.
Istnieją dobre przykłady w pliku az ad app create , które zawierają zarówno zawartość pliku JSON, jak i przykłady poleceń. Oto fragment kodu:
# Script for a Bash environment
az ad app create --display-name myTestAppName \
--is-fallback-public-client \
--required-resource-accesses @manifest.json
Przekazywanie parametrów zawierających pary key:value
Niektóre wartości parametrów interfejsu wiersza polecenia platformy Azure, takie jak tagi zasobów platformy Azure, wymagają par key:value. Jeśli element key
lub value
zawiera spację lub znak specjalny, składnia powłoki Bash i programu PowerShell nie zawsze są takie same.
Zobacz Tworzenie tagów , aby przećwiczyć cytowanie różnic w samouczku Learn, aby użyć interfejsu wiersza polecenia platformy Azure. Ten krok samouczka zawiera przykłady scenariuszy powłoki Bash, programu PowerShell i narzędzia Cmd dla następujących scenariuszy par key:value:
- Spacje
- puste wartości
- znaki specjalne
- zmienne
Obsługa błędów interfejsu wiersza polecenia platformy Azure w programie PowerShell
Polecenia interfejsu wiersza polecenia platformy Azure można uruchamiać w programie PowerShell, zgodnie z opisem w artykule Wybieranie odpowiedniego narzędzia wiersza polecenia platformy Azure. Jeśli to zrobisz, upewnij się, że rozumiesz obsługę błędów interfejsu wiersza polecenia platformy Azure w programie PowerShell. W szczególności interfejs wiersza polecenia platformy Azure nie tworzy wyjątków dla programu PowerShell w celu przechwycenia.
Alternatywą jest użycie zmiennej automatycznej $?
. Ta zmienna zawiera stan ostatniego polecenia. Jeśli poprzednie polecenie zakończy się niepowodzeniem, $?
ma wartość $False
. Aby uzyskać więcej informacji, zobacz about_Automatic_Variables.
W poniższym przykładzie pokazano, jak ta zmienna automatyczna może działać w celu obsługi błędów:
# Script for a PowerShell environment
az group create --name MyResourceGroup
if ($? -eq $false) {
Write-Error "Error creating resource group."
}
Polecenie az
kończy się niepowodzeniem, ponieważ brakuje wymaganego --location
parametru. Instrukcja warunkowa znajduje wartość $?
false i zapisuje błąd.
Jeśli chcesz użyć try
słów kluczowych i catch
, możesz użyć throw
polecenia , aby utworzyć wyjątek dla try
bloku w celu przechwycenia:
# 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"
Domyślnie program PowerShell przechwytuje tylko błędy zakończenia. W tym przykładzie ustawiono zmienną $ErrorActionPreference
globalną tak Stop
, aby program PowerShell mógł obsłużyć błąd.
Instrukcja warunkowa sprawdza zmienną, $?
aby sprawdzić, czy poprzednie polecenie nie powiodło się. Jeśli tak, throw
słowo kluczowe tworzy wyjątek do przechwycenia. Blok catch
może służyć do pisania komunikatu o błędzie lub obsługi błędu.
Przykład przywraca $ErrorActionPreference
wartość domyślną.
Aby uzyskać więcej informacji na temat obsługi błędów programu PowerShell, zobacz Wszystko, co chciałeś wiedzieć o wyjątkach.
Włączanie uzupełniania kart w programie PowerShell
Uzupełnianie karty, nazywane również "kompletnymi elementami interfejsu wiersza polecenia platformy Azure", zapewnia uzupełnianie danych wejściowych w celu zapewnienia wskazówek, włączania odnajdywania i przyspieszania wprowadzania danych wejściowych. Nazwy poleceń, nazwy grup poleceń, parametry i niektóre wartości parametrów można automatycznie wstawić do wiersza polecenia, naciskając klawisz Tab .
Uzupełnianie kart jest domyślnie włączone w usłudze Azure Cloud Shell i w większości dystrybucji systemu Linux. Począwszy od interfejsu wiersza polecenia platformy Azure w wersji 2.49, możesz włączyć uzupełnianie kart dla interfejsu wiersza polecenia platformy Azure w programie PowerShell. Wykonaj te kroki:
Utwórz lub edytuj profil przechowywany w zmiennej
$PROFILE
. Najprostszym sposobem jest uruchomienienotepad $PROFILE
w programie PowerShell. Aby uzyskać więcej informacji, zobacz Jak utworzyć profil i profile i zasady wykonywania.Dodaj następujący kod do profilu programu PowerShell:
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 }
Aby wyświetlić wszystkie dostępne opcje w menu, dodaj
Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete
go do profilu programu PowerShell.
Zobacz też
- Porównaj składnię powłoki Bash, programu PowerShell i narzędzia Cmd w następujących artykułach:
- Używanie cudzysłowów w parametrach
- Dowiedz się, jak cytować problemy z programem PowerShell