Historicky byly nástroje příkazového řádku v unixových systémech vyvinuty lépe než v systému Windows, ale s příchodem nového řešení se situace změnila.
Windows PowerShell umožňuje systémovým administrátorům automatizovat většinu rutinních úloh. Pomocí ní je možné měnit nastavení, zastavovat a spouštět služby, a také provádět údržbu většiny nainstalovaných aplikací. Vnímat modré okno jako další příkazový interpret by bylo nesprávné. Takový přístup neodráží podstatu inovací nabízených společností Microsoft. Ve skutečnosti jsou možnosti Windows PowerShell mnohem širší: v několika krátkých článcích se pokusíme porozumět tomu, čím se řešení Microsoftu liší od pro nás běžnějších prostředků.
Hlavní funkce
Samozřejmě Windows PowerShell je především příkazová schránka s jazykem skriptování, původně vytvořená na základě platformy .NET Framework a později – na .NET Core. Na rozdíl od schránek, které přijímají a vracejí textová data, Windows PowerShell pracuje s třídami .NET, které mají vlastnosti a metody. PowerShell umožňuje vykonávat běžné příkazy a také poskytuje přístup k objektům COM, WMI a ADSI. Využívá různé úložiště, jako je souborový systém nebo registr Windows, pro jejichž přístup byly vytvořeny tzv. poskytovatelé (providers). Je třeba zmínit možnost včlenění spustitelných komponentů PowerShell do jiných aplikací pro provádění různých operací, včetně prostřednictvím grafického rozhraní. Platí to i naopak: mnoho aplikací pro Windows poskytuje přístup k jejich rozhraním pro správu prostřednictvím PowerShell.
Windows PowerShell umožňuje:
- Měnit nastavení operačního systému;
- Spravovat služby a procesy;
- Konfigurovat role a komponenty serveru;
- Instalovat software;
- Spravovat nainstalovaný software prostřednictvím speciálních rozhraní;
- Včleňovat spustitelné komponenty do cizích programů;
- Vytvářet skripty pro automatizaci administrativních úloh;
- Pracovat se souborovým systémem, registrem Windows, úložištěm certifikátů atd.
Schránka a vývojové prostředí
Windows PowerShell existuje ve dvou podobách: kromě emulátoru konzole s příkazovým řádkem je zde integrované prostředí skriptování (Integrated Scripting Environment — ISE). Pro přístup k rozhraní příkazového řádku stačí vybrat odpovídající zástupce v nabídce Windows nebo spustit powershell.exe z nabídky „Spustit“. Na obrazovce se zobrazí modré okno, které se výrazně liší ve funkcích od zastaralého cmd.exe. Obsahuje automatické doplňování a další funkce, které jsou uživatelům příkazových řádků Unixových systémů dobře známé.

Pro práci s touto siluetou je potřeba si zapamatovat určitá klávesová zkratky:
- Šipky nahoru a dolů procházejí historií pro opakování dříve zadaných příkazů;
- Šipka doprava na konci řádku znovu zadává předchozí příkaz po znacích;
- Ctrl+Home maže zadaný text od pozice kurzoru do začátku řádku;
- Ctrl+End maže text od kurzoru do konce řádku.
F7 zobrazuje okno s dříve zadanými příkazy a umožňuje vybrat jeden z nich. V konzole je také možné vyznačovat text myší, kopírovat a vkládat, používat umístění kurzoru, mazání, backspace — vše, co máme rádi.

Windows PowerShell ISE je plnohodnotné vývojové prostředí s editorem kódu podporujícím karty a syntaktické zvýraznění, konstruktor příkazů, integrovaný ladící nástroj a další programátorské radosti. Pokud v editoru vývojového prostředí napíšete za názvem příkazu pomlčku, zobrazí se vám v rozbalovací nabídce všechny dostupné parametry s uvedením typu. PowerShell ISE lze spustit buď prostřednictvím zástupce v systémové nabídce, nebo pomocí spustitelného souboru powershell_ise.exe.

Cmdlety
Ve Windows PowerShell se objevily tzv. cmdlety (cmdlets). Jedná se o specializované třídy .NET, které obsahují různé funkce. Pojmenovávají se podle principu „Akce-Objekt“ (nebo „Sloveso-Podstatné jméno“, pokud se vám to více líbí), přičemž propojení oddělené pomlčkou připomíná predikát a subjekt ve větách přirozených jazyků. Například Get-Help doslovně znamená „Získat-Pomoc“ nebo v kontextu PowerShellu: „Zobrazit-Nápovědu“. V podstatě to odpovídá příkazu man v Unixových systémech, a manuály v PowerShellu by měly být vyhledávány tímto způsobem, nikoli voláním cmdletů s klíčem —help nebo \/?. Nezapomeňte také na online dokumentaci k PowerShellu: ta od Microsoftu je poměrně podrobná.
Kromě Get se v cmdletech pro označení akcí používají i další slova (a nejen slova, striktně vzato). V níže uvedeném seznamu uvedeme několik příkladů:
Přidat — přidat;
Clear — vyčistit;
Enable — zapnout;
Disable — vypnout;
Nové — vytvořit;
Remove — odstranit;
Set — nastavit;
Spustit — spustit;
Stop — zastavit;
Export — exportovat;
Importovat — importovat.
Existují systémové, uživatelské a volitelné cmdlety: v důsledku vykonání všechny vracejí objekt nebo pole objektů. Na velká písmena nejsou citlivé, t.j. z pohledu interpretu příkazů nezáleží na rozdílu mezi Get-Help a get-help. Pro oddělení se používá symbol ‘;’, ale ten je nutno použít pouze pokud se na jednom řádku provádí několik cmdletů.
Cmdlety Windows PowerShell jsou seskupeny do modulů (NetTCPIP, Hyper-V atd.), a pro vyhledávání po objektu a akci existuje cmdlet Get-Command. Zobrazit nápovědu k němu lze takto:
Get-Help Get-Command 
Výchozí příkaz zobrazuje stručnou nápovědu, ale do cmdletů lze v případě potřeby předat parametry (argumenty). S jejich pomocí lze například získat podrobné (parameter -Detailed) nebo úplné (parameter -Full) informace, a také zobrazit příklady (parameter -Examples):
Get-Help Get-Command -ExamplesNápověda ve Windows PowerShell se aktualizuje cmdletem Update-Help. Pokud se příkaz stává příliš dlouhým, lze argumenty cmdletu přenést na další řádek tak, že napíšete speciální znak ‘`’ a stisknete Enter — jednoduše dokončit příkaz na jednom řádku a pokračovat na druhém není možné.
Níže uvedeme několik příkladů běžných cmdletů:
Get-Process — zobrazit spuštěné procesy v systému;
Get-Service — zobrazit služby a jejich stav;
Get-Content — zobrazit obsah souboru.
Pro často používané cmdlety a externí nástroje existují ve Windows PowerShell krátké synonymy — aliasy (z anglického Alias). Například dir — alias pro Get-ChildItem. V seznamu synonym jsou i ekvivalenty příkazů z Unixových systémů (ls, ps atd.), a cmdlet Get-Help je volán příkazem help. Úplný seznam synonym lze zobrazit pomocí cmdletu Get-Alias:

Skripty, funkce, moduly a jazyk PowerShell
Skripty Windows PowerShell se ukládají jako obyčejné textové soubory s příponou .ps1. Nelze je spustit dvojitým kliknutím: je potřeba kliknout pravým tlačítkem myši a vybrat možnost „Spustit v PowerShell“. Z konzole je třeba buď uvést celou cestu k skriptu, nebo přejít do příslušného adresáře a napsat název souboru. Spuštění skriptů je také omezeno systémovou politikou, a pro ověření aktuálního nastavení lze použít cmdlet Get-ExecutionPolicy, který vrátí jednu z následujících hodnot:
Restricted — spuštění skriptů je zakázáno (defaultně);
AllSigned — povoleno pouze spuštění podepsaných skriptů od důvěryhodného vývojáře;
RemoteSigned — povoleno spuštění podepsaných a vlastních skriptů;
Unrestricted — povoleno spuštění jakýchkoli skriptů.
Administrátor má dvě možnosti. Nejbezpečnější varianta předpokládá podepisování skriptů, ale to je poměrně složitá záležitost — tím se budeme zabývat v následujících článcích. Teď půjdeme cestou nejmenšího odporu a změníme politiku:
Set-ExecutionPolicy RemoteSigned 
PowerShell proto bude potřeba spustit jako správce, i když pomocí speciálního parametru lze změnit politiku i pro aktuálního uživatele.
Skripty se píší v objektově orientovaném programovacím jazyce, jehož příkazy se nazývají stejným způsobem jako výše zmíněné cmdlety: „Akce-Objekt“ („Sloveso-Podstatné jméno“). Jeho hlavním účelem je automatizace administrativních úloh, ale je to plnohodnotný interpretovaný jazyk, ve kterém jsou všechny potřebné konstrukce: podmínkový přechod, smyčky, proměnné, pole, objekty, zpracování chyb atd. Pro psaní skriptů je vhodný jakýkoli textový editor, ale nejlépe se spouští Windows PowerShell ISE.
Do skriptu lze předávat parametry, dělat je povinnými a také nastavovat výchozí hodnoty. Kromě toho Windows PowerShell umožňuje vytvářet funkce a vyvolávat je přesně tak, jak cmdlety: k tomu se používá konstrukce Function a složené závorky. Skript s funkcemi se nazývá modulem a má příponu .psm1. Moduly musí být ukládány v adresářích definovaných v proměnných prostředí PowerShell. Můžete je zobrazit pomocí následujícího příkazu:
Get-ChildItem Env:PSModulePath | Format-Table -AutoSizeDopravníky
V posledním příkladu jsme použili strukturu známou uživatelům unixových shellů. V systému Windows PowerShell umožňuje svislá čára také předat výstup jednoho příkazu jako vstup do druhého, ale v implementaci dopravníku existuje zásadní rozdíl: zde již nejde o sadu znaků nebo nějaký text. Vložení cmdletů nebo uživatelských funkcí vrací objekty nebo pole objektů a také mohou přijímat je jako vstup. Stejně jako v Bourne shellu a jeho četných následovnících usnadňuje v PowerShellu použití dopravníku provádění složitých úloh.
Nejjednodušší příklad dopravníku vypadá takto:
Get-Service | Sort-Object -property Status 
Nejprve se vykoná cmdlet Get-Service, a poté se všechny získané služby předají ke třídění podle vlastnosti Status cmdletu Sort-Object. To, do jakého argumentu se výsledek předchozího úseku dopravníku předává, závisí na jeho typu — obvykle je to InputObject. Podrobněji se této otázce budeme věnovat v článku věnovaném programovacímu jazyku PowerShell.
Pokud si to přejete, můžete řetězec prodloužit a předat výsledek práce Sort-Object dalšímu cmdletu (provádět se budou zleva doprava). Mimochodem, uživatelé Windows mají k dispozici i známou konstrukci pro stránkový výstup:
Get-Service | Sort-Object -property Status | moreSpuštění úloh na pozadí
Často je třeba spustit nějaký příkaz na pozadí, aby se nemuselo čekat na výsledek jeho vykonání v relaci shellu. V Windows PowerShell existuje několik cmdletů pro takové případy:
Start-Job — spuštění úlohy na pozadí;
Stop-Job — zastavení úlohy na pozadí;
Get-Job — zobrazení seznamu úloh na pozadí;
Receive-Job — zobrazení výsledků vykonání úlohy na pozadí;
Remove-Job — odstranění úlohy na pozadí;
Wait-Job — přenos úlohy na pozadí zpět do konzole.
Pro spuštění úlohy na pozadí používáme cmdlet Start-Job a v závorkách uvedeme příkaz nebo sadu příkazů:
Start-Job {Get-Service} 
S úlohami na pozadí v PowerShellu můžeme manipulovat, pokud známe jejich názvy. Nejprve se naučíme je zobrazit:
Get-Job 
Nyní ukážeme výsledek práce úlohy Job1:
Receive-Job Job1 | more 
Všechno je docela jednoduché.
Vzdálené vykonávání příkazů
Windows PowerShell umožňuje spouštět příkazy a skripty nejen na místním, ale také na vzdáleném počítači a dokonce na celé skupině strojů. K tomu existuje několik způsobů:
- Mnoho cmdletů má parametr
-ComputerName, ale tímto způsobem například nelze vytvořit potrubí; - Cmdlet
Enter-PSSessionumožňuje vytvořit na vzdáleném počítači interaktivní relaci; - Pomocí cmdletu
Invoke-Commandmůžete provádět příkazy nebo skripty na jednom nebo několika vzdálených počítačích.
Verze PowerShell
Od prvního vydání v roce 2006 se PowerShell významně změnil. Nástroj je k dispozici pro mnoho systémů na různých hardwarových platformách (x86, x86-64, Itanium, ARM): Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008/2008 R2, Windows 7, Windows 8, Windows 8.1, Windows RT, Windows RT 8.1, Windows Server 2012/2012 R2, Windows 10, Windows Server 2016, GNU/Linux a OS X. Poslední vydání 6.2 bylo vydáno 10. ledna 2018. Skripty napsané pro starší verze s vysokou pravděpodobností budou fungovat ve verzích novějších, zatímco s přenosností zpět mohou vzniknout problémy, protože během let vývoje se v PowerShellu objevilo velké množství nových cmdletů. Zjistit verzi příkazového shellu nainstalovaného na počítači lze pomocí vlastnosti PSVersion proměnné $PSVersionTable:
$PSVersionTable.PSVersion 
Můžete také použít cmdlet:
Get-Variable -Name PSVersionTable –ValueOnly 
To samé lze udělat pomocí cmdletu Get-Host. Ve skutečnosti existuje mnoho variant, ale pro jejich použití je třeba se naučit programovací jazyk PowerShell, čímž se budeme zabývat v .
Závěry
Společnosti Microsoft se podařilo vytvořit skutečně výkonný příkazový shell s pohodlným integrovaným prostředím pro vývoj skriptů. Od obvyklých nástrojů, které známe z prostředí Unix, se vyznačuje hlubokou integrací s operačními systémy rodiny Windows a také s jejich softwarem a platformou .NET Core. PowerShell lze nazvat objektově orientovaným shellem, protože cmdlety a uživatelské funkce vracejí objekty nebo pole objektů a mohou je dostávat jako vstup. Domníváme se, že tímto nástrojem by měli disponovat všichni správci serverů na Windows: doba, kdy se mohli obejít bez příkazového řádku, je pryč. Pokročilý příkazový shell je obzvláště potřebný na , ale to je už úplně jiný příběh.
Pouze registrovaní uživatelé se mohou účastnit ankety. , prosím.
Jaká témata by měla být nejprve zmíněna v následujících článcích této série?
53,2%Programování v PowerShell123
42,4%Funkce a moduly PowerShell98
22,1%Jak podepisovat své vlastní skripty?51
12,1%Práce s úložišti přes poskytovatele (providers)28
57,6%Automatizace správy počítačů pomocí PowerShell133
30,7%Správa softwaru a integrace spustitelných komponent PowerShell do třetích produktů71
Hlasovalo 231 uživatelů. Zdrželo se 37 uživatelů.
Zdroj: habr.com
