Pertimbangan untuk menjalankan Azure CLI dalam bahasa skrip PowerShell
Azure CLI adalah alat untuk mengelola sumber daya Azure melalui perintah referensi Azure CLI yang berjalan dalam bahasa pembuatan skrip Bash dan PowerShell. Namun, ada sedikit perbedaan sintaks dalam pemformatan parameter antara bahasa skrip yang dapat menghasilkan hasil yang tidak terduga. Tujuan artikel ini adalah untuk membantu Anda mengatasi kesalahan sintaks Azure CLI saat bekerja dalam bahasa pembuatan skrip PowerShell.
Artikel ini membandingkan perbedaan sintaks perintah Azure CLI yang dijalankan dalam bahasa pembuatan skrip berikut:
- Bash berjalan dalam sistem operasi Linux menggunakan Azure Cloud Shell.
- PowerShell berjalan dalam sistem operasi Linux menggunakan Azure Cloud Shell.
- Windows PowerShell yang berjalan di Windows 11 menggunakan terminal PowerShell 5.
- PowerShell yang berjalan di Windows 11 menggunakan terminal PowerShell 7.
Jika Anda baru menggunakan CLI, membedakan antara alat dan bahasa pembuatan skrip mungkin membingungkan. Cara memilih alat baris perintah yang tepat memberikan perbandingan yang baik.
Prasyarat
Artikel ini ditujukan untuk Anda baca dan pelajari. Namun, jika Anda ingin menjalankan contoh, pilih tab Prepare your environments
untuk menginstal bahasa pembuatan skrip yang digunakan dalam artikel ini.
Penting
Saat Anda memiliki skrip Azure CLI yang menghasilkan kesalahan, pertimbangkan bagaimana bahasa pembuatan skrip yang Sedang Anda kerjakan mengurai sintaks perintah Azure CLI.
Berikan spasi di parameter Azure CLI
Di Azure CLI, saat Anda perlu meneruskan nilai parameter yang berisi spasi, ada perbedaan kutipan antara sistem operasi dan bahasa pembuatan skrip. Dalam contoh ini, gunakan daftar akun penyimpanan az dan ganti nama kolom output dengan kata yang berisi spasi.
Dalam contoh ini, perhatikan pembungkus tanda kutip tunggal ('...'
) dengan tanda kutip ganda yang disematkan ("..."
).
Contoh ini juga berfungsi di PowerShell di Linux.
az storage account list --query '[].{"SA Name":name, "Primary endpoint":primaryEndpoints.blob}' --output table
Jika Anda ingin menambahkan filter, sintaksnya akan berubah. Perhatikan bagaimana contoh ini membungkus --query
nilai parameter dalam tanda kutip ganda ("..."
) dan menggunakan karakter escape garis miring (\
). Skrip ini tidak berjalan di PowerShell.
az storage account list --query "[?creationTime >='2024-02-01'].{\"SA Name\":name,\"Primary endpoint\":primaryEndpoints.blob}" --output table
Jika Anda baru saja mencoba menjalankan sintaks filter dalam bahasa skrip PowerShell, Anda menerima pesan argument --query: invalid jmespath_type value: "[?creationTime >=..."
kesalahan . Namun, di Bash dalam lingkungan Linux, output Anda mirip dengan ini:
SA Name Primary Endpoint
----------- -----------------
msdocssa00000000 https://msdocssa000000000.blob.core.windows.net/
Meneruskan parameter dalam URL yang berisi string kueri
Tanda tanya dalam URL menunjukkan akhir URL dan awal string kueri. Berikut adalah contoh yang membuka langkah 3 di Pelajari untuk menggunakan Azure CLI:
https://learn.microsoft.com/cli/azure/account?view=azure-cli-2020-09-01-hybrid
.
Hasilnya ?view=azure-cli-2020-09-01-hybrid
dalam versi konten referensi Azure CLI yang diinginkan.
Saat Anda menjalankan perintah Azure CLI dalam bahasa skrip PowerShell, PowerShell memungkinkan tanda tanya menjadi bagian dari nama variabel. Ini mungkin membuat kebingungan dalam nilai parameter Azure CLI.
Berikut adalah contoh dari artikel Menggunakan Azure REST API :
Perhatikan bagaimana $containerRegistryName?api-version
menggabungkan bersama-sama tanpa kesalahan di Bash.
# 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
Berikan parameter yang berisi simbol ampersand
Jika Anda memiliki skenario di mana Anda perlu meneruskan ampersand dalam nilai parameter, ketahuilah bahwa simbol ampersand (&
) ditafsirkan oleh PowerShell. Anda dapat melihat hal ini terjadi menggunakan --debug
parameter :
az "a&b" --debug
# output
'a' is misspelled or not recognized by the system.
'b' is not recognized as an internal or external command
Namun, jika Anda menggunakan pengujian yang sama ini untuk menambahkan tag ke grup sumber daya, ampersand dalam nilai tag tidak menyebabkan kesalahan.
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"
}
Jika Anda memiliki skenario di mana ampersand dalam nilai parameter menyebabkan kesalahan, berikut adalah beberapa solusi:
# 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']
Meneruskan parameter yang berisi simbol at (@
)
Ada karakter khusus PowerShell, seperti simbol at (@
) yang merupakan operator splatting di PowerShell. Tambahkan backtick `
sebelum karakter khusus untuk menghindarinya. Anda juga dapat mengapit nilai dalam tanda kutip tunggal ('
) atau ganda ("
).
Tiga contoh berikut akan berfungsi di PowerShell:
- parameterName '@parameters.json
- parameterName '@parameters.json'
- parameterName "@parameters.json"
Contoh ini tidak akan berfungsi di PowerShell:
- parameterName @parameters.json
Berikut adalah contoh lain dalam az ad app create
perintah: Perhatikan tanda kutip ganda ("..."
) di sekitar nama file JSON yang diperlukan dalam bahasa pembuatan skrip PowerShell.
# Script for a PowerShell scripting language
az ad app create --display-name myTestAppName `
--is-fallback-public-client `
--required-resource-accesses "@manifest.json"
Meneruskan parameter yang berisi JSON
Untuk argumen kompleks seperti string JSON, praktik terbaiknya adalah menggunakan konvensi Azure CLI @<file>
untuk memuat dari file untuk melewati interpretasi shell. Untuk contoh sintaks JSON untuk Bash, PowerShell, dan Cmd.exe, lihat Mengutip perbedaan antara bahasa pembuatan skrip - string JSON.
Meneruskan parameter yang berisi pasangan kunci:nilai
Beberapa nilai parameter Azure CLI, seperti tag sumber daya Azure, memerlukan pasangan kunci:nilai. Jika Anda key
atau value
berisi spasi atau karakter khusus, sintaks Bash dan PowerShell tidak selalu sama.
Untuk contoh sintaks untuk Bash, PowerShell, dan Cmd, lihat Membuat tag untuk mempraktikkan perbedaan kutipan dalam tutorial Pelajari cara menggunakan Azure CLI . Langkah tutorial ini memberikan contoh untuk skenario pasangan kunci:nilai berikut:
- Ruang
- nilai kosong
- karakter khusus
- variabel
Simbol hentikan penguraian
Simbol stop-parsing (--%
), yang diperkenalkan di PowerShell 3.0, mengarahkan PowerShell untuk menahan diri dari menafsirkan input sebagai perintah atau ekspresi PowerShell. Ketika menemukan simbol stop-parsing, PowerShell memperlakukan karakter yang tersisa di baris sebagai literal.
az --% vm create --name xxx
Penanganan kesalahan untuk Azure CLI di PowerShell
Anda dapat menjalankan perintah Azure CLI di PowerShell, seperti yang dijelaskan dalam Memilih alat baris perintah Azure yang tepat. Jika demikian, pastikan Anda memahami penanganan kesalahan Azure CLI di PowerShell. Khususnya, Azure CLI tidak membuat pengecualian untuk diambil PowerShell.
Alternatifnya adalah menggunakan variabel otomatis $?
. Variabel ini berisi status perintah terbaru. Jika perintah sebelumnya gagal, $?
memiliki nilai $False
. Untuk informasi selengkapnya, lihat about_Automatic_Variables.
Contoh berikut menunjukkan cara kerja variabel otomatis ini untuk penanganan kesalahan:
# Script for a PowerShell scripting language
az group create --name MyResourceGroup
if ($? -eq $false) {
Write-Error "Error creating resource group."
}
Perintah az
gagal karena tidak memiliki parameter yang diperlukan --location
. Pernyataan bersyarat menemukan bahwa $?
salah dan menulis kesalahan.
Jika Anda ingin menggunakan try
kata kunci dan catch
, Anda dapat menggunakan throw
untuk membuat pengecualian agar blok try
dapat mengambil:
# 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"
Secara default, PowerShell hanya mengambil kesalahan pengakhiran. Contoh ini menetapkan variabel global $ErrorActionPreference
ke Stop
sehingga PowerShell dapat menangani kesalahan.
Pernyataan bersyarat menguji variabel $?
untuk mengetahui apakah perintah sebelumnya gagal. Jika demikian, kata kunci throw
membuat pengecualian untuk mengambil. Blok catch
dapat digunakan untuk menulis pesan kesalahan atau menangani kesalahan.
Contoh tersebut mengembalikan $ErrorActionPreference
ke nilai default-nya.
Untuk informasi selengkapnya tentang penanganan kesalahan PowerShell, lihat Segala hal yang ingin Anda ketahui tentang pengecualian.
Mengaktifkan Penyelesaian Tab di PowerShell
Penyelesaian tab, juga dikenal sebagai "Penyelesaian Azure CLI", menyediakan penyelesaian input untuk memberikan petunjuk, mengaktifkan penemuan, dan mempercepat entri input. Nama perintah, nama grup perintah, parameter, dan nilai parameter tertentu dapat secara otomatis dimasukkan ke dalam baris perintah dengan menekan tombol Tab .
Penyelesaian tab diaktifkan secara default di Azure Cloud Shell dan di sebagian besar distribusi Linux. Mulai dari Azure CLI versi 2.49, Anda dapat mengaktifkan penyelesaian tab untuk Azure CLI di PowerShell. Ikuti langkah-langkah ini:
Buat atau edit profil yang disimpan dalam variabel
$PROFILE
. Cara paling sederhana adalah menjalankannotepad $PROFILE
di PowerShell. Untuk informasi selengkapnya, lihat Cara membuat profil dan Profil serta kebijakan eksekusi Anda.Tambahkan kode berikut ke profil PowerShell Anda:
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 }
Untuk menampilkan semua opsi yang tersedia di menu, tambahkan
Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete
ke profil PowerShell Anda.
Lihat juga
- Catatan rekayasa Azure CLI tentang Mengutip masalah dengan PowerShell
- Bandingkan sintaks Bash, PowerShell, dan Cmd dalam artikel ini: