Seriál: Windows Powershell – roury a aliasy (část 3.)

Práce s objekty v rouře

V předchozím díle jsme si ukázali jak lze jednoduše pracovat s objekty v rouře. Až doposud jsme pracovali s celou kolekcí objektů (např. všechny procesy, které nám PowerShell vrátil). Nyní si ukážeme, jak filtrovat objekty dle potřeby.

Pro práci s objekty slouží následující cmdlety:

ps1

Na ty nejčastěji používané se nyní podíváme podrobněji.

ForEach-Object a Where-Object

Jsou určitě nejpoužívanějšími z „objektových“ cmdletů. ForEach-Object přijme všechny objekty z roury a provede nad nimi danou operaci. Where-Object přijme také všechny objekty z roury, ale k dalšímu zpracování pošle pouze ty, které splňují danou podmínku. Čili:

ps2

Zpracuje z WMI všechny logické disky a vypíše jejich jméno, popis a prázdné místo v gigabytech. Pokud by nás zajímaly pouze pevné disky, mohli byste použít Where-Object pro odfiltrování nepotřebných záznamů:

ps3

Pomocí Where-Object jsme určili, že chceme pouze disky, které mají DriveType rovno tři (což lze jednoduše vyhledat v MSDN).

Pokud se vám nelíbí zobrazení výsledku, můžete použít operátor formátování (-f):

ps4

Select-Object

Tento cmdlet slouží k definování vlastností, které chceme předávat dále rourou. Srovnejte například následující příkazy:

ps5

Select -Object vezme z objektu uvedené vlastnosti a pošle je dále rourou. Tento cmdlet je užitečný hlavně při exportech, např. při použití Export-Clixml.

Poznámka: Možná si říkáte, proč nepoužít místo Select-Object např. Format-Table, když oba dávají stejné výsledky:

ps6

Slovo stejné bych měl dát do uvozovek. Rozdíl je v tom (zde se dopustím úmyslně zjednodušení), že Select-Object posílá rourou dál pořád objekty, kdežto Format-Table pouze zapisuje textovou informaci (!) na standardní výstup (zde konzole). Můžete si to vyzkoušet jednoduchým pokusem:

ps7

Ve druhém případě nebudou na výstupu žádná jména, protože Select-Object nemá na vstupu žádný objekt.

Sort-Object

Často se stane, že potřebujete zjistit např. největší soubory v adresáři nebo procesy, které nejvíce zatěžují počítač. V těchto případech se hodí cmdlet Sort-Object. Některé příklady jsem uváděl v předchozím díle a proto je nyní pouze krátce připomenu:

ps8

Zde jsme seřadili procesy podle využití fyzické paměti (sestupně) a pět největších žroutů jsme vypsali.

Measure-Object

Potřebujete statistiku vašich skriptů? Measure-Object je vhodným kandidátem:

ps9

Group-Object

Tento cmdlet se vám bude hodit, pokud chcete například zjistit počet souborů v adresáři podle typu:

ps10

Compare-Object

Často se stane, že potřebujete porovnat určitý stav v čase. Nedávno jsem například řešil porovnání členství ve skupinách v AD. Jednoduše si porovnání můžete vyzkoušet následujícím způsobem:

ps11

Zde jsme si do proměnné $a uložili počáteční stav běžících procesů. Poté jsme spustili Notepad a do proměnné $b jsme uložili aktuální stav. Pomocí Compare-Object jsme oba stavy porovnali a ve výpisu je vidět rozdíl. Takovýmto jednoduchým způsobem můžete například dělat audit na vašem serveru.

Hezký skript, jehož středem je Compare-Object, je například k nalezení v článku Compare AD against snapshots od Dmitryho Sotnikova (PowerShell MVP).

New-Object, Tee-Object

Tyto dva cmdlety asi nebudete ze začátku moc používat, ale jelikož patří do skupiny s ostatními alespoň se o nich zmíním.

New-Object slouží k vytváření vlastních objektů. Pokud máte například organizační strukturu, se kterou chcete pracovat v PowerShellu, není nic jednoduššího než si pro každého člověka vytvořit objekt a poté s nimi pracovat v rouře.

ps12

Zde proměnná $companyStructure obsahuje seznam lidí ve firmě (vytvořený pomocí New-Object). Dále je již práce stejná jako se všemi dalšími objekty.

Tee-Object se používá uprostřed roury, pokud chcete „uschovat“ aktuální stav objektů a zároveň je poslat do další roury.

ps13

Na výstupu je pouze pět objektů, ale v souboru psid.txt jsou všechny objekty řazené podle Id.

Aliasy

V minulém díle jsem v posledním příkladu slíbil, že se dnes podíváme na aliasy. Alias můžeme chápat jako „zkratku“ při zápisu příkazů. Například

ps14

můžeme pomocí aliasu přepsat jako

ps15

Pokud jste v PowerShellu někdy zkusili příkaz dir, použili jste vlastně cmdlet Get-ChildItem. Seznam všech dostupných aliasů, můžete vypsat pomocí cmdletu Get-Alias.

ps16

Pokud chcete použít opačnou cestu, tedy zjistit všechny aliasy pro daný cmdlet, můžete použít následující příkaz. Ukážeme si v něm aliasy pro cmdlety, které jsme probírali v předchozí kapitole.

ps18

Vypíšeme všehny aliasy a pomocí Where-Object vyfiltrujeme pouze ty, které splňují naše podmínky. Výsledky pak pomocí Format-Table přehledně vypíšeme. Předchozí příklad můžeme přepsat pomocí aliasů následovně:

ps19

WTH? Zde jsem se úmyslně vrhl do absolutních obskurností. Takový zápis byste asi nikde vidět neměli. Chtěl jsem ukázat nebezpečí aliasů (a dalších „zkracovačů“). Pokud to přeženete, těžko se ve výsledku vyznáte. Na aliasy existují rozporuplné názory – někdo je nepoužívá vůbec, někdo částečně a někdo se v nich vyžívá. Zde bych asi doporučil obecně uznávané pravidlo. Ve skriptech používejte celé jméno, v konzoli se aliasům nebraňte (ale samozřejmě platí – používejte to, co nejvíce vyhovuje vám).

- 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 – objekty a roury (část 2.)
Seriál: Windows Powershell – úvod (část 1.)