Jaromír Nechanický

Vývojářský blog Jaromíra Nechanického

Podle kategorie

Začínáme s PowerShellem II.

Jaromír Nechanický       24.01.2010             22929 zobrazení

V tomto díle si představíme, jak funguje objektová PipeLine v PowerShellu.

Pokud nejste s principe fungování PipeLine seznámení z jiných jazyků (například již zmiňovaný bash), pak vězte, že myšlenka je velmi jednoduchá. Jedná v podstatě o přeposlání výstupu z jednoho příkazu (CmdLetu) na vstup druhého příkazu (CmdLetu). Jak již sám název napovídá, můžete si PipeLine představit jako kdybyste propojili dva příkazy trubkou a tou trubkou posílali data. Jedná se o jednosměrnou komunikaci.

PipeLIne má značku | a její použití si ukážeme v následujícím příkladu. Tento příklad vypíše všechny txt soubory v adresáři a smaže je.

 Get-ChildItem *.txt | Remove-Item

Výhodou je, že narozdíl od bashe, či většiny unixových shellů PowerShell je objektový. To znamená, že zatímco v linuxu vám skrz PipeLine “přiteče” do dalšího příkazu pouhý text, který musíte složitě parsovat a upravovat, v PowerShellu tečou objekty. K aktuálně zpracovávanému objektu se dostaneme pomocí speciální proměnné $_.Nejste-li si jistí, jakého typu je objekty, který vám přiteče, můžete použít příkaz get-member. Následující příkaz vypíše všechny vlastnosti souboru, které můžete volat/vypsat.

 Get-ChildItem | Get-Member

Filtrování dat

Velmi často budete chtít data profiltrovat. K tomu slouží příkaz where-object, případně jeho alias ?. Podmínku píšete do složených závorek. PowerShell má následující logické operátory:

Operátor C# ekvivalent Popis
-eq == obě strany jsou si rovny
-ne != strany si nejsou rovny
-le <= levá strana menší, nebo rovna pravé
-lt < levá strana menší, než pravá
-ge >= levá strana větší, nebo rovna pravé
-gt > levá strana větší, než pravá
-like   porovná levou stranu oproti masce (* libovolný počet znaků, ? právě 1 libovolný znak)
-notlike   jako –like , ovšem negovaný
-match   porovná levou stranu oproti regulárnímu výrazu
-notmatch   jako –match , ale negovaný

 

Následující příkaz zjistí běžící procesy a vyfiltruje z nich pouze ty, které zabírají více jak 50MB paměti.

 Get-Process | ?{$_.PM -gt 50000000}

Nyní bysme ještě chtěli výsledky setřídit, abychom měli přehled o největších žroutech.

 Get-Process | ?{$_.PM -gt 50000000} | Sort-Object -Property PM

Další velmi užitečný příkazem je Foreach-Object. Tento příkaz projde postupně všemi daty, která přitekla a provede na nich blok příkazu. Následující příkaz vytvoří soubory pojmenované 1-10.

Poznámka: příkaz 1..10 vytvoří pole čísel od 1 do 10ti.

  1..10 | ForEach-Object {New-Item -ItemType file -name $_}

Formátování výstupu

V první řadě bych rád zmínil několik příkazů, které slouží pro vypsání hlášek na konzoli/do výstupu.

 Write-Host "hello world" #vypíše na konzoli, ovšem nepřepošle objekt dále PipeLine
Write-Output "hello world" #pošle objekt skrze PipeLine

Pro formátování výstupu slouží příkazy Format-Table a Format-List.

 gps | Sort-Object -Property name | Format-Table -GroupBy name #vypíše procesy ve více tabulkách rozdělených dle jména
gps | Format-Table -Property name, PM #vypíše procesy a zobrazí u nich pouze název a spotřebovávanou paměť
gps | format-table ProcessName,@{Label="TotalRunningTime"; Expression={(get-date) - $_.StartTime}} #zobrazí procesy a zobrazí u nich název a TotalRunningTime, který je vypočítáván
 ls | Format-List #vypíše seznam souborů, ale informace o nich zobrazí jako list
gps | Format-List -Property name,@{Label="Memory";Expression={$_.PM}}#vypíše seznam procesů a zobrazí pouze vlastnosti Name a PM, kde PM přejmenuje na "Memory"

Chcete-li použít “hezčí” zobrazení, můžete použít příkaz Out-Gridview, který vám umožní v GUI třídit a filtrovat.

 gps | Out-GridView

Poslední dva příkazy pro práci s výstupem, které si ukážeme jsou Out-File a Out-Printer.

 gps | Out-File procesy.txt #uloží seznam běžících procesů do souboru procesy.txt
gps | Format-List -Property name |Out-Printer -Name 'Microsoft XPS Document Writer' #vytiskne seznam běžících procesů (pouze jméno)

 

hodnocení článku

1 bodů / 1 hlasů       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

Nevysvětlen příklad Get-Process | ?{$_.PM -gt 50000000}

Dobrý den,

Proč v příkazu "Get-Process | ?{$_.PM -gt 50000000}" je:

- Uveden otazník, tedy zástupce pro jeden libovolný znak? Vypisují se všechny procesy a velikost není jeden znak.

- Nelze místo otazníku použít hvězdičku (zástupce pro sekvenci libovolných znaků)?

Děkuji za případné vysvětlení.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

? je aliasem pro Where-Object

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Začínáme s PowerShellem II.

Proti obsahové stránce nic nemám, jen bych poznamenal že by bylo možná lepší články na pokračování vytvářet jako článek a ne jako blog, na články s více díly je tady funkce pro vytvoření seriálu.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback