PowerShell 환경에서 Azure CLI를 실행하기 위한 고려 사항

Azure CLI는 Bash 및 PowerShell 환경에서 실행되는 Azure CLI 참조 명령을 통해 Azure 리소스를 관리하는 도구입니다. 그러나 환경 간에 매개 변수 서식에 약간의 구문 차이가 있어 예기치 않은 결과가 발생할 수 있습니다. 이 문서의 목적은 PowerShell 환경에서 작업할 때 Azure CLI 구문 오류를 해결하는 데 도움이 되는 것입니다.

이 문서에서는 다음 환경에서 실행되는 Azure CLI 명령의 구문 차이점을 비교합니다.

CLI를 접하는 경우 도구환경을 구분하는 것이 혼란스러울 수 있습니다. 올바른 명령줄 도구를 선택하는 방법은 좋은 비교를 제공합니다.

필수 조건

이 문서는 읽고 배우기 위한 것입니다. 그러나 예제를 실행하려면 탭을 선택하여 Prepare your environments 이 문서에 사용된 환경을 설치합니다.

Important

오류를 생성하는 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에서 작동합니다.

  • 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 자습서를 사용하려면 Learn에서 따옴표로 묶는 차이점을 연습하려면 태그 만들기를 참조하세요. 이 자습서 단계에서는 다음 키:값 쌍 시나리오에 대한 Bash, PowerShell 및 Cmd에 대한 예제를 제공합니다.

  • spaces
  • 빈 값
  • 특수 문자
  • variables

PowerShell에서 Azure CLI에 대한 오류 처리

올바른 Azure 명령줄 도구 선택에서 설명한 대로 PowerShell에서 Azure CLI 명령을 실행할 수 있습니다. 이 경우 PowerShell에서 Azure CLI 오류 처리를 이해해야 합니다. 특히 Azure CLI는 PowerShell에서 catch할 예외를 만들지 않습니다.

대안은 자동 변수를 사용하는 것입니다 $? . 이 변수는 가장 최근 명령의 상태 포함합니다. 이전 명령이 실패 $? 하면 값이 .입니다 $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임을 $? 발견하고 오류를 씁니다.

키워드(keyword) catch 사용 try 하려는 경우 블록을 catch할 예외 try 를 만드는 데 사용할 throw 수 있습니다.

# 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은 종료 오류만 catch합니다. 이 예제에서는 PowerShell에서 오류를 처리할 수 있도록 $ErrorActionPreference 전역 변수를 Stop으로 설정합니다.

조건문은 변수를 $? 테스트하여 이전 명령이 실패했는지 확인합니다. 이 throw 경우 키워드(keyword) catch할 예외를 만듭니다. 블록을 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 합니다.

참고 항목