Azure CLI'yi PowerShell betik dilinde çalıştırma konusunda dikkat edilmesi gerekenler
Makale
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:
Azure Cloud Shell kullanarak Linux işletim sisteminde çalışan Bash.
PowerShell 5 terminalini kullanarak Windows 11'de çalışan Windows PowerShell.
PowerShell 7 terminalini kullanarak Windows 11'de çalışan PowerShell.
CLI'yı yeni kullanıyorsanız, bir araçlabetik 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.
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 .
Bu makalede verilen test çalışmalarını yürütmek için şu betik dillerini yükleyin veya açın:
Linux ortamları
İstediğiniz İnternet uygulamanızda veya Windows Terminali'nde, sağlanan bağlantıları kullanarak iki sekme açın.
Bash ile çalışan bir Azure Cloud Shell örneği.
Azure Cloud Shell bir PowerShell betik dilinde açılırsa Cloud Shell menü çubuğunda Bash'e geç seçeneğini belirleyin.
PowerShell ile çalışan ikinci bir Azure Cloud Shell örneği. Azure Cloud Shell bir Bash betik dilinde açılırsa Cloud Shell menü çubuğunda PowerShell'e geçiş yap seçeneğini belirleyin.
Microsoft Windows ortamları
Windows ortamında Azure CLI'nın yerel yüklemesi.
Windows işletim sistemlerinin çoğuna önceden yüklenmiş yerel bir Windows PowerShell 5.1 yüklemesi.
Windows ortamında PowerShell 7'nin yerel yüklemesi.
Bu makale Windows 11 Enterprise sürüm 23H2'de test edilmiştir.
Hangi Azure CLI ve PowerShell sürümünü kullandığınızı görmek için test edin.
az version
$PSVersionTable
Azure CLI ve PowerShell'in en son sürümü olan Azure Cloud Shell'in çıktısı aşağıdadır:
Makinenizde yüklü olan Azure CLI ve PowerShell sürümü olan Windows PowerShell 5 terminalinin çıktısı aşağıdadır. Bu çıkış örneğinde Azure CLI sürüm 2.57.0 ve Windows PowerShell 5.1.22621 yerel makineye yüklenir.
PowerShell 7 terminalinde çalıştırıyorsanız $PSVersionTable , yerel makinenizde nelerin yüklü olduğuna bağlı olarak PowerShell sürümünüz PSVersion 7 veya üzeridir.
Bu test betiklerini çalıştırmak için bir Azure depolama hesabına ihtiyacınız varsa şimdi bir hesap oluşturun.
# Bash syntax example
# Variable block
let "randomIdentifier=$RANDOM*$RANDOM"
location=eastus
resourceGroup="msdocs-test-rg-$randomIdentifier"
storageAccount="msdocssa$randomIdentifier"
# Create a resource group.
az group create --name $resourceGroup --location $location
# Create a storage account.
echo "Creating storage account $storageAccount in resource group $resourceGroup"
az storage account create --name $storageAccount \
--resource-group $resourceGroup \
--location $location \
--sku Standard_RAGRS \
--kind StorageV2 \
--output json
# PowerShell syntax example
# Variable block
$randomIdentifier = $(Get-Random)
$location="eastus"
$resourceGroup="msdocs-test-rg-$randomIdentifier"
$storageAccount="msdocssa$randomIdentifier"
# Create a resource group.
az group create --name $resourceGroup --location $location
# Create a storage account.
echo "Creating storage account $storageAccount in resource group $resourceGroup"
az storage account create --name $storageAccount `
--resource-group $resourceGroup `
--location $location `
--sku Standard_RAGRS `
--kind StorageV2 `
--output json
Azure CLI, yeni bir depolama hesabı oluşturulduğunda 100 satırdan fazla JSON çıkışı döndürür. Aşağıdaki JSON sözlüğünde kısa süre için atlanmış alanlar vardır.
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/
Bu örnekte, katıştırılmış çift tırnaklı çift tırnak ("...") sarmalayıcısına ve ters tırnak kaçış karakterine ` dikkat edin.
az storage account list --query "[].{`"SA Name`":name, `"Primary endpoint`":primaryEndpoints.blob}" --output table
Windows PowerShell'de veya Windows makinesinde yüklü PowerShell 7'de bu söz dizimlerini çalıştırırsanız hatasını argument --query: invalid jmespath_type value: '[].{SA'alırsınız. ve arasındaki SANameboşlukta hata iletisinin nasıl bozulduğuna dikkat edin. Linux ortamındaki Bash'te hata iletiniz şeklindedir argument --query: invalid jmespath_type value: '[].{:name,'.
Şimdi bir filtre ekleyin. Bash betiğinden farklı olarak, tarih filtresi eklemek için dizenin tamamının --query yeniden çalışması gerekmez.
az storage account list --query "[?creationTime >='2024-02-01'].{`"SA Name`":name, `"Primary endpoint`":primaryEndpoints.blob}" --output table
Bu örnekte, katıştırılmış çift tırnak ('...' ) ve kaçış karakteri ters eğik çizgi (\) içeren tek tırnak""..."" () sarmalayıcıya dikkat edin.
az storage account list --query '[].{\"SA Name\":name,\"Primary endpoint\":primaryEndpoints.blob}' --output table
Katıştırılmış çift tırnak çiftleri""..."" () içeren tek tırnak ('...') sarmalayıcıya dikkat edin. Bu betik, Windows PowerShell 5'te de başarıyla çalışır.
az storage account list --query '[].{""SA Name"":name,""Primary endpoint"":primaryEndpoints.blob}' --output table
Bir creationTime filtre uygulayın ve tek tırnak ('...') sarmalayıcının kaldığına, ancak tarih değerini çevrelemek için eklenmiş tek tırnak çiftinin (''...'') kullanıldığına dikkat edin. Bu betik, Windows PowerShell 5'te de başarıyla çalışır.
az storage account list --query '[?creationTime >=''2024-02-01''].{""SA Name"":name,""Primary endpoint"":primaryEndpoints.blob}' --output table
Bu örnekte, katıştırılmış çift tırnak çiftleri""..."" () içeren tek tırnak ('...') sarmalayıcıya dikkat edin. Bu betik, Windows ortamındaki PowerShell 7'de de başarıyla çalışır.
az storage account list --query '[].{""SA Name"":name,""Primary endpoint"":primaryEndpoints.blob}' --output table
Bir creationTime filtre uygulayın ve tek tırnak ('...') sarmalayıcının kaldığına, ancak tarih değerini çevrelemek için eklenmiş tek tırnak çiftinin (''...'') kullanıldığına dikkat edin. Bu betik, Windows ortamındaki PowerShell 7'de de başarıyla çalışır.
az storage account list --query '[?creationTime >=''2024-02-01''].{""SA Name"":name,""Primary endpoint"":primaryEndpoints.blob}' --output table
Bu sekmedeki betiklerden bir argument --query: invalid jmespath_type value:... hata aldınız mı? Bu Windows betikleri Bir Linux ortamında Bash veya PowerShell 7'de yürütülürken bu hata döndürülür.
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:
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.
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
için ${containerRegistryName}?api-versionPowerShell'de gereken köşeli ayraçlara {} dikkat edin. Köşeli ayraçlar olmadan, PowerShell bir soru işaretini (?) parametre adının $containerRegistryNameparçası olarak yorumlar.
Bu davranış, Linux veya Windows'da çalışan PowerShell 5 ve PowerShell 7'de aynıdır.
# Script for a PowerShell scripting language
# Variable block
$randomIdentifier = (New-Guid).ToString().Substring(0,8)
$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.
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 keyvalue 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:
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.
Bu içeriğin kaynağı GitHub'da bulunabilir; burada ayrıca sorunları ve çekme isteklerini oluşturup gözden geçirebilirsiniz. Daha fazla bilgi için katkıda bulunan kılavuzumuzu inceleyin.
Azure CLI geri bildirimi
Azure CLI, açık kaynak bir projedir. Geri bildirim sağlamak için bir bağlantı seçin:
Bu modül, Windows PowerShell cmdlet'lerini kullanmaya yönelik cmdlet yapısını ve parametrelerini kapsar. Ayrıca sekme tamamlama özelliğinin nasıl kullanılacağı ve Dosyalar hakkında içeriğinin nasıl görüntüleneceği açıklanmaktadır.