Powershell: Pipelining
Z MiS
(Rozdíly mezi verzemi)
(Vytvoření stránky - zatím bez formátování.) |
(→Výstup do souboru: Přidáno >> a -Append) |
||
| (Není zobrazeno 8 mezilehlých verzí od 1 uživatele.) | |||
| Řádka 17: | Řádka 17: | ||
== Zpracování == | == Zpracování == | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| + | | Get-Member | ||
| + | * Zjištění vlastností objektu, který dostane na vstupu. | ||
| + | * Mohu využít jako pomocnou metodu pro zjištění, s jakými objekty pracuji. | ||
| + | *Vypisuje: | ||
| + | **Typ objektu | ||
| + | **Název, typ a popis atributů (properties) | ||
| + | **Název a popis metod | ||
| + | * Alias: <code>gm</code> | ||
| + | |||
| + | | Select | ||
| + | * Zobrazí pouze některé vlastnosti objektů (projekce). | ||
| + | * <code>-Property ''PropertyName1'',''PropertyName2'',''...''</code> | ||
| + | <div class="Priklad"> | ||
| + | Get-ChildItem | Select -Property Name,Length | Sort -Property Length -Descending | ||
| + | </div> | ||
| + | * <code>-ExpandProperty</code> | ||
| + | ** Skoro stejné jako <code>-Property</code>, ale nezobrazuje nadpisy sloupců, pouze hodnoty. | ||
| + | ** Vhodné pro použití uvnitř <code>(...)</code> | ||
| + | * <code>-First ''N''</code> | ||
| + | ** Prvních <code>''N''</code> položek. | ||
| + | |||
| + | | Sort | ||
| + | * <code>-Descending</code> | ||
| + | * <code>-Property ''PropertyName''</code> | ||
| + | ** Podle čeho se bude řadit. | ||
| + | |||
| + | | Measure | ||
| + | * Zjistí počet objektů na výstupu commandletu. | ||
| + | <div class="Priklad"> | ||
| + | Get-Verb | Measure | ||
| + | </div> | ||
== Filtrování == | == Filtrování == | ||
| − | + | | Where-Object | |
| − | * | + | * Commandlet pro obecné filtrování. |
| − | + | * Aliasy: <code>Where</code> | |
| − | + | ||
| − | + | ||
| − | * | + | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| + | * <code>-FilterScript {''...''}</code> | ||
| + | ** Je default parametr, takže stačí i: <code> {''...''}</code> | ||
| + | ** Spustí kód v závorkách. | ||
| + | ** Pokud spuštěný kód vrací pro daný objekt <code>$false</code>, <code>$null</code> nebo <code>""</code>, zahodí objekt. Jinak objekt ponechá v kolekci. | ||
| + | |||
| + | * Lze využít: <code>$_</code> | ||
| + | ** Zastupuje aktuální objekt z kolekce. | ||
| + | ** Můžeme pracovat s vlastnostmi tohoto objektu. | ||
| + | <div class="Priklad"> | ||
| + | Get-Service | Where {$_.Status -eq "Running"} | ||
| + | </div> | ||
| + | |||
| + | * <code>-Property ''Vlastnost'' ''operátor'' ''Hodnota''</code> | ||
| + | ** Je default parametr, takže stačí i: <code>''Vlastnost'' ''operátor'' ''Hodnota''</code> | ||
| + | <div class="Priklad"> | ||
| + | Get-Service | Where Status -eq "Running" | ||
| + | </div> | ||
| + | |||
| + | ; Operátory | ||
| + | * Porovnání | ||
| + | ** <code>-eq</code>... přesná rovnost (pro textové řetězce → musí se přesně shodovat) | ||
| + | ** <code>-gt</code> | ||
| + | ** <code>-like</code>... „podobnost“ | ||
| + | *** Pro textové řetězce → text musí obsahovat zadanou posloupnost jako podřetězec. | ||
| + | *** Umožní používat metaznaky <code>*</code> a <code>?</code>. | ||
| + | *** Podobné jako v SQL. | ||
| + | * Logické operátory | ||
| + | ** <code>-and</code> | ||
| + | ** ... | ||
| + | ; Doporučený postup | ||
| + | * Nejprve filtruj, pak zpracovávej! (Podobně jako v SQL.) | ||
| + | * Optimalizace výkonu. | ||
| + | |||
| + | ; Pro filtrování je lépe použít parametr <code>-Filter</code> | ||
| + | * Ale ne všechny příkazy ho mají. | ||
| + | <div class="Priklad"> | ||
| + | Místo: | ||
| + | Get-ChildItem | Where Name -like "*.xls" | ||
| + | Můžeme tedy psát: | ||
| + | Get-ChildItem -Filter "*.xls" | ||
| + | Nebo dokonce: | ||
| + | Get_ChildItem *.xls | ||
| + | </div> | ||
== Výstup do souboru == | == Výstup do souboru == | ||
| − | + | ... | Out-File vystup.txt | |
| + | Lze použít také operátor <code>></code>, který znáte z příkazového řádku Linuxu a Windows: | ||
| + | <div class="Priklad"> | ||
| + | ls *.txt | Select name, length | Out-File vystup.txt | ||
| + | ls *.txt | Select name, length > vystup.txt | ||
| + | </div> | ||
| + | Pokud chcete obsah připojit ke stávajícímu obsahu souboru, lze použít operátor <code>>></code> nebo přepínač <code>-Append</code>: | ||
| + | |||
| + | <div class="Priklad"> | ||
| + | echo "Ahoj" | Out-File -Append vystup.txt | ||
| + | echo "Ahoj" >> vystup.txt | ||
| + | </div> | ||
== Předávání dat == | == Předávání dat == | ||
| − | *Commandlety mají v nápovědě informaci, jestli přijímají vstup z pipeline | + | *Commandlety mají v nápovědě informaci, jestli přijímají vstup z pipeline. |
| − | + | ||
| − | + | === Přijímání vstupu === | |
| − | + | * by value | |
| − | + | ** Přímo předáváme objekty. | |
| − | + | ** Typ objektů na výstupu prvního commandletu musí odpovídat typu objektu, který očekává na vstupu zpracovávající commandlet. | |
| − | ***Get-Process calc | dir | + | * by Property Name |
| − | + | ** Přijímající commandlet očekává objekt, který má konkrétní vlastnost. | |
| − | + | ** Na samotném typu předávaného objektu nezáleží, důležité je, že má tuto konkrétní vlastnost. | |
| − | + | <div class="Priklad"> | |
| − | * | + | Get-Process ''calc'' | dir |
| − | + | *Spusť předtím kalkulačku | |
| − | + | *Zobrazí obsah adresáře, ve kterém je program, který realizuje proces Calc. | |
| − | + | </div> | |
| − | + | ||
| − | * | + | === Předávání počítačů === |
| − | + | * Počítače nelze předávat jako objekty přímo. | |
| − | + | ||
| − | + | ; Lze použít <code>{...}</code>: | |
| − | + | <div class="Priklad"> | |
| − | + | Get-ADComputers -Filter * | Get-WMIObjects -class Win32_bios -ComputerName {$_.Name} | |
| + | </div> | ||
| + | |||
| + | ; Mnoho příkazů umí také: | ||
| + | * <code>-ComputerName</code> | ||
| + | <div class="Priklad"> | ||
| + | Get-WMIObjects -class Win32_bios -ComputerName (Get-ADComputers -Filter *).Name | ||
| + | </div> | ||
| + | |||
| + | ; Lze kombinovat se závorkou a <code>-ExpandProperty</code> | ||
| + | <div class="Priklad"> | ||
| + | Get-WMIObjects -class ''Win32_bios'' -ComputerName (Get-ADComputers -Filter ''*'' | Select -ExpandProperty ''name'') | ||
| + | </div> | ||
Aktuální verze z 16. 1. 2023, 09:29
Obsah |
Princip
- Propojujeme několik příkazů tak, aby jeden příkaz předával svůj výstup místo na obrazovku dalšímu příkazu ke zpracování.
- Na obrazovku se vypíše až výsledek celé posloupnosti příkazů.
- Zapisujeme tak, že mezi jednotlivé příkazy posloupnosti zapíšeme znak
|.-
|... znak „roura“, anglicky „pipe“
-
- Příkazy si předávají objekty, nikoli text!
- (Na rozdíl od Unixu a příkazového řádku Windows.)
Get-Process *ss | Where handles -gt 900 | Sort handles Get-Service Sym* | Stop-Service -WhatIf
Zpracování
| Get-Member
- Zjištění vlastností objektu, který dostane na vstupu.
- Mohu využít jako pomocnou metodu pro zjištění, s jakými objekty pracuji.
- Vypisuje:
- Typ objektu
- Název, typ a popis atributů (properties)
- Název a popis metod
- Alias:
gm
| Select
- Zobrazí pouze některé vlastnosti objektů (projekce).
-
-Property PropertyName1,PropertyName2,...
Get-ChildItem | Select -Property Name,Length | Sort -Property Length -Descending
-
-ExpandProperty- Skoro stejné jako
-Property, ale nezobrazuje nadpisy sloupců, pouze hodnoty. - Vhodné pro použití uvnitř
(...)
- Skoro stejné jako
-
-First N- Prvních
Npoložek.
- Prvních
| Sort
-
-Descending -
-Property PropertyName- Podle čeho se bude řadit.
| Measure
- Zjistí počet objektů na výstupu commandletu.
Get-Verb | Measure
Filtrování
| Where-Object
- Commandlet pro obecné filtrování.
- Aliasy:
Where
-
-FilterScript {...}- Je default parametr, takže stačí i:
{...} - Spustí kód v závorkách.
- Pokud spuštěný kód vrací pro daný objekt
$false,$nullnebo"", zahodí objekt. Jinak objekt ponechá v kolekci.
- Je default parametr, takže stačí i:
- Lze využít:
$_- Zastupuje aktuální objekt z kolekce.
- Můžeme pracovat s vlastnostmi tohoto objektu.
Get-Service | Where {$_.Status -eq "Running"}
-
-Property Vlastnost operátor Hodnota- Je default parametr, takže stačí i:
Vlastnost operátor Hodnota
- Je default parametr, takže stačí i:
Get-Service | Where Status -eq "Running"
- Operátory
- Porovnání
-
-eq... přesná rovnost (pro textové řetězce → musí se přesně shodovat) -
-gt -
-like... „podobnost“- Pro textové řetězce → text musí obsahovat zadanou posloupnost jako podřetězec.
- Umožní používat metaznaky
*a?. - Podobné jako v SQL.
-
- Logické operátory
-
-and - ...
-
- Doporučený postup
- Nejprve filtruj, pak zpracovávej! (Podobně jako v SQL.)
- Optimalizace výkonu.
- Pro filtrování je lépe použít parametr
-Filter
- Ale ne všechny příkazy ho mají.
Místo:
Get-ChildItem | Where Name -like "*.xls"
Můžeme tedy psát:
Get-ChildItem -Filter "*.xls"
Nebo dokonce:
Get_ChildItem *.xls
Výstup do souboru
... | Out-File vystup.txt
Lze použít také operátor >, který znáte z příkazového řádku Linuxu a Windows:
ls *.txt | Select name, length | Out-File vystup.txt ls *.txt | Select name, length > vystup.txt
Pokud chcete obsah připojit ke stávajícímu obsahu souboru, lze použít operátor >> nebo přepínač -Append:
echo "Ahoj" | Out-File -Append vystup.txt echo "Ahoj" >> vystup.txt
Předávání dat
- Commandlety mají v nápovědě informaci, jestli přijímají vstup z pipeline.
Přijímání vstupu
- by value
- Přímo předáváme objekty.
- Typ objektů na výstupu prvního commandletu musí odpovídat typu objektu, který očekává na vstupu zpracovávající commandlet.
- by Property Name
- Přijímající commandlet očekává objekt, který má konkrétní vlastnost.
- Na samotném typu předávaného objektu nezáleží, důležité je, že má tuto konkrétní vlastnost.
Get-Process calc | dir
- Spusť předtím kalkulačku
- Zobrazí obsah adresáře, ve kterém je program, který realizuje proces Calc.
Předávání počítačů
- Počítače nelze předávat jako objekty přímo.
- Lze použít
{...}
Get-ADComputers -Filter * | Get-WMIObjects -class Win32_bios -ComputerName {$_.Name}
- Mnoho příkazů umí také
-
-ComputerName
Get-WMIObjects -class Win32_bios -ComputerName (Get-ADComputers -Filter *).Name
- Lze kombinovat se závorkou a
-ExpandProperty
Get-WMIObjects -class Win32_bios -ComputerName (Get-ADComputers -Filter * | Select -ExpandProperty name)