Bagikan melalui


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 nilai parameter --query dalam tanda kutip ganda ("...") dan menggunakan karakter escape backslash (\). 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/

Menyertakan 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:

/cli/azure/account?view=azure-cli-2020-09-01-hybrid.

Hasil ?view=azure-cli-2020-09-01-hybrid adalah 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 dengan lancar 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 menyertakan ampersand pada nilai parameter, perlu diketahui 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 dengan simbol at (@)

Ada karakter khusus dalam 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"

Melewatkan 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 skrip - string JSON.

Mengoper 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-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 sisa di dalam 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 ya, pastikan Anda memahami penanganan kesalahan Azure CLI di PowerShell. Secara khusus, Azure CLI tidak membuat pengecualian yang dapat ditangkap oleh PowerShell.

Alternatifnya adalah menggunakan $? variabel otomatis. Variabel ini berisi status perintah terbaru. Jika perintah sebelumnya gagal, $? memiliki nilai $False. Untuk informasi selengkapnya, lihat tentang_Variabel_Automatis.

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 mencatat kesalahan.

Jika Anda ingin menggunakan kata kunci try dan catch, Anda dapat menggunakan throw untuk membuat pengecualian yang ditangkap oleh blok try.

# 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 menangkap kesalahan terhenti. Contoh ini mengatur $ErrorActionPreference variabel global ke Stop sehingga PowerShell dapat menangani kesalahan.

Pernyataan bersyarat menguji variabel $? untuk melihat apakah perintah sebelumnya gagal. Jika demikian, kata kunci throw membuat pengecualian yang akan ditangkap. Blok catch dapat digunakan untuk menulis pesan kesalahan atau menangani kesalahan.

Contoh memulihkan $ErrorActionPreference ke nilai defaultnya.

Untuk informasi selengkapnya tentang penanganan kesalahan PowerShell, lihat Semua yang ingin Anda ketahui tentang pengecualian.

Mengaktifkan Penyelesaian Tab di PowerShell

Penyelesaian tab, juga dikenal sebagai "Penyelesai Azure CLI", menyediakan penyelesaian pada masukan 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:

  1. Buat atau edit profil yang disimpan dalam variabel $PROFILE. Cara paling sederhana adalah menjalankan notepad $PROFILE di PowerShell. Untuk informasi selengkapnya, lihat Cara membuat profil dan Profil serta kebijakan eksekusi.

  2. 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
    }
    
  3. Untuk menampilkan semua opsi yang tersedia di menu, tambahkan Set-PSReadlineKeyHandler -Key Tab -Function MenuComplete ke profil PowerShell Anda.

Lihat juga