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:
- Azure Cloud Shell kullanarak Linux işletim sisteminde çalışan Bash.
- Azure Cloud Shell kullanarak Linux işletim sisteminde çalışan PowerShell .
- 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ç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 $?
$False
olur. 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
$PROFILE
depolanan profili oluşturun veya düzenleyin. En basit yol PowerShell'de çalıştırmaktırnotepad $PROFILE
. Daha fazla bilgi için bkz . Profilinizi oluşturma ve Profiller ve yürütme ilkesi.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 }
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.
- PowerShell ile ilgili sorunları alıntılamayla ilgili Azure CLI mühendislik notları
- Şu makalelerde Bash, PowerShell ve Cmd söz dizimini karşılaştırın:
- Betik oluşturma dilleri arasındaki farkları alıntılama
- Bash, PowerShell ve Cmd öğreticisindeki Azure CLI söz dizimi farklarını öğrenin
- JMESPath sorgusu kullanarak Azure CLI komut çıkışını sorgulama