Práce s objekty v rouře
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:
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:
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ů:
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):
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:
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:
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:
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:
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:
Group-Object
Tento cmdlet se vám bude hodit, pokud chcete například zjistit počet souborů v adresáři podle typu:
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:
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.
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.
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
můžeme pomocí aliasu přepsat jako
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.
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.
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ě:
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).