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.
- Alias
- Fungsi
- Cmdlet (lihat Resolusi nama cmdlet)
- 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.exe
yang 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.