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)