Azure CLI'yi PowerShell betik dilinde çalıştırma konusunda dikkat edilmesi gerekenler

Azure CLI, Hem Bash hem de PowerShell betik dilinde çalışan Azure CLI başvuru komutları aracılığıyla Azure kaynaklarını yönetmeye yönelik bir araçtır. Ancak, betik oluşturma dilleri arasındaki parametre biçimlendirmesinde beklenmeyen sonuçlara neden olabilecek küçük söz dizimi farklılıkları vardır. Bu makalenin amacı, PowerShell betik dilinde çalışırken Azure CLI söz dizimi hatalarını çözmenize yardımcı olmaktır.

Bu makalede, aşağıdaki betik dillerinde 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çla betik dili 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 betik dillerini 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 betik dilinin 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 sistemleriyle betik dilleri arasında ayrımlar 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 betik dilinde ç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://video2.skills-academy.com/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.

Azure CLI komutlarını bir PowerShell betik dilinde yürütürken PowerShell, soru işaretlerinin değişken adının bir 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 scripting language

# 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

Ve simgesini içeren parametreleri geçirme

Parametre değerinde ve işareti geçirmeniz gereken bir senaryonuz varsa ve işareti (&) simgesinin PowerShell tarafından yorumlandığını unutmayın. Parametresini kullanarak bunun gerçekleştiğini --debug görebilirsiniz:

az "a&b" --debug

# output
'a' is misspelled or not recognized by the system.
'b' is not recognized as an internal or external command

Ancak, bir kaynak grubuna etiket eklemek için aynı testi kullanırsanız, etiket değerindeki ve işareti hataya neden olmaz.

az group create --location eastus2 --name "msdocs-rg-test"
az group update --name "msdocs-rg-test" --tags "company name=Contoso & Sons"

# output
{
  "id": "/subscriptions/3618afcd-ea52-4ceb-bb46-53bb962d4e0b/resourceGroups/msdocs-rg-test",
  "location": "eastus2",
  "managedBy": null,
  "name": "msdocs-rg-test",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": {
    "company name": "Contoso & Sons"
  },
  "type": "Microsoft.Resources/resourceGroups"
}

Parametre değerindeki ve işaretinin hataya neden olduğu bir senaryonuz varsa, bazı çözümler şunlardır:

# When quoted by single quotes ('), double quotes (") are preserved by PowerShell and sent
# to Command Prompt, so that ampersand (&) is treated as a literal character
> az '"a&b"' --debug
Command arguments: ['a&b', '--debug']

# Escape double quotes (") with backticks (`) as required by PowerShell
> az "`"a&b`"" --debug
Command arguments: ['a&b', '--debug']

# Escape double quotes (") by repeating them
> az """a&b""" --debug
Command arguments: ['a&b', '--debug']

# With a whitespace in the argument, double quotes (") are preserved by PowerShell and
# sent to Command Prompt
> az "a&b " --debug
Command arguments: ['a&b ', '--debug']

# Use --% to stop PowerShell from parsing the argument
> az --% "a&b" --debug
Command arguments: ['a&b', '--debug']

At (@) simgesi içeren parametreleri geçirme

PowerShell'in, PowerShell'de bir sıçrama işleci olan at (@) simgesi gibi özel karakterleri vardır. Kaçış için özel karakterin önüne bir ters ` köşe 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

Komutta az ad app create başka bir örnek daha verilmiştir: PowerShell betik dilinde gereken JSON dosya adının etrafındaki çift tırnak işaretine ("...") dikkat edin.

# Script for a PowerShell scripting language

az ad app create --display-name myTestAppName `
    --is-fallback-public-client `
    --required-resource-accesses "@manifest.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. Bash, PowerShell ve Cmd.exe için JSON söz dizimi örnekleri için bkz . Betik dilleri arasındaki farkları alıntılama - JSON dizeleri.

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 key value boşluk veya özel karakter içeriyorsa Bash ve PowerShell söz dizimi her zaman aynı değildir.

Bash, PowerShell ve Cmd söz dizimi örnekleri için Bkz. Azure CLI kullanmayı öğrenme öğreticisindeki farkları alıntılamak için etiket oluşturma. Bu öğretici adımı aşağıdaki anahtar:değer çifti senaryoları için örnekler verir:

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

Ayrıştırmayı durdur simgesi

PowerShell 3.0'da tanıtılan ayrıştırma durdurma simgesi (--% ), PowerShell'i girişi PowerShell komutları veya ifadeleri olarak yorumlamaktan kaçınmaya yönlendirir. Bir durdurma ayrıştırma simgesiyle karşılaştığında, PowerShell satırdaki kalan karakterleri değişmez değer olarak ele alır.

az --% vm create --name xxx

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 scripting language

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 scripting language

$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.