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].ps1
plik 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:
- Alias
- Funkcja
- Polecenie cmdlet
- 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 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 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-Date
polecenia , 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-Date
polecenia .
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-Date
Microsoft.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 .COM
plików , .CPL
lub .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
.