Sdílet prostřednictvím


Spouštění příkazů v shellu

PowerShell je prostředí příkazového řádku a skriptovací jazyk používaný pro automatizaci. Podobně jako v jiných prostředích, jako je bash v Linuxu nebo v prostředí Windows Command Shell (cmd.exe), vám PowerShell umožňuje spouštět všechny příkazy dostupné ve vašem systému, nejen příkazy PowerShellu.

Typy příkazů

Pro jakékoli shell v jakémkoli operačním systému existují tři typy příkazů:

  • klíčová slova jazyka prostředí jsou součástí skriptovacího jazyka prostředí.

    • Mezi příklady klíčových slov bash patří: if, then, else, elifa fi.
    • Mezi příklady klíčových slov cmd.exe patří: dir, copy, move, ifa echo.
    • Mezi příklady klíčových slov PowerShellu patří: for, foreach, try, catcha trap.

    Klíčová slova shellového jazyka lze použít pouze ve spouštěcím prostředí shellu. Neexistuje žádný spustitelný soubor externí vůči shellu, který poskytuje funkčnost klíčového slova.

  • nativní příkazy operačního systému jsou spustitelné soubory nainstalované v operačním systému. Spustitelné soubory je možné spustit z libovolného prostředí příkazového řádku, jako je PowerShell. To zahrnuje soubory skriptu, které můžou vyžadovat správné fungování jiných prostředí. Pokud například v PowerShellu spustíte dávkový skript Windows (soubor.cmd), PowerShell spustí cmd.exe a předá dávkový soubor ke spuštění.

  • Příkazy specifické pro prostředí shellu jsou příkazy definované v externích souborech, které lze použít pouze v běhovém prostředí shellu. Patří mezi ně skripty a funkce, nebo to mohou být speciálně vytvořené moduly, které přidávají příkazy do běhového prostředí shellu. V PowerShellu se tyto příkazy označují jako rutiny (vyslovuje se "command-lets").

Spouštění nativních příkazů

Jakýkoli nativní příkaz lze spustit z příkazového řádku PowerShellu. Příkaz obvykle spustíte přesně tak, jak v bash nebo cmd.exe. Následující příklad ukazuje spuštění příkazu grep v bash v Ubuntu Linuxu.

sdwheeler@circumflex:~$ grep sdwheeler /etc/passwd
sdwheeler:x:1000:1000:,,,:/home/sdwheeler:/bin/bash
sdwheeler@circumflex:~$ pwsh
PowerShell 7.2.6
Copyright (c) Microsoft Corporation.

https://aka.ms/powershell
Type 'help' to get help.

Po spuštění PowerShellu v Ubuntu můžete spustit stejný příkaz z příkazového řádku PowerShellu:

PS /home/sdwheeler> grep sdwheeler /etc/passwd
sdwheeler:x:1000:1000:,,,:/home/sdwheeler:/bin/bash

Předávání argumentů nativním příkazům

Většina prostředí zahrnuje funkce pro používání proměnných, vyhodnocování výrazů a zpracování řetězců. Ale každý shell to dělá jinak. V PowerShellu začínají všechny parametry znakem spojovníku (-). Ve cmd.exevětšina parametrů používá znak lomítka (/). Jiné nástroje příkazového řádku nemusí mít pro parametry speciální znak.

Každé prostředí má svůj vlastní způsob zpracování a vyhodnocování řetězců na příkazovém řádku. Při spouštění nativních příkazů v PowerShellu, které očekávají, že řetězce budou citovány určitým způsobem, budete možná muset upravit způsob předávání těchto řetězců.

Další informace najdete v následujících článcích:

PowerShell 7.2 zavedl novou experimentální funkci PSNativeCommandArgumentPassing, která zlepšila nativní zpracování příkazů. Další informace najdete v tématu $PSNativeCommandArgumentPassing.

Zpracování výstupů a chyb

PowerShell má také několik dalších výstupních datových proudů než jiná prostředí. Skripty bash a cmd.exe mají stdout a stderr. PowerShell má šest výstupních datových proudů. Další informace najdete v tématu "about_Redirection" a "about_Output_Streams".

Obecně platí, že výstup odeslaný do stdout nativním příkazem se odešle do datového proudu Success v PowerShellu. Výstup odeslaný nativním příkazem do stderr je v PowerShellu odeslán do datového proudu Chyba.

Pokud má nativní příkaz nenulový ukončovací kód, $? je nastaven na $false. Pokud je ukončovací kód nula, $? je nastavena na $true.

To se ale změnilo v PowerShellu 7.2. Chybové záznamy přesměrované z nativních příkazů, například při použití operátorů přesměrování (2>&1), se nezapisují do proměnné $Error v PowerShell a proměnná s předvolbami $ErrorActionPreference nemá vliv na přesměrovaný výstup.

Mnoho nativních příkazů zapisuje do stderr jako alternativní datový proud pro další informace. Toto chování může způsobit nejasnost v PowerShellu při prohlížení chyb a další výstupní informace mohou být ztraceny, pokud je $ErrorActionPreference nastaven na stav, který ztlumí výstup.

PowerShell 7.3 přidal novou experimentální funkci PSNativeCommandErrorActionPreference, která umožňuje řídit, jestli se výstup do stderr považuje za chybu. Další informace najdete v tématu $PSNativeCommandUseErrorActionPreference.

Spouštění příkazů PowerShellu

Jak bylo dříve uvedeno, příkazy PowerShellu se označují jako rutiny. Cmdlety se shromažďují do modulů PowerShell, které lze načíst na vyžádání. Cmdlety lze psát v libovolném zkompilovaném jazyce .NET nebo pomocí samotného skriptovacího jazyka PowerShell.

Příkazy PowerShellu, které spouštějí další příkazy

Operátor volání powershellu (&) umožňuje spouštět příkazy uložené v proměnných a reprezentované řetězci nebo bloky skriptu. Můžete ho použít ke spuštění libovolného nativního příkazu nebo příkazu PowerShellu. To je užitečné ve skriptu, když potřebujete dynamicky vytvořit parametry příkazového řádku pro nativní příkaz. Další informace naleznete v operátor hovoru.

Rutinu Start-Process lze použít ke spouštění nativních příkazů, ale měla by se používat jenom v případě, že potřebujete řídit, jak se příkaz spustí. Rutina má parametry pro podporu následujících scénářů:

  • Spuštění příkazu s použitím různých přihlašovacích údajů
  • Skrytí okna konzoly vytvořeného novým procesem
  • Přesměrování proudu stdin , stdout a stderr .
  • Použití jiného pracovního adresáře pro příkaz

Následující příklad spustí nativní příkaz sort.exe s přesměrovanými vstupními a výstupními datovými proudy.

$processOptions = @{
    FilePath = "sort.exe"
    RedirectStandardInput = "TestSort.txt"
    RedirectStandardOutput = "Sorted.txt"
    RedirectStandardError = "SortError.txt"
    UseNewEnvironment = $true
}
Start-Process @processOptions

Další informace najdete v tématu start-process.

Ve Windows rutina Invoke-Item provede výchozí akci pro zadanou položku. Například spustí spustitelný soubor nebo otevře soubor dokumentu pomocí aplikace přidružené k typu souboru dokumentu. Výchozí akce závisí na typu položky a je vyřešena poskytovatelem PowerShellu, který poskytuje přístup k položce.

Následující příklad otevře úložiště zdrojového kódu PowerShellu ve výchozím webovém prohlížeči.

Invoke-Item https://github.com/PowerShell/PowerShell

Pro více informací se podívejte na Invoke-Item.