PowerShell 環境での Azure CLI の実行に関する考慮事項
Azure CLI は、Bash 環境と PowerShell 環境の両方で実行される Azure CLI リファレンス コマンドを使用して Azure リソースを管理するツールです。 ただし、パラメーターの書式設定には、予期しない結果になる可能性がある環境間でわずかな構文の違いがあります。 この記事の目的は、PowerShell 環境で作業するときの Azure CLI 構文エラーの解決に役立ちます。
この記事では、次の環境で実行される Azure CLI コマンドの構文の違いを比較します。
- Azure Cloud Shell を使用して Linux オペレーティング システムで実行されている Bash。
- Azure Cloud Shell を使用して Linux オペレーティング システムで実行されている PowerShell 。
- PowerShell 5 ターミナルを使用して Windows 11 で実行されている Windows PowerShell。
- PowerShell 7 ターミナルを使用して Windows 11 で実行されている PowerShell。
CLI を初めて使用する場合は、ツールと環境の区別が混乱する可能性があります。 適切なコマンドライン ツール を選択する方法は、適切な比較を提供します。
前提条件
この記事は、読んで学ぶことを目的としています。 ただし、例を実行する場合は、この記事で使用する環境をインストールするタブを選択 Prepare your environments
します。
重要
エラーが発生している Azure CLI スクリプトがある場合は、 作業中の環境で Azure CLI コマンド構文を解析する方法を検討してください。
Azure CLI パラメーターでスペースを渡す
Azure CLI では、スペースを含むパラメーター値を渡す必要がある場合、オペレーティング システムと環境の間に違いがあります。 この例では、az storage account list を使用し、出力列の名前をスペースを含む単語で名前を変更します。
この例では、二重引用符 () が埋め込まれた単一引用符 ('...'
"..."
) ラッパーに注目してください。
この例は、Linux の PowerShell でも機能します。
az storage account list --query '[].{"SA Name":name, "Primary endpoint":primaryEndpoints.blob}' --output table
フィルターを追加する場合は、構文が変更されます。 この例では、パラメーター値を--query
二重引用符 () で囲み、円記号 ("..."
\
) エスケープ文字を使用する方法に注目してください。 このスクリプトは PowerShell では実行されません。
az storage account list --query "[?creationTime >='2024-02-01'].{\"SA Name\":name,\"Primary endpoint\":primaryEndpoints.blob}" --output table
PowerShell 環境でフィルター構文を実行しようとした場合は、エラー メッセージが表示 argument --query: invalid jmespath_type value: "[?creationTime >=..."
されます。 ただし、Linux 環境内の Bash では、出力は次のようになります。
SA Name Primary Endpoint
----------- -----------------
msdocssa00000000 https://msdocssa000000000.blob.core.windows.net/
クエリ文字列を含む URL にパラメーターを渡す
URL の疑問符は、URL の末尾とクエリ文字列の先頭を示します。 Azure CLI を使用するための Learn の手順 3 を開く例を次に示します。
https://learn.microsoft.com/en-us/cli/azure/account?view=azure-cli-2020-09-01-hybrid
.
結果は ?view=azure-cli-2020-09-01-hybrid
、Azure CLI 参照コンテンツの目的のバージョンになります。
PowerShell 環境で Azure CLI コマンドを実行すると、PowerShell では疑問符を変数名の一部にすることができます。 これにより、Azure CLI のパラメーター値が混乱する可能性があります。
Azure REST API の使用に関する記事の例を次に示します。
Bash でエラーなしでどのように連結されるか $containerRegistryName?api-version
に注目してください。
# 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
PowerShell 特殊文字を含むパラメーターを渡す
PowerShell には、At (@
) 記号などの特殊文字があります。 PowerShell で Azure CLI を実行するには、特殊文字の前にバックティック `
を追加してエスケープします。 値は、単一 ('
) または二重引用符 ("
) で囲むこともできます。
PowerShell では、次の 3 つの例が機能します。
- parameterName '@parameters.json
- parameterName '@parameters.json'
- parameterName "@parameters.json"
この例は PowerShell では機能しません。
- parameterName @parameters.json
JSON を含むパラメーターを渡す
JSON 文字列のような複雑な引数の場合、ベスト プラクティスは、Azure CLI の @<file>
規則を使用してファイルから読み込み、シェルの解釈をバイパスすることです。 At (@
) 記号は PowerShell のスプラッティング演算子であるため、引用符で囲む必要があります。
az ad app create には、JSON ファイルの内容とコマンドの例の両方を含む良い例があります。 コード スニペットはこちらです。
# Script for a Bash environment
az ad app create --display-name myTestAppName \
--is-fallback-public-client \
--required-resource-accesses @manifest.json
キーと値のペアを含むパラメーターを渡す
Azure リソース タグなどの一部の Azure CLI パラメーター値には、キーと値のペアが必要です。 key
スペースまたはvalue
特殊文字が含まれている場合、Bash と PowerShell の構文は常に同じとは限りません。
Azure CLI の使用に関するチュートリアルの「違いを引用する」の「タグの作成」を参照してください。 このチュートリアルの手順では、次のキーと値のペアのシナリオで Bash、PowerShell、Cmd の例を示します。
- スペース
- 空の値
- 特殊文字
- variables
PowerShell でのAzure CLI のエラー処理
適切なコマンド ライン ツールの選択に関する記事の説明に従って、PowerShell で Azure CLI コマンドを実行できます。 その場合は、PowerShell での Azure CLI のエラー処理方法を理解しておいてください。 特に、Azure CLI では、PowerShell によってキャッチされる例外は作成されません。
代わりに、$?
自動変数を使用します。 この変数には、最新のコマンドの状態が含まれています。 前のコマンドが失敗した場合、$?
の値は $False
になります。 詳細については、「about_Automatic_Variables」を参照してください。
次の例では、この自動変数がエラー処理でどのように機能するかを示します。
# Script for a PowerShell environment
az group create --name MyResourceGroup
if ($? -eq $false) {
Write-Error "Error creating resource group."
}
az
コマンドは、必要な --location
パラメータが指定されていないために失敗します。 条件ステートメントは、$?
が false であることを検出して、エラーを書き込みます。
try
と catch
キーワードを使用する場合は、throw
を使用して、try
ブロックでキャッチされる例外を作成できます。
# 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 では強制終了エラーのみがキャッチされます。 この例では、PowerShell でエラーを処理できるように、$ErrorActionPreference
グローバル変数が Stop
に設定されています。
条件ステートメントは、$?
をテストして、前のコマンドが失敗したかどうかを確認します。 そうである場合は、throw
キーワードによって、キャッチする例外が作成されます。 catch
ブロックを使用して、エラー メッセージを書き込んだり、エラーを処理したりできます。
この例では、$ErrorActionPreference
が既定値に復元されます。
PowerShell のエラー処理については、「例外について知りたかったことのすべて」を参照してください。
PowerShell でタブ補完を有効にする
タブ補完 ("Azure CLI の補完機能" とも呼ばれます) は、ヒントを示したり、検出を有効にしたり、入力エントリを高速化したりするための入力の補完機能を提供します。 Tab キーを押すことによって、コマンド名、コマンド グループ名、パラメーターや特定のパラメーター値をコマンド ラインに自動的に挿入できます。
タブ補完は、Azure Cloud Shell や、ほとんどの Linux ディストリビューションで既定で有効になります。 Azure CLI バージョン 2.49 以降では、PowerShell で Azure CLI のタブ補完を有効にできます。 次の手順のようにします。
変数
$PROFILE
に格納されているプロファイルを作成または編集します。 最も簡単な方法は、PowerShell でnotepad $PROFILE
を実行することです。 詳細については、プロファイルの作成方法とプロファイルと実行ポリシーのトピックを参照してください。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 }
メニューで使用可能なすべてのオプションを表示するには、PowerShell プロファイルに
Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete
を追加します。
関連項目
- 次の記事で Bash、PowerShell、および Cmd の構文を比較します。
- パラメーターで引用符を使用する
- PowerShell での引用符の問題について説明します