PowerShell
PowerShell (dříve známý jako Microsoft Shell, Windows PowerShell, MSH nebo pod kódovým označením Monad) je rozšiřitelný textový (řádkový) shell se skriptovacím jazykem od společnosti Microsoft. Produkt je založen na platformě .NET Framework a z toho vyplývá i jeho odlišnost od ostatních shellů, místo textové roury, jak je tomu u UNIX shellu, obsahuje PowerShell rouru objektovou.[1] PowerShell 2.0 je volitelnou součástí systémů Windows XP SP3, Windows Server 2003, Windows Vista SP1 a Windows Server 2008.
PowerShell Core 6.0 icon | |
Autor | Jeffrey Snover, Bruce Payette, James Truher (et al.) |
---|---|
Vývojář | Microsoft |
První vydání | 14. listopadu 2006 |
Poslední verze | 7.1.0 (11. listopadu 2020) |
Poslední nestabilní verze | 7.2.0-preview.1 (17. listopadu 2020) |
Hlavní implementace | C# |
OS | Windows 7 nebo vyšší Windows Server 2008 R2 nebo vyšší Linux macOS 10.12 nebo vyšší Ubuntu 14.04, 16.04, 17.04 a 18.04 Debian 8.7+, 9 a 10 CentOS 7 a 8 Red Hat Enterprise Linux 7 openSUSE 42.2, 42.3, 15.0, 15.1, 15.2 Fedora 28, 29, 30 |
Licence | Licence MIT - PowerShell Core, MS EULA - PowerShell |
Web | https://microsoft.com/powershell |
Windows PowerShell poskytuje všechny možnosti platformy, na které je postaven, tudíž vše, co je obsaženo v Microsoft .NET Frameworku, je dostupné i z PowerShellu. Díky této provázanosti poskytuje PowerShell velké množství funkcí pro správu pomocí tzv. cmdlets (britská výslovnost kə'ma:ndlets, amer. k'mændlets), což jsou specializované třídy .NET implementující určitou operaci. Skripty PowerShellu (přípona .ps1) jsou kompozicí cmdletů s podporou logických podmínek.[2][3] PowerShell je nástupcem příkazového řádku Windows, tudíž dokáže pracovat s klasickými aplikacemi Windows (net.exe, ping.exe, …), ale také dokáže vytvářet instance libovolné .NET třídy, případně COM objekt.[4]
Windows PowerShell na rozdíl od starého příkazového řádku dokáže přistupovat nejenom k souborovému systému, ale také například k registrům systému, úložišti certifikátů a dalším, toto umožňuje systém providerů, které tuto funkcionalitu přidávají. Vytvořit provider pro správu libovolného systému není složité, stačí umět programovat v některém z .NET jazyků.
Windows PowerShell také obsahuje podporu hostování v libovolné aplikaci, takže je možné implementovat podporu do různých aplikací, jako je například Microsoft Exchange Server 2007, který je první aplikací, která se dá plnohodnotně spravovat přes příkazovou řádku Windows PowerShell. Mezi další aplikace, ke kterým jsou dodávány cmdlety a providery jsou Microsoft SQL Server 2008, IIS 7 a SharePoint 2010.
Windows PowerShell obsahuje svůj vlastní rozšířitelný systém nápovědy připomínající manuálové stránky v unixových systémech.
Windows PowerShell 1.0
Příkazy ve Windows PowerShellu mohou být ve formátu cmdletů, což jsou specializované třídy, napsané v .NET kompatibilním jazyce, které jsou navrženy pro přidání funkcionality do PowerShellu. Skripty v PowerShellu 1.0 mají standardně příponu .ps1. Dalšími příkazy mohou být spustitelné soubory (například ping.exe), které jsou spouštěny na rozdíl od cmdletů jako oddělený proces. PowerShell obsahuje interaktivní příkazovou řádku, která dovoluje doplňování názvů příkazů, souborů, aliasů a dalších pomocí klávesy Tab ↹. PowerShell podporuje aliasy pro všechny příkazy, které můžou být definované v rámci profilu uživatele (skript uživatele, který je přidá při spuštění PowerShellu) anebo v rámci systému. Alias je pouze jiný název pro příkaz, tudíž příkaz dir je vlastně pouze alias pro cmdlet Get-ChildItem.
PowerShell podporuje tzv. příkazovou rouru, podobnou unixové rouře. Roura slouží k zapojení více příkazů pro zpracování jednoho zdroje dat, kdy dochází k tomu že předchozí příkaz předává svůj výstup dalšímu příkazu a takto se to opakuje až do zobrazení výsledku na obrazovce. Jednotlivé příkazy jsou v rouře odděleny pomocí znaku |, ale na rozdíl od roury v UNIXu roura v PowerShellu je objektová, to znamená, že data procházející rourou jsou ve formě objektů na místo jednotlivých bytů.
Protože všechny objekty v PowerShellu jsou objekty .NET, všechny obsahují metodu ToString(), která vrací textovou reprezentaci objektu, PowerShell používá tuto standardní metodu pro reprezentaci objektů v textové podobě. Pro kompatibilitu se starší příkazovou řádkou je podporován převod pomocí ToString když příkaz v rouře je externí aplikací.
Cmdlet
Cmdlet patří mezi specializované příkazy v prostředí PowerShellu, které implementují specifické funkce. Cmdlety jsou pojmenované tak, že začínají slovesem, pak následuje znak pomlčka a pak je podstatné jméno (Get-ChildItem), tento styl pojmenování dovoluje výstižnější pojmenování jednotlivých příkazů. Cmdlety jako výsledek mohou vrátit objekt a kolekce (případně pole objektů). Pokud se v rouře PowerShellu objeví kolekce, PowerShell automaticky postupně zavolá následující cmdlet na každý objekt zvlášť. Cmdlety jsou specializované .NET třídy, které prostředí PowerShellu vytváří a volá za běhu. Cmdlety se jako třídy dědí ze základní třídy CmdLet nebo PSCmdlet, která je rozšířena o interakci s PowerShellem jako takovým. Tyto třídy specifikují metody, které třídy cmdletů přetěžují. Mezi tyto metody patří BeginProcessing(), ProcessRecord() a EndProcessing(). Všechny tyto metody jsou zavolány v přesném pořadí, jak jsou zde napsány. Dále třída cmdletu musí mít atribut CmdletAttribute, která specifikuje sloveso a podstatné jméno, které tvoří název cmdletu. Pokud cmdlet obdrží vstup z roury nebo argumenty z příkazové řádky, musí obsahovat vlastnosti odpovídající názvu argumentu. Tyto vlastnosti musí mít atribut ParameterAttribute a pokud má vlastnost přijímat data z roury, musí navíc obsahovat atribut ValueFromPipeline.
Cmdlet může být napsán v jakémkoliv jazyce, který podporuje platformu .NET (například C#, VB.NET, IronPython, PHP, J# a jiné). PowerShell také obsahuje některé API pro tvůrce cmdletů, jako je například metoda WriteObject(), která je použita pro přístup k specifické funkcionalitě, jako je zápis výsledků do roury. Cmdlety mohou k přístupu využít objekty .NET (jako je například ADO.NET) a nebo mohou využívat providerů v PowerShellu, kteří dovolují přístup k datům pomocí unikátních názvů. Data jsou rozdělena pomocí názvů jednotek (C:, D:, E:, …) a obsahují hierarchii určitého datového zdroje, které v základní instalaci obsahuje PowerShell tři: pro souborový systém, pro registry a úložiště certifikátů. Dále v základní instalaci obsahuje PowerShell přístup k WMI.
Skriptování v PowerShellu
Windows PowerShell obsahuje dynamický skriptovací jazyk, který podporuje složitější imperativní operace pomocí cmdletů. Skriptovací jazyk podporuje proměnné (začínají znakem $ a pokračují jejich názvem), které nemají typovou kontrolu, dále jsou v jazyce podporovány funkce, větvení (if-then-else), cykly (while, do, for a foreach), strukturované odchycení výjimky a lambda výrazy. Dále je skriptovací jazyk pevně spjat s .NET Frameworkem. Datový typ String je vyjádřen uvozovkami, jak jednoduchými ('), tak klasickými ("). Obsah souboru se například načte pomocí výrazu ${!C:\file.txt}. Pokud tento výraz použijeme v levé straně výrazu, dojde naopak k zapsání dat do souboru. Přístup k prvkům objektů je pomocí tečkové notace, jak je tomu v jazyce C#. Dále jsou dostupné speciální proměnné PowerShellu, jako je $args a $_, což je aktuální objekt v rouře.
Pomocí použití klíčového slova function PowerShell umožňuje vytvoření funkcí, které můžou přijímat parametry. Funkce můžeme volat dvěma způsoby:
- <funkce> <parametr1> <parametr2> <…>
- v tomto případě funkce nemusí specifikovat své parametry, protože tyto parametry dostane v proměnné $args
- <funkce> (<parametr1>, <parametr2>)
- v tomto případě musí metoda definovat své argumenty, které přijímá, parametry jsou pak dostupné pomocí svých názvů
PowerShell dovoluje použití a volání .NET tříd a jejich metod. Název třídy i se jmenným prostorem uvozujeme do [] a statickou metodu voláme pomocí ::.
Volání statické metody si ukážeme na jednoduchém příkladu, kontroly připojení k síti:
if([System.Net.NetworkInformation.NetworkInterface]::GetIsNetworkAvailable())
{
"Síť je dostupná!"
} else {
"Síť není dostupná!"
}
PowerShell dále dovoluje vytvoření a práci s .NET objektem. Nový objekt se vytváří pomocí příkazu:
$promenna = new-object -typename Namespace.Nazev.Typu
Jako příklad vytvoření nového objektu si ukážeme jak vytvořit okno, které zobrazí label s textem.
$myform = new-object -typename System.Windows.Forms.Form
$mylabel = new-object -typename System.Windows.Forms.Label
$mylabel.Text = "Hello Powershell!"
$mylabel.SetBounds(0,0,128,128)
$myform.Controls.Add($mylabel)
$myform.Text = "Testovací okno"
$myform.SetBounds(0,0,128,128)
$myform.ShowDialog()
Reference
- SCHÖFMANN, Peter. Staubbrenner für Klärschlamm. UmweltMagazin. 2020, roč. 50, čís. 04–05, s. 18–21. Dostupné online [cit. 2022-04-04]. ISSN 0173-363X. DOI 10.37544/0173-363x-2020-04-05-18.
- SCHWICHTENBERG, Holger. Microsoft Azure. München: Carl Hanser Verlag GmbH & Co. KG Dostupné online. S. 1155–1202.
- CBS News Monthly Poll #3, January 2007. ICPSR Data Holdings [online]. 2008-09-26 [cit. 2022-04-04]. Dostupné online.
- SCHWICHTENBERG, Holger. Microsoft-SQL-Server-Administration. München: Carl Hanser Verlag GmbH & Co. KG Dostupné online. S. 813–836.
Externí odkazy
- Obrázky, zvuky či videa k tématu PowerShell na Wikimedia Commons
- Úvodní článek o Monadu
- Článek o vytvoření jednoduchého provideru pro PowerShell v C#
- Výukové materiály pro zájemce o PowerShell