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 ma być uruchamiane, 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, które polecenie ma zostać uruchomione 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 środowiskowej $env:Path
.
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, aby reprezentować bieżący katalog.
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
- Funkcja
- 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 szuka aliasu o nazwie help
, a następnie funkcji o nazwie , a na końcu polecenia 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 uruchamia 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 uruchamia build
plik wykonywalny. Moduły nie ładują się automatycznie, jeśli znajdzie zewnętrzny plik wykonywalny. Dopiero wtedy, gdy nie zostanie znaleziony zewnętrzny plik wykonywalny, zostanie wywołany 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 ukryte 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 przez zakwalifikowanie nazwy elementu 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 już 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 All polecenia 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 , aby wyświetlić listę 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
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żna na przykład uruchomić polecenie cmdlet, kwalifikując go z nazwą modułu Get-Date
Microsoft.PowerShell.Utility lub ścieżką. W przypadku używania nazw kwalifikowanych przez moduł moduł moduł można automatycznie zaimportować moduł 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 zostało zaimportowane 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. Użyj następującego przykładu Get-Date
, aby uruchomić polecenie cmdlet:
//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ędnej 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 ukrytej przez alias o nazwie Map
Map
.
& (Get-Command -Name Map -CommandType Function)
lub
& (dir Function:\map)
Możesz również zapisać ukryte polecenie w zmiennej, aby ułatwić 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 to element, do którego nie można już uzyskać dostępu. Elementy można zastąpić, 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ępuje ona oryginalną funkcję. Nie można go pobrać w bieżącej sesji.
Zmienne i aliasy nie mogą być ukryte, ponieważ do ich uruchamiania nie można użyć operatora wywołania ani kwalifikowanej nazwy. 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 zostało zał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ą wyszukiwane w kolejności, w której są wyświetlane 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 zapobieganie im. Podczas nazywania poleceń użyj unikatowej nazwy. Na przykład dodaj inicjały lub nazwę 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 uns 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 systemu Windows w celu przetworzenia. 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 rozszerzenia pliku można zarejestrować przy użyciu ftype
poleceń i assoc
powłoki poleceń CMD. Program PowerShell nie ma metody bezpośredniej do zarejestrowania 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
.