about_Command_Precedence
Krótki opis
Opisuje sposób, w jaki program PowerShell określa, które polecenie ma zostać uruchomione.
Długi opis
Pierwszeństwo poleceń opisuje sposób, w jaki program PowerShell określa, które polecenie należy uruchomić, gdy sesja zawiera więcej niż jedno polecenie o tej samej nazwie. Polecenia w ramach sesji mogą być ukryte lub zastępowane poleceniami o tej samej nazwie. W tym artykule pokazano, jak uruchamiać ukryte polecenia i jak uniknąć konfliktów nazw poleceń.
Pierwszeństwo poleceń
Gdy sesja programu PowerShell zawiera więcej niż jedno polecenie o tej samej nazwie, program PowerShell określa polecenie do uruchomienia przy użyciu następujących reguł.
Jeśli określisz ścieżkę do polecenia, program PowerShell uruchomi polecenie w lokalizacji określonej przez ścieżkę.
Na przykład następujące polecenie uruchamia skrypt FindDocs.ps1 w C:\TechDocs
katalogu:
C:\TechDocs\FindDocs.ps1
Możesz uruchomić dowolne polecenie wykonywalne przy użyciu pełnej ścieżki. Jako funkcja zabezpieczeń program PowerShell nie uruchamia poleceń wykonywalnych, w tym skryptów programu PowerShell i poleceń natywnych, chyba że polecenie znajduje się w ścieżce wymienionej w zmiennej $env:Path
środowiskowej.
Aby uruchomić plik wykonywalny, który znajduje się w bieżącym katalogu, określ pełną ścieżkę lub użyj ścieżki .\
względnej do reprezentowania bieżącego katalogu.
Aby na przykład uruchomić FindDocs.ps1
plik w bieżącym katalogu, wpisz:
.\FindDocs.ps1
Jeśli nie określisz ścieżki, program PowerShell używa następującej kolejności pierwszeństwa podczas uruchamiania poleceń.
- Alias
- Function
- Polecenie cmdlet (zobacz rozpoznawanie nazw poleceń cmdlet)
- Zewnętrzne pliki wykonywalne (w tym pliki skryptów programu PowerShell)
W związku z tym, jeśli wpiszesz help
polecenie , program PowerShell najpierw wyszuka alias o nazwie help
, a następnie funkcję o nazwie , a na koniec polecenie cmdlet o nazwie Help
Help
. Uruchamia on pierwszy help
element, który znajduje.
Jeśli na przykład sesja zawiera polecenie cmdlet i funkcję, zarówno o nazwie Get-Map
, gdy wpiszesz Get-Map
, program PowerShell uruchomi funkcję.
Uwaga
Dotyczy to tylko załadowanych poleceń. Jeśli istnieje build
plik wykonywalny i alias build
dla funkcji o nazwie Invoke-Build
wewnątrz modułu, który nie jest załadowany do bieżącej sesji, program PowerShell zamiast tego uruchamia build
plik wykonywalny. Moduły nie ładują się automatycznie, jeśli znajdzie zewnętrzny plik wykonywalny. Jest to tylko wtedy, gdy nie zostanie znaleziony zewnętrzny plik wykonywalny, który jest wywoływany alias, funkcja lub polecenie cmdlet o podanej nazwie.
Rozpoznawanie elementów o tych samych nazwach
W wyniku tych reguł elementy mogą być zastępowane lub ukrywane przez elementy o tej samej nazwie.
Elementy są ukryte lub w tle , jeśli nadal możesz uzyskać dostęp do oryginalnego elementu, na przykład poprzez kwalifikowanie nazwy elementu z nazwą modułu.
Jeśli na przykład zaimportujesz funkcję o takiej samej nazwie jak polecenie cmdlet w sesji, polecenie cmdlet jest ukryte, ale nie zostało zastąpione. Polecenie cmdlet można uruchomić, określając jego nazwę kwalifikowaną przez moduł.
Gdy elementy są zastępowane lub zastępowane, nie można uzyskać dostępu do oryginalnego elementu.
Jeśli na przykład zaimportujesz zmienną o takiej samej nazwie jak zmienna w sesji, oryginalna zmienna zostanie zamieniona. Nie można zakwalifikować zmiennej o nazwie modułu.
Jeśli utworzysz funkcję w wierszu polecenia, a następnie zaimportujesz funkcję o tej samej nazwie, oryginalna funkcja zostanie zamieniona.
Znajdowanie ukrytych poleceń
Parametr Allpolecenia cmdlet Get-Command pobiera wszystkie polecenia o określonej nazwie, nawet jeśli są ukryte lub zastąpione. Począwszy od programu PowerShell 3.0, domyślnie Get-Command
pobiera tylko polecenia uruchamiane podczas wpisywania nazwy polecenia.
W poniższych przykładach sesja zawiera Get-Date
funkcję i polecenie cmdlet Get-Date . Możesz użyć Get-Command
polecenia , aby określić, które polecenie jest wybierane jako pierwsze.
Get-Command Get-Date
CommandType Name ModuleName
----------- ---- ----------
Function Get-Date
Używa parametru All do wyświetlania dostępnych Get-Date
poleceń.
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
Określone polecenia można uruchamiać, włączając informacje kwalifikujące, które odróżniają polecenie od innych poleceń, które mogą mieć taką samą nazwę.
W przypadku poleceń cmdlet można użyć nazwy kwalifikowanej przez moduł. W przypadku plików wykonywalnych można dołączyć rozszerzenie pliku. Aby na przykład uruchomić wersję where
wykonywalną użycia where.exe
programu .
Używanie nazw kwalifikowanych przez moduł
Użycie kwalifikowanej przez moduł nazwy polecenia cmdlet umożliwia uruchamianie poleceń ukrytych przez element o tej samej nazwie. Możesz na przykład uruchomić Get-Date
polecenie cmdlet, kwalifikując je przy użyciu nazwy modułu Microsoft.PowerShell.Utility lub jego ścieżki. W przypadku używania nazw kwalifikowanych przez moduł moduł moduł można go automatycznie zaimportować do sesji w zależności od wartości $PSModuleAutoLoadingPreference
.
Uwaga
Nie można używać nazw modułów do kwalifikowania zmiennych ani aliasów.
Użycie nazw kwalifikowanych przez moduł gwarantuje, że uruchamiasz polecenie, które zamierzasz uruchomić. Jest to zalecana metoda wywoływania poleceń cmdlet podczas pisania skryptów, które mają być dystrybuowane.
W poniższym przykładzie pokazano, jak zakwalifikować polecenie, dołączając jego nazwę modułu.
Ważne
Kwalifikacja modułu używa znaku ukośnika odwrotnego (\
), aby oddzielić nazwę modułu od nazwy polecenia, niezależnie od platformy.
New-Alias -Name "Get-Date" -Value "Get-ChildItem"
Microsoft.PowerShell.Utility\Get-Date
Tuesday, May 16, 2023 1:32:51 PM
Aby uruchomić New-Map
polecenie z modułu MapFunctions
, użyj nazwy kwalifikowanej przez moduł:
MapFunctions\New-Map
Aby znaleźć moduł, z którego zaimportowano polecenie, użyj właściwości ModuleName poleceń.
(Get-Command <command-name>).ModuleName
Aby na przykład znaleźć źródło Get-Date
polecenia cmdlet, wpisz:
(Get-Command Get-Date).ModuleName
Microsoft.PowerShell.Utility
Jeśli chcesz zakwalifikować nazwę polecenia przy użyciu ścieżki do modułu, musisz użyć ukośnika (/
) jako separatora ścieżki i znaku ukośnika odwrotnego (\
) przed nazwą polecenia. Aby uruchomić polecenie cmdlet, użyj następującego przykładu Get-Date
:
//localhost/c$/Progra~1/PowerShell/7-preview/Modules/Microsoft.PowerShell.Utility\Get-Date
Ścieżka może być pełną ścieżką lub ścieżką względną dla bieżącej lokalizacji.
W systemie Windows nie można użyć ścieżki kwalifikowanej przez dysk. Należy użyć ścieżki UNC, jak pokazano w poprzednim przykładzie lub ścieżki względem bieżącego dysku.
W poniższym przykładzie przyjęto założenie, że bieżąca lokalizacja znajduje się na C:
dysku.
/Progra~1/PowerShell/7-preview/Modules/Microsoft.PowerShell.Utility\Get-Date
Korzystanie z operatora wywołania
Możesz również użyć operatora wywołania (&
), aby uruchomić ukryte polecenia, łącząc je z wywołaniem polecenia Get-ChildItem (alias to dir
), Get-Command
lub Get-Module.
Operator wywołania wykonuje ciągi i bloki skryptów w zakresie podrzędnym. Aby uzyskać więcej informacji, zobacz about_Operators.
Na przykład użyj następującego polecenia, aby uruchomić funkcję o nazwie Map
ukrytej przez alias o nazwie Map
.
& (Get-Command -Name Map -CommandType Function)
lub
& (dir Function:\map)
Możesz również zapisać ukryte polecenie w zmiennej, aby ułatwić jej uruchamianie.
Na przykład następujące polecenie zapisuje Map
funkcję w zmiennej $myMap
, a następnie używa Call
operatora do jej uruchomienia.
$myMap = (Get-Command -Name map -CommandType function)
& ($myMap)
Zamieniono elementy
Zastąpiony element jest elementem, do którego nie można już uzyskać dostępu. Elementy można zamienić, importując elementy o tej samej nazwie z modułu.
Jeśli na przykład wpiszesz Get-Map
funkcję w sesji i zaimportujesz funkcję o nazwie Get-Map
, zastąpi oryginalną funkcję. Nie można pobrać go w bieżącej sesji.
Zmienne i aliasy nie mogą być ukryte, ponieważ nie można użyć operatora wywołania ani kwalifikowanej nazwy do ich uruchomienia. Podczas importowania zmiennych i aliasów z modułu zastępują zmienne w sesji tą samą nazwą.
Rozpoznawanie nazw poleceń cmdlet
Jeśli nie używasz kwalifikowanej nazwy polecenia cmdlet, program PowerShell sprawdza, czy polecenie cmdlet jest ładowane w bieżącej sesji. Jeśli załadowano wiele modułów zawierających tę samą nazwę polecenia cmdlet, program PowerShell używa polecenia cmdlet z pierwszego modułu znalezionego alfabetycznie.
Jeśli polecenie cmdlet nie zostanie załadowane, program PowerShell przeszukuje zainstalowane moduły i automatycznie ładuje pierwszy moduł zawierający polecenie cmdlet i uruchamia to polecenie cmdlet.
Program PowerShell wyszukuje moduły w każdej ścieżce zdefiniowanej w zmiennej środowiskowej $env:PSModulePath
. Ścieżki są przeszukiwane w kolejności, w której są wymienione w zmiennej. W każdej ścieżce moduły są przeszukiwane w kolejności alfabetycznej. Program PowerShell używa polecenia cmdlet z pierwszego dopasowania, które znajdzie.
Unikanie konfliktów nazw
Najlepszym sposobem zarządzania konfliktami nazw poleceń jest ich zapobieganie. Podczas nadawania nazw poleceń użyj unikatowej nazwy. Na przykład dodaj inicjały lub akronim nazwy firmy do rzeczowników w poleceniach.
Podczas importowania poleceń do sesji z modułu programu PowerShell lub z innej sesji można użyć Prefix
parametru polecenia cmdlet Import-Module lub Import-PSSession , aby dodać prefiks do ciotek w nazwach poleceń.
Na przykład następujące polecenie pozwala uniknąć konfliktu z poleceniami Get-Date
cmdlet i Set-Date
dołączonymi do programu PowerShell podczas importowania modułu DateFunctions
.
Import-Module -Name DateFunctions -Prefix ZZ
Uruchamianie zewnętrznych plików wykonywalnych
W systemie Windows. Program PowerShell traktuje rozszerzenia plików wymienione w zmiennej środowiskowej $env:PATHEXT
jako pliki wykonywalne. Pliki, które nie są plikami wykonywalnych systemu Windows, są przekazywane do przetwarzania systemu Windows. System Windows wyszukuje skojarzenie pliku i wykonuje domyślne zlecenie powłoki systemu Windows dla rozszerzenia. Aby system Windows obsługiwał wykonywanie przez rozszerzenie pliku, skojarzenie musi być zarejestrowane w systemie.
Aparat wykonywalny dla rozszerzenia pliku można zarejestrować przy użyciu ftype
poleceń i assoc
powłoki poleceń CMD. Program PowerShell nie ma bezpośredniej metody rejestrowania programu obsługi plików. Aby uzyskać więcej informacji, zobacz dokumentację polecenia ftype .
Aby program PowerShell widział rozszerzenie pliku jako plik wykonywalny w bieżącej sesji, należy dodać rozszerzenie do zmiennej środowiskowej $env:PATHEXT
.