Udostępnij za pośrednictwem


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ń.

  1. Alias
  2. Funkcja
  3. Polecenie cmdlet (zobacz rozpoznawanie nazw poleceń cmdlet)
  4. Zewnętrzne pliki wykonywalne (w tym pliki skryptów programu PowerShell)

W związku z tym, jeśli wpiszesz helppolecenie , program PowerShell najpierw szuka aliasu o nazwie help, a następnie funkcji o nazwie , a na końcu polecenia cmdlet o nazwie HelpHelp. 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-DateMicrosoft.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 MapMap.

& (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 .

Zobacz też