Azure CLI'yi PowerShell ortamında çalıştırma konusunda dikkat edilmesi gerekenler

Azure CLI, hem Bash hem de PowerShell ortamında çalışan Azure CLI başvuru komutları aracılığıyla Azure kaynaklarını yönetmek için kullanılan bir araçtır. Ancak, ortamlar arasındaki parametre biçimlendirmesinde beklenmeyen sonuçlara neden olabilecek küçük söz dizimi farklılıkları vardır. Bu makalenin amacı, PowerShell ortamında çalışırken Azure CLI söz dizimi hatalarını çözmenize yardımcı olmaktır.

Bu makalede, aşağıdaki ortamlarda yürütülen Azure CLI komutlarının söz dizimi farklılıkları karşılaştırılır:

CLI'yı yeni kullanıyorsanız, bir araçlaortam arasında ayrım yapmak kafa karıştırıcı olabilir. Doğru komut satırı aracını seçme iyi bir karşılaştırma sağlar.

Önkoşullar

Bu makale okumanız ve öğrenmeniz için tasarlanmıştır. Ancak, örnekleri çalıştırmak istiyorsanız, bu makalede kullanılan ortamları yüklemek için sekmeyi seçin Prepare your environments .

Önemli

Hata oluşturan bir Azure CLI betiğiniz olduğunda, üzerinde çalıştığınız ortamın Azure CLI komut söz dizimini nasıl ayrıştırdığını göz önünde bulundurun.

Azure CLI parametrelerinde alanları geçirme

Azure CLI'da, boşluk içeren bir parametre değeri geçirmeniz gerektiğinde, işletim sistemleri ve ortamlar arasında alıntılama farkları vardır. Bu örnekte az storage account list komutunu kullanın ve çıkış sütunlarını boşluk içeren bir sözcükle yeniden adlandırın.

Bu örnekte, katıştırılmış çift tırnaklı () tek tırnak ('...'"...") sarmalayıcıya dikkat edin. Bu örnek, Linux'ta PowerShell'de de çalışır.

az storage account list --query '[].{"SA Name":name, "Primary endpoint":primaryEndpoints.blob}' --output table

Filtre eklemek istiyorsanız söz dizimi değişir. Bu örneğin parametre değerini çift tırnak ("...") olarak kaydırdığına --query ve ters eğik çizgi (\) kaçış karakteri kullandığına dikkat edin. Bu betik PowerShell'de çalışmaz.

 az storage account list --query "[?creationTime >='2024-02-01'].{\"SA Name\":name,\"Primary endpoint\":primaryEndpoints.blob}" --output table

Filtre söz dizimini bir PowerShell ortamında çalıştırmayı denediyseniz hata iletisi argument --query: invalid jmespath_type value: "[?creationTime >=..."aldınız. Ancak Linux ortamındaki Bash'te çıkışınız şuna benzer:

SA Name           Primary Endpoint
-----------       -----------------
msdocssa00000000  https://msdocssa000000000.blob.core.windows.net/

Sorgu dizesi içeren bir URL'de parametreleri geçirme

URL'lerdeki soru işaretleri, URL'nin sonunu ve sorgu dizesinin başlangıcını gösterir. Azure CLI'yi kullanmayı öğrenme bölümünde 3. adımı açan bir örnek aşağıda verilmişti:

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 başvuru içeriğinin istenen sürümündeki sonuçlar.

PowerShell ortamında Azure CLI komutlarını yürütürken PowerShell, soru işaretlerinin değişken adının parçası olmasına izin verir. Bu, Azure CLI parametre değerlerinde karışıklığa neden olabilir.

Azure REST API'sini kullanma makalesinden bir örnek aşağıda verilmiştir:

Bash'te hatasız olarak birlikte nasıl $containerRegistryName?api-version bir araya getirdiklerine dikkat edin.

# 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 özel karakteri içeren parametreleri geçirme

PowerShell'in At (@) simgesi gibi özel karakterleri vardır. Azure CLI'yi PowerShell'de çalıştırmak için özel karakterin önüne kaçış karakteri ekleyin ` . Ayrıca, değeri tek (') veya çift (") tırnak içine alabilirsiniz.

Aşağıdaki üç örnek PowerShell'de çalışır:

  • parameterName '@parameters.json
  • parameterName '@parameters.json'
  • parameterName "@parameters.json"

Bu örnek PowerShell'de çalışmaz:

  • Parametername @parameters.json

JSON içeren parametreleri geçirme

JSON dizesi gibi karmaşık bağımsız değişkenler için en iyi yöntem, kabuğun yorumunu atlamak üzere bir dosyadan yüklemek için Azure CLI'nin @<file> kuralını kullanmaktır. At () simgesinin PowerShell'de bir sıçrama işleci olduğunu, dolayısıyla alıntı yapılması gerektiğini@ unutmayın.

az ad app create içinde hem JSON dosya içeriğini hem de komut örneklerini içeren iyi örnekler vardır. İşte bir kod parçacığı:

# Script for a Bash environment

az ad app create --display-name myTestAppName \
    --is-fallback-public-client \
    --required-resource-accesses @manifest.json

Anahtar:değer çiftlerini içeren parametreleri geçirme

Azure kaynak etiketleri gibi bazı Azure CLI parametre değerleri için anahtar:değer çiftleri gerekir. Veya'nız keyvalue boşluk veya özel karakter içeriyorsa Bash ve PowerShell söz dizimi her zaman aynı değildir.

Azure CLI'yı kullanmayı öğrenme öğreticisindeki Farkları alıntılama alıştırması yapmak için etiket oluşturma bölümüne bakın. Bu öğretici adımı aşağıdaki anahtar:değer çifti senaryoları için Bash, PowerShell ve Cmd örnekleri verir:

  • Boşluk
  • boş değerler
  • özel karakterler
  • değişkenler

PowerShell'de Azure CLI için hata işleme

Doğru Azure komut satırı aracını seçme bölümünde açıklandığı gibi PowerShell'de Azure CLI komutlarını çalıştırabilirsiniz. Bunu yaparsanız PowerShell'de Azure CLI hata işlemeyi anladığınızdan emin olun. Özellikle Azure CLI, PowerShell'in yakalaması için özel durumlar oluşturmaz.

Alternatif olarak otomatik değişkeni kullanabilirsiniz $? . Bu değişken en son komutun durumunu içerir. Önceki komut başarısız olursa değeri $?$Falseolur. Daha fazla bilgi için bkz . about_Automatic_Variables.

Aşağıdaki örnekte bu otomatik değişkenin hata işleme için nasıl çalışabileceği gösterilmektedir:

# Script for a PowerShell environment

az group create --name MyResourceGroup
if ($? -eq $false) {
    Write-Error "Error creating resource group."
}

Gerekli az--location parametre eksik olduğundan komut başarısız oluyor. Koşullu deyim false değerini $? bulur ve bir hata yazar.

ve catch anahtar sözcüklerini kullanmak istiyorsanız, bloğun try yakalaması try için bir özel durum oluşturmak için kullanabilirsinizthrow:

# 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"

Varsayılan olarak, PowerShell yalnızca sonlandırıcı hataları yakalar. Bu örnek, PowerShell'in $ErrorActionPreference hatayı işleyebilmesi için Stop genel değişkeni olarak ayarlar.

Koşullu deyim, önceki komutun $? başarısız olup olmadığını görmek için değişkeni sınar. Öyleyse, throw anahtar sözcüğü yakalamak için bir özel durum oluşturur. Blok catch , hata iletisi yazmak veya hatayı işlemek için kullanılabilir.

Örnek, varsayılan değerine geri yüklenir $ErrorActionPreference .

PowerShell hata işleme hakkında daha fazla bilgi için bkz . Özel durumlar hakkında bilmek istediğiniz her şey.

PowerShell'de Sekme Tamamlamayı Etkinleştir

"Azure CLI tamamlayıcıları" olarak da bilinen sekme tamamlama, ipuçları sağlamak, bulmayı etkinleştirmek ve giriş girişini hızlandırmak için girişler üzerinde tamamlama sağlar. Komut adları, komut grubu adları, parametreler ve belirli parametre değerleri Sekme tuşuna basılarak komut satırına otomatik olarak eklenebilir.

Sekme tamamlama, Azure Cloud Shell'de ve çoğu Linux dağıtımında varsayılan olarak etkindir. Azure CLI sürüm 2.49'dan başlayarak, PowerShell'de Azure CLI için sekme tamamlama özelliğini etkinleştirebilirsiniz. Şu adımları izleyin:

  1. değişkeninde $PROFILEdepolanan profili oluşturun veya düzenleyin. En basit yol PowerShell'de çalıştırmaktır notepad $PROFILE . Daha fazla bilgi için bkz . Profilinizi oluşturma ve Profiller ve yürütme ilkesi.

  2. PowerShell profilinize aşağıdaki kodu ekleyin:

    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. Menüde kullanılabilir tüm seçenekleri görüntülemek için PowerShell profilinize ekleyin Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete .

Ayrıca bkz.