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

  1. Alias
  2. Function
  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 wyszuka alias o nazwie help, a następnie funkcję o nazwie , a na koniec polecenie 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 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.exeprogramu .

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 .

Zobacz też