about_Command_Precedence

Deskripsi singkat

Menjelaskan bagaimana PowerShell menentukan perintah mana yang akan dijalankan.

Deskripsi panjang

Prioritas perintah menjelaskan bagaimana PowerShell menentukan perintah mana yang akan dijalankan saat sesi berisi lebih dari satu perintah dengan nama yang sama. Perintah dalam sesi dapat disembunyikan atau digantikan oleh perintah dengan nama yang sama. Artikel ini memperlihatkan kepada Anda cara menjalankan perintah tersembunyi dan cara menghindari konflik nama perintah.

Prioritas perintah

Saat sesi PowerShell menyertakan lebih dari satu perintah yang memiliki nama yang sama, PowerShell menentukan perintah mana yang akan dijalankan menggunakan aturan berikut.

Jika Anda menentukan jalur ke perintah, PowerShell menjalankan perintah di lokasi yang ditentukan oleh jalur.

Misalnya, perintah berikut menjalankan skrip FindDocs.ps1 di C:\TechDocs direktori:

C:\TechDocs\FindDocs.ps1

Anda dapat menjalankan perintah yang dapat dieksekusi menggunakan jalur lengkapnya. Sebagai fitur keamanan, PowerShell tidak menjalankan perintah yang dapat dieksekusi, termasuk skrip PowerShell dan perintah asli, kecuali perintah terletak di jalur yang tercantum dalam $env:Path variabel lingkungan.

Untuk menjalankan file yang dapat dieksekusi yang ada di direktori saat ini, tentukan jalur lengkap atau gunakan jalur .\ relatif untuk mewakili direktori saat ini.

Misalnya, untuk menjalankan FindDocs.ps1 file di direktori saat ini, ketik:

.\FindDocs.ps1

Jika Anda tidak menentukan jalur, PowerShell menggunakan urutan prioritas berikut saat menjalankan perintah.

  1. Alias
  2. Fungsi
  3. Cmdlet (lihat Resolusi nama cmdlet)
  4. File eksternal yang dapat dieksekusi (termasuk file skrip PowerShell)

Oleh karena itu, jika Anda mengetik help, PowerShell pertama-tama mencari alias bernama help, maka fungsi bernama Help, dan akhirnya cmdlet bernama Help. Ini menjalankan item pertama help yang ditemukannya.

Misalnya, jika sesi Anda berisi cmdlet dan fungsi, keduanya bernama Get-Map, saat Anda mengetik Get-Map, PowerShell menjalankan fungsi .

Catatan

Ini hanya berlaku untuk perintah yang dimuat. Jika ada build executable dan Alias build untuk fungsi dengan nama Invoke-Build di dalam modul yang tidak dimuat ke dalam sesi saat ini, PowerShell menjalankan build executable sebagai gantinya. Ini tidak memuat modul secara otomatis jika menemukan executable eksternal. Hanya ketika tidak ada executable eksternal yang ditemukan bahwa alias, fungsi, atau cmdlet dengan nama yang diberikan dipanggil.

Mengatasi item dengan nama yang sama

Akibat aturan ini, item dapat diganti atau disembunyikan oleh item dengan nama yang sama.

Item disembunyikan atau dibayangi jika Anda masih dapat mengakses item asli, seperti dengan memenuhi syarat nama item dengan nama modul.

Misalnya, jika Anda mengimpor fungsi yang memiliki nama yang sama dengan cmdlet dalam sesi, cmdlet disembunyikan, tetapi tidak diganti. Anda dapat menjalankan cmdlet dengan menentukan nama modul yang memenuhi syarat.

Ketika item diganti atau ditimpa, Anda tidak dapat lagi mengakses item asli.

Misalnya, jika Anda mengimpor variabel yang memiliki nama yang sama dengan variabel dalam sesi, variabel asli diganti. Anda tidak dapat memenuhi syarat variabel dengan nama modul.

Jika Anda membuat fungsi di baris perintah lalu mengimpor fungsi dengan nama yang sama, fungsi asli diganti.

Menemukan perintah tersembunyi

Parameter Semua cmdlet Get-Command mendapatkan semua perintah dengan nama yang ditentukan, meskipun disembunyikan atau diganti. Dimulai di PowerShell 3.0, secara default, Get-Command hanya mendapatkan perintah yang berjalan saat Anda mengetikkan nama perintah.

Dalam contoh berikut, sesi menyertakan Get-Date fungsi dan cmdlet Get-Date . Anda dapat menggunakan Get-Command untuk menentukan perintah mana yang dipilih terlebih dahulu.

Get-Command Get-Date
CommandType     Name                      ModuleName
-----------     ----                      ----------
Function        Get-Date

Menggunakan parameter Semua untuk mencantumkan perintah yang tersediaGet-Date.

Get-Command Get-Date -All
CommandType     Name                 Version    Source
-----------     ----                 -------    ------
Function        Get-Date
Cmdlet          Get-Date             7.0.0.0    Microsoft.PowerShell.Utility
Get-Command where -All
CommandType Name                     Version      Source
----------- ----                     -------      ------
Alias       where -> Where-Object
Application where.exe                10.0.22621.1 C:\Windows\system32\where.exe

Anda dapat menjalankan perintah tertentu dengan menyertakan informasi yang memenuhi syarat yang membedakan perintah dari perintah lain yang mungkin memiliki nama yang sama. Untuk cmdlet, Anda dapat menggunakan nama yang memenuhi syarat modul. Untuk executable, Anda dapat menyertakan ekstensi file. Misalnya, untuk menjalankan versi penggunaan where.exeyang where dapat dieksekusi .

Menggunakan nama modul yang memenuhi syarat

Menggunakan nama cmdlet yang memenuhi syarat modul memungkinkan Anda menjalankan perintah yang disembunyikan oleh item dengan nama yang sama. Misalnya, Anda dapat menjalankan Get-Date cmdlet dengan memenuhi syarat dengan nama modul Microsoft.PowerShell.Utility atau jalurnya. Saat Anda menggunakan nama yang memenuhi syarat modul, modul dapat diimpor secara otomatis ke dalam sesi tergantung pada nilai $PSModuleAutoLoadingPreference.

Catatan

Anda tidak dapat menggunakan nama modul untuk memenuhi syarat variabel atau alias.

Menggunakan nama yang memenuhi syarat modul memastikan bahwa Anda menjalankan perintah yang ingin Anda jalankan. Ini adalah metode yang direkomendasikan untuk memanggil cmdlet saat menulis skrip yang ingin Anda distribusikan.

Contoh berikut mengilustrasikan cara memenuhi syarat perintah dengan menyertakan nama modulnya.

Penting

Kualifikasi modul menggunakan karakter garis miring terbelakang (\) untuk memisahkan nama modul dari nama perintah, terlepas dari platform.

New-Alias -Name "Get-Date" -Value "Get-ChildItem"
Microsoft.PowerShell.Utility\Get-Date
Tuesday, May 16, 2023 1:32:51 PM

Untuk menjalankan New-Map perintah dari MapFunctions modul, gunakan nama modul yang memenuhi syarat:

MapFunctions\New-Map

Untuk menemukan modul tempat perintah diimpor, gunakan properti ModuleName dari perintah.

(Get-Command <command-name>).ModuleName

Misalnya, untuk menemukan sumber Get-Date cmdlet, ketik:

(Get-Command Get-Date).ModuleName
Microsoft.PowerShell.Utility

Jika Anda ingin memenuhi syarat nama perintah menggunakan jalur ke modul, Anda harus menggunakan garis miring (/) sebagai pemisah jalur dan karakter garis miring terbalik (\) sebelum nama perintah. Gunakan contoh berikut untuk menjalankan Get-Date cmdlet:

//localhost/c$/Progra~1/PowerShell/7-preview/Modules/Microsoft.PowerShell.Utility\Get-Date

Jalur dapat berupa jalur lengkap atau jalur yang relatif terhadap lokasi saat ini. Di Windows, Anda tidak dapat menggunakan jalur yang memenuhi syarat drive. Anda harus menggunakan jalur UNC, seperti yang ditunjukkan pada contoh sebelumnya, atau jalur yang relatif terhadap drive saat ini. Contoh berikut mengasumsikan bahwa lokasi Anda saat ini berada di C: drive.

/Progra~1/PowerShell/7-preview/Modules/Microsoft.PowerShell.Utility\Get-Date

Menggunakan operator panggilan

Anda juga dapat menggunakan operator panggilan (&) untuk menjalankan perintah tersembunyi dengan menggabungkannya dengan panggilan ke Get-ChildItem (aliasnya adalah dir), Get-Command atau Get-Module.

Operator panggilan menjalankan string dan blok skrip dalam cakupan anak. Untuk informasi selengkapnya, lihat about_Operators.

Misalnya, gunakan perintah berikut untuk menjalankan fungsi bernama Map yang disembunyikan oleh alias bernama Map.

& (Get-Command -Name Map -CommandType Function)

or

& (dir Function:\map)

Anda juga dapat menyimpan perintah tersembunyi Anda dalam variabel untuk membuatnya lebih mudah dijalankan.

Misalnya, perintah berikut menyimpan Map fungsi dalam $myMap variabel lalu menggunakan Call operator untuk menjalankannya.

$myMap = (Get-Command -Name map -CommandType function)
& ($myMap)

Item yang diganti

Item yang diganti adalah item yang tidak dapat Anda akses lagi. Anda dapat mengganti item dengan mengimpor item dengan nama yang sama dari modul.

Misalnya, jika Anda mengetik Get-Map fungsi dalam sesi Anda, dan Anda mengimpor fungsi yang disebut Get-Map, fungsi tersebut menggantikan fungsi asli. Anda tidak dapat mengambilnya dalam sesi saat ini.

Variabel dan alias tidak dapat disembunyikan karena Anda tidak dapat menggunakan operator panggilan atau nama yang memenuhi syarat untuk menjalankannya. Saat Anda mengimpor variabel dan alias dari modul, variabel tersebut mengganti variabel dalam sesi dengan nama yang sama.

Resolusi nama cmdlet

Saat Anda tidak menggunakan nama cmdlet yang memenuhi syarat, PowerShell memeriksa untuk melihat apakah cmdlet dimuat dalam sesi saat ini. Jika ada beberapa modul yang dimuat yang berisi nama cmdlet yang sama, PowerShell menggunakan cmdlet dari modul pertama yang ditemukan menurut abjad.

Jika cmdlet tidak dimuat, PowerShell mencari modul yang diinstal dan memuat otomatis modul pertama yang berisi cmdlet dan menjalankan cmdlet tersebut. PowerShell mencari modul di setiap jalur yang $env:PSModulePath ditentukan dalam variabel lingkungan. Jalur dicari dalam urutan yang tercantum dalam variabel. Dalam setiap jalur, modul dicari dalam urutan alfabet. PowerShell menggunakan cmdlet dari kecocokan pertama yang ditemukannya.

Menghindari konflik nama

Cara terbaik untuk mengelola konflik nama perintah adalah dengan mencegahnya. Saat Anda memberi nama perintah, gunakan nama unik. Misalnya, tambahkan inisial atau akronim nama perusahaan Anda ke kata benda dalam perintah Anda.

Saat mengimpor perintah ke sesi Anda dari modul PowerShell atau dari sesi lain, Anda dapat menggunakan Prefix parameter cmdlet Import-Module atau Import-PSSession untuk menambahkan awalan ke kata benda dalam nama perintah.

Misalnya, perintah berikut menghindari konflik dengan Get-Date cmdlet dan Set-Date yang disertakan dengan PowerShell saat Anda mengimpor DateFunctions modul.

Import-Module -Name DateFunctions -Prefix ZZ

Menjalankan executable eksternal

Pada Windows. PowerShell memperlakukan ekstensi file yang tercantum dalam $env:PATHEXT variabel lingkungan sebagai file yang dapat dieksekusi. File yang tidak dapat dieksekusi Windows diserahkan ke Windows untuk diproses. Windows mencari asosiasi file dan menjalankan kata kerja Windows Shell default untuk ekstensi. Agar Windows mendukung eksekusi dengan ekstensi file, asosiasi harus terdaftar dengan sistem.

Anda dapat mendaftarkan mesin yang dapat dieksekusi untuk ekstensi file menggunakan ftype perintah dan assoc dari shell perintah CMD. PowerShell tidak memiliki metode langsung untuk mendaftarkan handler file. Untuk informasi selengkapnya, lihat dokumentasi untuk perintah ftype .

Agar PowerShell melihat ekstensi file sebagai dapat dieksekusi dalam sesi saat ini, Anda harus menambahkan ekstensi ke $env:PATHEXT variabel lingkungan.

Lihat juga