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 katalogu "C:\TechDocs":

C:\TechDocs\FindDocs.ps1

Jako funkcja zabezpieczeń program PowerShell nie uruchamia poleceń wykonywalnych (natywnych), w tym skryptów programu PowerShell, chyba że polecenie znajduje się w ścieżce wymienionej w zmiennej środowiskowej $env:path Path lub chyba że określisz ścieżkę do pliku skryptu.

Aby uruchomić skrypt, który znajduje się w bieżącym katalogu, określ pełną ścieżkę lub wpisz kropkę .\ reprezentującą bieżący katalog.

Aby na przykład uruchomić plik FindDocs.ps1 w bieżącym katalogu, wpisz:

.\FindDocs.ps1

Używanie symboli wieloznacznych w wykonaniu

Symbole wieloznaczne mogą być używane w wykonywaniu poleceń. Używanie symboli wieloznacznych jest również nazywane globbing.

Program PowerShell wykonuje plik z dopasowaniem symboli wieloznacznych przed dopasowaniem literału.

Rozważmy na przykład katalog z następującymi plikami:

Get-ChildItem C:\temp\test


    Directory: C:\temp\test


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        5/20/2019   2:29 PM             28 a.ps1
-a----        5/20/2019   2:29 PM             28 [a1].ps1

Oba pliki skryptów mają taką samą zawartość: $MyInvocation.MyCommand.Path. To polecenie wyświetla nazwę wywoływanego skryptu.

Po uruchomieniu [a1].ps1plik a.ps1 jest wykonywany, mimo że plik [a1].ps1 jest zgodny z literałem.

C:\temp\test\[a1].ps1
C:\temp\test\a.ps1

Teraz usuńmy a.ps1 plik i spróbujemy go uruchomić ponownie.

Remove-Item C:\temp\test\a.ps1
C:\temp\test\[a1].ps1
C:\temp\test\[a1].ps1

Dane wyjściowe, które są uruchamiane tym razem, [a1].ps1 ponieważ dopasowanie literału jest jedynym dopasowaniem pliku dla tego wzorca z symbolami wieloznacznymi.

Aby uzyskać więcej informacji na temat korzystania z symboli wieloznacznych programu PowerShell, zobacz about_Wildcards.

Uwaga

Aby ograniczyć wyszukiwanie do ścieżki względnej, musisz prefiks nazwy skryptu ze ścieżką .\ . Ogranicza to wyszukiwanie poleceń do plików w tej ścieżce względnej. Bez tego prefiksu inna składnia programu PowerShell może powodować konflikt i istnieje kilka gwarancji, że plik zostanie znaleziony.

Jeśli nie określisz ścieżki, program PowerShell używa następującej kolejności pierwszeństwa, gdy uruchamia polecenia dla wszystkich elementów załadowanych w bieżącej sesji:

  1. Alias
  2. Funkcja
  3. Polecenie cmdlet
  4. Zewnętrzne pliki wykonywalne (programy i skrypty inne niż PowerShell)

W związku z tym, jeśli wpiszesz "help", program PowerShell najpierw szuka aliasu o nazwie , a następnie funkcji o nazwie help, a na koniec 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 w tym przypadku. Jest to tylko wtedy, gdy nie zostanie znaleziony zewnętrzny plik wykonywalny, że jest wywoływany alias, funkcja lub polecenie cmdlet o podanej nazwie, co powoduje automatyczne ładowanie modułu.

Gdy sesja zawiera elementy tego samego typu, które mają taką samą nazwę, program PowerShell uruchamia nowszy element.

Jeśli na przykład zaimportujesz inne Get-Date polecenie cmdlet z modułu, po wpiseniu Get-Datepolecenia , program PowerShell uruchomi zaimportowaną wersję nad natywną.

Ukryte i zastąpione elementy

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 z nazwą modułu lub przystawki.

Jeśli na przykład zaimportujesz funkcję o takiej samej nazwie jak polecenie cmdlet w sesji, polecenie cmdlet jest ukryte (ale nie zastąpione), ponieważ zostało zaimportowane z przystawki lub modułu.

Elementy są zastępowane lub zastępowane, jeśli nie możesz 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 i nie będzie już dostępna. Nie można zakwalifikować zmiennej o nazwie modułu.

Ponadto jeśli wpiszesz funkcję w wierszu polecenia, a następnie zaimportujesz funkcję o tej samej nazwie, oryginalna funkcja zostanie zamieniona i nie będzie już dostępna.

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 .

Następujące polecenie pobiera Get-Date polecenie uruchamiane podczas wpisywania Get-Datepolecenia .

Get-Command Get-Date
CommandType     Name                      ModuleName
-----------     ----                      ----------
Function        Get-Date

Następujące polecenie używa parametru All , aby pobrać wszystkie Get-Date polecenia.

Get-Command Get-Date -All
CommandType     Name                      ModuleName
-----------     ----                      ----------
Function        Get-Date
Cmdlet          Get-Date                  Microsoft.PowerShell.Utility

Uruchamianie ukrytych poleceń

Można uruchamiać określone polecenia, określając właściwości elementu, które odróżniają polecenie od innych poleceń, które mogą mieć taką samą nazwę. Za pomocą tej metody można uruchomić dowolne polecenie, ale jest to szczególnie przydatne w przypadku uruchamiania ukrytych poleceń.

Używanie kwalifikowanych nazw

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ć polecenie cmdlet, kwalifikując go z nazwą modułu Get-DateMicrosoft.PowerShell.Utility.

Użyj tej preferowanej metody podczas pisania skryptów, które mają być dystrybuowane. Nie można przewidzieć, które polecenia mogą być obecne w sesji, w której jest uruchamiany skrypt.

New-Alias -Name "Get-Date" -Value "Get-ChildItem"
Microsoft.PowerShell.Utility\Get-Date
Tuesday, September 4, 2018 8:17:25 AM

Aby uruchomić New-Map polecenie dodane przez moduł, użyj nazwy kwalifikowanej przez MapFunctions 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

Uwaga

Nie można kwalifikować zmiennych ani aliasów.

Korzystanie z operatora wywołania

Możesz również użyć Call operatora & do uruchamiania ukrytych poleceń, łą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.

Jeśli na przykład masz funkcję o nazwie Map ukrytej przez alias o nazwie Map, użyj następującego polecenia, aby uruchomić funkcję.

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

Element "zastąpiony" 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 lub przystawki.

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 lub przystawki zastępują zmienne w sesji tą samą nazwą.

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.

Ponadto podczas importowania poleceń do sesji z modułu programu PowerShell lub z innej sesji użyj Prefix parametru Import-Module lub

Polecenie cmdlet Import-PSSession w celu dodania prefiksu do un 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

Program PowerShell traktuje rozszerzenia plików wymienione w zmiennej środowiskowej $env:PATHEXT jako pliki wykonywalne. Pliki wykonywalne systemu Windows to pliki z rozszerzeniami .COMplików , .CPLlub .EXE . Pliki wykonywalne systemu Windows i inne pliki z rozszerzeniami wymienionymi w pliku $env:PATHEXT są wykonywane w bieżącej sesji konsoli.

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 według rozszerzenia 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 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ż