Seriál: Windows Powershell – úvod (část 1.)
1 PowerShell
PowerShell je skriptovací jazyk a shell od Microsoftu. Z předchozí věty jsem záměrně vypustil slovo nový, protože první verze byla vydána již v roce 2006. Verze 2 je v současné době ve stadiu CTP3 (Community Technology Preview) a její finální uvedení je plánováno současně s vydáním Windows 7.
Tato série si klade za cíl seznámit vás s PowerShellem od úplných základů až po složitější konstrukce. Nemá být (ani být nemůže) vyčerpávajícím zdrojem. Pokud se budete chtít PowerShell naučit, budete muset pokračovat dále, např. studiem nápovědy, která je až překvapivě dobrá a užitečná. Začněme instalací.
1.1 Instalace
PowerShell je součástí posledních verzí operačních systémů, tedy Windows 7 a Windows 2008 R2. Ve Windows 2008 je dostupný jako volitelný doplněk a můžete jej doinstalovat přes Server Manager. Pokud jej budete chtít použít ve Windows Vista, XP a 2003 Server, musíte si jej doinstalovat jako samostatné KB. Pro nižší verze není PowerShell dostupný. V současné době je možno PowerShell doinstalovat i přes Windows Update (nebo WSUS).
Před instalací PowerShellu se ujistěte, že máte nainstalován .NET Framework minimálně ve verzi 2.0. Výše zmiňované KB pak nainstalujete klasickým next, next, next způsobem. Po instalaci naleznete v nabídce Start složku Windows PowerShell 1.0 a v ní modrou ikonu, kterou si určitě zamilujete J
1.2 První krůčky
Po spuštění uvidíte následující modrou obrazovku – tato modrá (#012456) je dobrá.
Figure 1: Okno PowerShellu
Zkusme si ukázat první obligátní kus kódu – známý Hello World! V PowerShellu jej zapíšete následujícím jednoduchým příkazem:
PS C:\> “Hello World!”
PowerShell vezme váš vstup a text opíše na výstupu. Mimochodem, pěkný přehled Hello World programů můžete najít na Wikipedii. Pojďme si ukázat několik užitečnějších příkazů, např. pro zobrazení aktuálního data a času
PS C:\> Get-Date
3. června 2009 22:00:32
pracovního adresáře
PS C:\> Get-Location
Path
----
C:\
nebo zjištění nastavení jazykového prostředí ve Windows.
PS C:\> Get-Culture
LCID Name DisplayName
---- ---- -----------
1029 cs-CZ Czech (Czech Republic)
Chtěli byste například zpracovat v PowerShellu výsledky z vyhledávače Bing?
PS C:\> Get-BingWeb 'technet powershell site:cz' | Format-Table Url
Url
---
https://www.logon.cz/?p=129
https://www.wug.cz/Default.aspx?tabid=53&EntryID=75
https://www.logon.cz/?tag=powershell
https://www.wug.cz/Default.aspx?tabid=58&mid=500&ctl=Detail&ItemID=208&VisibleDate=1.12.2008
https://blog.vyvojar.cz/dotnet/archive/2006/11/30/138593.aspx
https://www.wug.cz/Default.aspx?tabid=53&EntryID=106
https://www.wug.cz/Aktuality/tabid/36/ctl/Detail/mid/492/ItemId/270/language/cs-CZ/Default.aspx
https://www.logon.cz/?p=230
https://www.wug.cz/Default.aspx?tabid=58&mid=500&ctl=Detail&ItemID=144&VisibleDate=9.5.2008
https://www.cs.vsb.cz/navrat/vyuka/sps/prednasky/pred10b.pdf
Příkaz vyhledá text „TechNet Powershell“ v českých doménách a pomocí Format-Table vypíše adresy prvních deseti odkazů, které nalezne. Get-BingWeb není standardním příkazem PowerShellu, ale je na něm ukázána jedna ze silných stránek PowerShellu – komunita. Již druhý den po ohlášení nového vyhledávače vytvořil Joe Pruitt knihovnu funkcí pro práci s bingem (PoshBing) a uvolnil ji pro veřejné použití. Pokud ji chcete také vyzkoušet, je ke stažení na CodePlexu.
1.3 Základní pojmy
Než se pustíme do podrobnějšího přehledu, řekneme si něco o terminologii v PowerShellu. Jedná se o základní poučky, které vám umožní začít PowerShell efektivněji a rychleji používat.
1.3.1 Cmdlet
Je základním příkazem PowerShellu. Vyslovuje se jako command-let. Ve verzi 1 je jich v PowerShellu 129. V příkladech výše jsme si ukázali cmdlety Get-Date, Get-Location a Get-Culture.
1.3.2 Jmenná konvence
V předchozím bodě jsme si ukázali tři cmdlety. Nezdá se vám na jejich jméně něco zajímavého? Pokud vám přijde zajímavá konvence Get-<něco> , jste na správné stopě. Vývojový tým PowerShellu zavedl jmennou konvenci, která je v angličtině vyjádřena jako Verb-Noun, čili v češtině Sloveso-PodstatnéJméno. Zároveň se snaží (a dle mých zkušeností úspěšně) tuto konvenci prosadit. V současné době existuje malá skupina sloves pro cmdlety a je v hojné míře používána. Více se můžete dozvědět přímo v blogu vývojového týmu PowerShellu.
Seznam sloves ve verzi 1 je následující:
Pro podstatné jméno platí pravidlo, že musí být v jednotném čísle. Proto existuje cmdlet Get-QADUser a nikoli Get-QADUsers.
Velkou výhodou této snahy je možnost „odhadnout“ jméno cmdletu, který právě potřebujete. Z příkladů je to víceméně jasné: chcete-li zjistit aktuální datum, použijte Get-Date; chcete-li datum nastavit, použijte Set-Date.
Na základě předchozích řádek asi dokážete dát dohromady příkaz, kterým zjistíte běžící procesy – je to Get-Process.
1.4 Bezpečnost
Řekněme si ještě něco krátce k bezpečnosti PowerShellu. Microsoft se poučil z hrozeb, které ohrožovaly počítače pomocí skriptů ve VBS a jedním z kroků je, že skripty v PowerShellu (přípona PS1) jsou po nainstalování asociovány s poznámkovým blokem. Tím odpadá „náhodné“ spuštění destruktivního kódu pouhým dvojklikem.
Několik dalších bezpečnostních prvků si ukážeme na příkladu. Zkuste vytvořit textový soubor, který bude obsahovat pouze jednu řádku textu, na které bude zapsán cmdlet Get-Date. Uložte tento soubor jako skript.ps1. Spusťte PowerShell a přejděte v něm do adresáře s vytvořeným skriptem. Pro pohyb použijte příkaz cd, známý z cmd.exe. Následujícím příkazem zkuste skript spustit:
PS C:\Temp\PS> skript.ps1
The term 'skript.ps1' is not recognized as a cmdlet, function, operable program, or script file. Verify the term and try again.
At line:1 char:10
+ skript.ps1 <<<<
Narazili jste na další „bezpečnostní překážku“ – PowerShell vám neumožní spustit skripty z aktuálního adresáře, pokud napíšete pouze jejich jméno. Příkaz musíte napsat následujícím způsobem:
PS C:\Temp\PS> ./skript.ps1
File C:\Temp\PS\script.ps1 cannot be loaded because the execution of scripts is disabled on this system. Please see "get-help about_signing" for more details.
At line:1 char:2
+ & <<<< "C:\Temp\PS\script.ps1"
Skript se vám opět nespustil, ale chybové hlášení je jiné. Dalším krokem k zabezpečení počítače jsou bezpečnostní politiky (v angličtině Execution policies), které hlídají, zda jsou spouštěné skripty digitálně podepsány. Po nainstalování je nastavena politika Restricted. V tomto módu je umožněno zapisování příkazů přímo v okně PowerShellu, ale pokud chcete spustit skript, PowerShell vám v tom zabrání a zobrazí chybu.
Bezpečnostní politiky jsou celkem čtyři: Restricted, AllSigned, RemoteSigned, Unrestricted. Pokud ji chcete změnit, použijte příkaz Set-ExecutionPolicy a jako parametr použijte jméno jedné ze jmenovaných politik.
Set-ExecutionPolicy RemoteSigned
zajistí, že skripty stažené z internetu nebo doručené mailem budou spuštěny, ale pouze pokud jsou podepsány důvěryhodným certifikátem. Nyní už bez problému spustíte skript, který jste vytvořili.
PS C:\Temp\PS> ./skript.ps1
3. června 2009 23:31:26
Pokud se chcete o politikách dozvědět více, zkuste v PowerShellu spustit příkaz
Get-Help about_signing
Je vidět, že Microsoft se poučil z minulosti a již od začátku navrhl PowerShell i s ohledem na bezpečnost. Poslední krok je ale samozřejmě vždy na uživateli. Pokud změníte bezpečnostní politiku na Unrestricted, není chybou PowerShellu, že spustíte skript z neznámého zdroje a poškodíte svůj počítač, či celou síť.
Doporučení: Nechte na svých počítačích politiku nastavenou alespoň na RemoteSigned, vyhnete se tak mnoha případným problémům.
1.5 Nápověda
Velmi silnou stránkou PowerShellu je jeho nápověda. Již při instalaci se nainstalují tři zajímavé dokumenty: User Guide, Getting Started a Quick Reference. Dohromady se jedná asi o 150 stran doporučeníhodného čtení.
Další možností je nápověda vestavěná přímo uvnitř shellu, dostupná je pomocí příkazu Get-Help. Jako administrátoři máte možná snahu nápovědu zatracovat, podceňovat či vůbec tak nějak nenávidět. V tomto případě by to byla chyba. Nápověda je zpracována velice dobře a už se mnohokrát osvědčila.
Toto je základní výpis informace o vybraném cmdletu. Všimněte si posledních dvou řádek a jejich doporučení. Nejpodrobnější informace získáte pomocí přepínače –Full. Součástí nápovědy ke každému cmdletu je ukázka příkladů použití. Pokud použijete přepínače –Full nebo –Detailed, budou příklady zobrazeny na konci výpisu. Pokud chcete pouze výpis příkladů, použijte přepínač –Examples.
Get-Help Get-Date –Examples
V PowerShellu existuje ještě jeden typ nápovědy – tematická. Každé z témat popisuje použití některých částí PowerShellu, např. aritmetické operace, regulární výrazy, aliasy, atd. Seznam všech témat je zobrazen níže.
Dnes jsme si ukázali některé základní vlastnosti PowerShellu. Příště si povíme o objektech, rouře a provázanosti PowerShellu s .NET Frameworkem. Těšte se…
- David Moravec
Další díly seriálu:
Seriál: Windows Powershell – PS pro programátory (část 6.)
Seriál: Windows Powershell - souborový systém a registry (část 5.)
Seriál: Windows Powershell – dolujeme data aneb jak na WMI (část 4.)
Seriál: Windows Powershell – roury a aliasy (část 3.)
Seriál: Windows Powershell – objekty a roury (část 2.)
Comments
Anonymous
August 07, 2009
Len drobne upresnenie k naming convention. Naming convention je v skutocnosti ModuleVerb-Noun, ale pre zjednodusenie sa namespace module automaticky... Doteraz to platilo len pre cmdlety. Ako priklad, nasledujuce dva prikazy su uplne identicke: Get-ChildItem Microsoft.PowerShell.ManagementGet-ChildItem Od Powershell v2 uz Module plati aj pre skripty (resp. moduly .psm1). T.j. ak si vytvorim subor AD.psm1, kde si ukladam vsetky funkcie pre manipulaciu s AD, mozem pouzivat funkciu ADGet-User (namiesto Get-ADUser). V dnesnej dobe sa to zvykne obchadzat tym, ze funkcie maju modul primo v nazve: Function ADGet-User {...} Ked sa zmeni koncovka z .ps1 na .psm1, staci len odstranit AD prefix. Detaily je mozne najst napriklad tu: http://martinzugec.blogspot.com/2009/03/powershell-naming-convention.html Oficialna naming convention sa tyka nielen Verb-Noun, ale zaroven aj argumentov a podobne. Velmi uzitocny a bohuzial malo znamy je dokument od Microsoftu (Microsoft Command Line Standard): http://www.microsoft.com/technet/scriptcenter/topics/winpsh/cmdline_std.mspx K security, v Posh V2 je obrovska zmena - kto niekedy skriptoval napriklad SCCM (ktory bezi pod Local System), tak ju urcite doceni ;) Pre execution policy je mozne nastavit novy prepinac -Bypass, ktory je benevolentnejsi nez -Unrestricted, pretoze vobec neriesi IE zony a umoznuje jednoducho spustat skripty z UNC cesty (jedna z najvacsich nevyhod Posh V1). MartinAnonymous
August 07, 2009
Mimochodem, finalni seznam schvalenych sloves je dostupny na http://blogs.msdn.com/powershell/archive/2009/07/15/final-approved-verb-list-for-windows-powershell-2-0.aspx Coz vedlo k nekolika vtipkum vzhledem k tomu, ze obsahuje napriklad "slovesa" ConvertFrom a ConvertTo. DavidAnonymous
August 08, 2009
Interne bol okolo toho celkom boj - specialne okolo "Invoke-", ktore sa nikde mimo vyvojarov nepouziva ;)Anonymous
February 25, 2016
Ten čas ale letí! Ani se tomu nechce věřit, že je to již 10 let, co první příspěvekAnonymous
March 18, 2016
skoda ze dalsi dily uz nejsou dostupne.Anonymous
April 04, 2016
Dalsi dily uz nebudou?Anonymous
October 06, 2016
Jen pro zajímavost (možná už to tu někdo psal, jsem lenivý hledat dále): Windows Powershell ve své podstatě kopíruje Linuxáckej Terminal. Kdo s Terminálem v Linuxu už dělal, pracoval (stejný je i v OS X i v Androidu, ve všech systémech na bázi Unixu), tak syntaxi PowerShellu pochopí velice brzy. Příkazy jsou totiž úplně stejné.Anonymous
September 09, 2018
no kazdopadne je skoda, ze jiz nefunguji dlasi casti serialu :-(- Anonymous
December 13, 2018
Kompletný seriál je k dispozícii tu: https://drive.google.com/file/d/1ZwYXPZ5NFCKW0uRujur0qYiTWicZjD_S/view?usp=sharing
- Anonymous