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.

  1. Alias
  2. Function
  3. Rutina (viz překlad názvů rutin)
  4. 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 Helpa 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í.

Viz také