PowerShell 環境での Azure CLI の実行に関する考慮事項

Azure CLI は、Bash 環境と PowerShell 環境の両方で実行される Azure CLI リファレンス コマンドを使用して Azure リソースを管理するツールです。 ただし、パラメーターの書式設定には、予期しない結果になる可能性がある環境間でわずかな構文の違いがあります。 この記事の目的は、PowerShell 環境で作業するときの Azure CLI 構文エラーの解決に役立ちます。

この記事では、次の環境で実行される Azure CLI コマンドの構文の違いを比較します。

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 であることを検出して、エラーを書き込みます。

trycatch キーワードを使用する場合は、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 のタブ補完を有効にできます。 次の手順のようにします。

  1. 変数 $PROFILE に格納されているプロファイルを作成または編集します。 最も簡単な方法は、PowerShell で notepad $PROFILE を実行することです。 詳細については、プロファイルの作成方法プロファイルと実行ポリシーのトピックを参照してください。

  2. 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
    }
    
  3. メニューで使用可能なすべてのオプションを表示するには、PowerShell プロファイルに Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete を追加します。

関連項目