about_Command_Precedence
Krátký popis
Popisuje, jak PowerShell určuje, který příkaz se má spustit.
Dlouhý popis
Priorita příkazu popisuje, jak PowerShell určuje, který příkaz se má spustit, když relace obsahuje více než jeden příkaz se stejným názvem. Příkazy v rámci relace můžou být skryté nebo nahrazené příkazy se stejným názvem. V tomto článku se dozvíte, jak spouštět skryté příkazy a jak se vyhnout konfliktům názvů příkazů.
Priorita příkazů
Pokud relace PowerShellu obsahuje více než jeden příkaz se stejným názvem, Určuje PowerShell, který příkaz se má spustit, pomocí následujících pravidel.
Pokud zadáte cestu k příkazu, PowerShell spustí příkaz v umístění určeném cestou.
Například následující příkaz spustí v C:\TechDocs
adresáři skript FindDocs.ps1:
C:\TechDocs\FindDocs.ps1
Ke spuštění libovolného spustitelného příkazu můžete použít úplnou cestu. PowerShell jako funkce zabezpečení nespouští spustitelné příkazy, včetně skriptů PowerShellu a nativních příkazů, pokud se příkaz nenachází v cestě uvedené v $env:Path
proměnné prostředí.
Chcete-li spustitelný soubor, který je v aktuálním adresáři, zadejte úplnou cestu nebo použijte relativní cestu .\
k reprezentaci aktuálního adresáře.
Pokud chcete například spustit FindDocs.ps1
soubor v aktuálním adresáři, zadejte:
.\FindDocs.ps1
Pokud nezadáte cestu, PowerShell při spouštění příkazů použije následující pořadí priorit.
- Alias
- Function
- Rutina (viz překlad názvů rutin)
- Externí spustitelné soubory (včetně souborů skriptů PowerShellu)
Proto pokud zadáte help
, PowerShell nejprve vyhledá alias s názvem help
, pak funkci s názvem Help
a nakonec rutinu s názvem Help
. Spustí první help
položku, kterou najde.
Pokud například vaše relace obsahuje rutinu a funkci s názvem Get-Map
, když zadáte Get-Map
, PowerShell spustí funkci.
Poznámka:
To platí jenom pro načtené příkazy. Pokud existuje build
spustitelný soubor a alias build
funkce s názvem Invoke-Build
uvnitř modulu, který není načten do aktuální relace, spustí build
PowerShell spustitelný soubor. Moduly se automaticky nenačítají, pokud najde externí spustitelný soubor. Je to jenom tehdy, když se nenašel žádný externí spustitelný soubor, že se vyvolá alias, funkce nebo rutina s daným názvem.
Řešení položek se stejnými názvy
V důsledku těchto pravidel je možné položky nahradit nebo skrýt položkami se stejným názvem.
Položky jsou skryté nebo stínované , pokud máte stále přístup k původní položce, například opravňující název položky s názvem modulu.
Pokud například importujete funkci, která má stejný název jako rutina v relaci, bude tato rutina skrytá, ale nenahradí se. Rutinu můžete spustit zadáním jeho názvu kvalifikovaného modulu.
Když se položky nahradí nebo přepíšou, nebudete mít přístup k původní položce.
Pokud například importujete proměnnou se stejným názvem jako proměnná v relaci, nahradí se původní proměnná. Nemůžete kvalifikovat proměnnou s názvem modulu.
Pokud vytvoříte funkci na příkazovém řádku a potom naimportujete funkci se stejným názvem, původní funkce se nahradí.
Hledání skrytých příkazů
Parametr All rutiny Get-Command získá všechny příkazy se zadaným názvem, i když jsou skryté nebo nahrazené. Počínaje PowerShellem 3.0 ve výchozím nastavení se ve výchozím nastavení načte pouze příkazy, Get-Command
které se spustí při zadání názvu příkazu.
V následujících příkladech relace obsahuje Get-Date
funkci a rutinu Get-Date . Můžete použít Get-Command
k určení, který příkaz je zvolen jako první.
Get-Command Get-Date
CommandType Name ModuleName
----------- ---- ----------
Function Get-Date
Pomocí parametru All zobrazí seznam dostupných Get-Date
příkazů.
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
Konkrétní příkazy můžete spustit tak, že zahrnete kvalifikující informace, které tento příkaz odlišují od jiných příkazů, které můžou mít stejný název.
Pro rutiny můžete použít kvalifikovaný název modulu. U spustitelných souborů můžete zahrnout příponu souboru. Například ke spuštění spustitelné verze where
použití where.exe
.
Použití názvů kvalifikovaných k modulům
Pomocí modulu kvalifikovaného názvu rutiny můžete spouštět příkazy skryté položkou se stejným názvem. Rutinu Get-Date
můžete spustit například tak, že ji opravíte s názvem modulu Microsoft.PowerShell.Utility nebo jeho cestou. Při použití názvů kvalifikovaných k modulům je možné modul automaticky importovat do relace v závislosti na hodnotě $PSModuleAutoLoadingPreference
.
Poznámka:
Názvy modulů nemůžete použít k opravňujícím proměnným nebo aliasům.
Použití názvů kvalifikovaných k modulům zajišťuje, že spouštíte příkaz, který chcete spustit. Toto je doporučená metoda volání rutin při psaní skriptů, které chcete distribuovat.
Následující příklad ukazuje, jak kvalifikovat příkaz zahrnutím názvu modulu.
Důležité
Kvalifikace modulu používá znak zpětného lomítka (\
) k oddělení názvu modulu od názvu příkazu bez ohledu na platformu.
New-Alias -Name "Get-Date" -Value "Get-ChildItem"
Microsoft.PowerShell.Utility\Get-Date
Tuesday, May 16, 2023 1:32:51 PM
Pokud chcete spustit New-Map
příkaz z MapFunctions
modulu, použijte jeho název kvalifikovaný pro modul:
MapFunctions\New-Map
K vyhledání modulu, ze kterého byl příkaz importován, použijte vlastnost ModuleName příkazů.
(Get-Command <command-name>).ModuleName
Pokud chcete například najít zdroj rutiny Get-Date
, zadejte:
(Get-Command Get-Date).ModuleName
Microsoft.PowerShell.Utility
Pokud chcete kvalifikovat název příkazu pomocí cesty k modulu, musíte před názvem příkazu použít lomítko () jako/
oddělovač cest a znak zpětného lomítka (\
). Ke spuštění rutiny Get-Date
použijte následující příklad:
//localhost/c$/Progra~1/PowerShell/7-preview/Modules/Microsoft.PowerShell.Utility\Get-Date
Cesta může být úplná nebo cesta relativní vzhledem k aktuálnímu umístění.
Ve Windows nemůžete použít cestu kvalifikovanou pro jednotku. Musíte použít cestu UNC, jak je znázorněno v předchozím příkladu, nebo cestu, která je relativní vzhledem k aktuální jednotce.
Následující příklad předpokládá, že vaše aktuální umístění je na jednotce C:
.
/Progra~1/PowerShell/7-preview/Modules/Microsoft.PowerShell.Utility\Get-Date
Použití operátoru volání
Pomocí operátoru volání (&
) můžete také spouštět skryté příkazy tím, že je zkombinujete s voláním Get-ChildItem (alias je dir
) Get-Command
nebo Get-Module.
Operátor volání spouští řetězce a bloky skriptů v podřízené oblasti. Další informace najdete v tématu about_Operators.
Například pomocí následujícího příkazu spusťte funkci s názvemMap
, která je skrytá aliasem .Map
& (Get-Command -Name Map -CommandType Function)
nebo
& (dir Function:\map)
Skrytý příkaz můžete uložit také do proměnné, aby se usnadnilo spuštění.
Následující příkaz například uloží Map
funkci do $myMap
proměnné a pak ji pomocí operátoru Call
spustí.
$myMap = (Get-Command -Name map -CommandType function)
& ($myMap)
Nahrazené položky
Nahrazená položka je ta, ke které už nemáte přístup. Položky můžete nahradit importem položek se stejným názvem z modulu.
Pokud například do relace zadáte Get-Map
funkci a naimportujete funkci s názvem Get-Map
, nahradí původní funkci. V aktuální relaci ho nemůžete načíst.
Proměnné a aliasy nelze skrýt, protože ke spuštění není možné použít operátor volání ani kvalifikovaný název. Při importu proměnných a aliasů z modulu nahradí proměnné v relaci stejným názvem.
Překlad názvů rutin
Pokud nepoužíváte kvalifikovaný název rutiny, PowerShell zkontroluje, jestli je rutina načtena v aktuální relaci. Pokud je načteno více modulů, které obsahují stejný název rutiny, PowerShell použije rutinu z prvního nalezeného modulu abecedně.
Pokud rutina není načtená, PowerShell vyhledá nainstalované moduly a automaticky načte první modul, který tuto rutinu obsahuje, a spustí tuto rutinu.
PowerShell vyhledá moduly v každé cestě definované v $env:PSModulePath
proměnné prostředí. Cesty se prohledávají v pořadí, v jakém jsou uvedené v proměnné. V každé cestě se moduly prohledávají v abecedním pořadí. PowerShell používá rutinu z první nalezené shody.
Zabránění konfliktům názvů
Nejlepší způsob, jak spravovat konflikty názvů příkazů, je zabránit jim. Při pojmenování příkazů použijte jedinečný název. Přidejte například iniciály nebo zkratku názvu společnosti do podstatných jmen v příkazech.
Při importu příkazů do relace z modulu PowerShellu nebo z jiné relace můžete pomocí Prefix
parametru rutiny Import-Module nebo Import-PSSession přidat předponu podstatných jmen v názvech příkazů.
Následující příkaz například zabrání jakémukoli konfliktu s Get-Date
rutinami, Set-Date
které jsou součástí PowerShellu při importu DateFunctions
modulu.
Import-Module -Name DateFunctions -Prefix ZZ
Spouštění externích spustitelných souborů
Ve Windows. PowerShell považuje přípony souborů uvedené v $env:PATHEXT
proměnné prostředí za spustitelné soubory. Soubory, které nejsou spustitelné soubory Windows, se předávají systému Windows ke zpracování. Systém Windows vyhledá přidružení souboru a spustí výchozí příkaz prostředí Windows Shell pro příponu. Aby systém Windows podporoval provádění podle přípony souboru, musí být přidružení registrováno v systému.
Spustitelný modul pro příponu souboru můžete zaregistrovat pomocí ftype
příkazů příkazového prostředí CMD a assoc
příkazů. PowerShell nemá žádnou přímou metodu registrace obslužné rutiny souboru. Další informace najdete v dokumentaci k příkazu ftype .
Aby PowerShell viděl příponu souboru jako spustitelný soubor v aktuální relaci, musíte přidat rozšíření do $env:PATHEXT
proměnné prostředí.