Lekce 2 - PowerShell - Syntaxe, příkazy a roura (pipeline)
V předchozí lekci, PowerShell pro začatečníky, článku jsme se seznámili s frameworkem PowerShell obecně s pár jeho příkazy.
V dnešní lekci kurzu PowerShell frameworku se seznámíme s pár příkazy, se syntaxí příkazů a základní práci s rourou (pipeline).
PowerShell příkaz (cmdlet)
Příkaz (anglicky statement) je nejmenší samostatný prvek programu v imperativních programovacích jazycích vyjadřující nějakou činnost, která má být provedena. (zdroj Wikipedia)
Microsoft má velice kvalitně zpracovanou dokumentaci pro vývoj vlastních PowerShell funkcí, commandletů a modulů, včetně pravidel, která by měl správný vývojář dodržet.
Veškeré přidané odkazy na Microsoft dokumentaci odkazují na PowerShell verzi 5.1, která je stále nejčastěji používána.
Co se týká PowerShellu, příkaz má jasně daná pravidla, jak by měl vypadat (schválně uvádím, že by měl, protože PowerShell umožňuje naprostou volnost):
- příkaz se skládá ze dvou částí
- sloveso a
- podstatné jméno odděleno pomlčkou
(Verb-Noun), např.
Invoke-Command
- sloveso by mělo být použito ze seznamu povolených sloves (approved
verbs). Tento seznam získáme buď příkazem
Get-Verbnebo online v Microsoft dokumentaci - podstatné jméno je jednotného čísla
(singular), tedy např.
Set-Serviceje správně, nikolivSet-Services - vybrané sloveso musí odpovídat logice příkazu, tedy
sloveso
Getnení nikdy použito pro příkazy, které například manipulují s obsahem souboru na disku. Obecně platí, žeGetpříkazy jsou brány jako nedestruktivní a provádí pouze dotaz na daný objekt. - každý nativní příkaz má k dispozici nápovědu, kterou zobrazíme
příkazem
Get-Help, např.Get-Help Set-Content -Full(parameter-Fullje volitelný parameter příkazuGet-Helpa zobrazí kompletní nápovědu daného příkazu i s ukázkou (example))
Get příkazy jsou vhodné pro začátečníky,
kteří začínají experimentovat s PowerShellem. Příkazem
Get-Command -Verb Get nebo Get-Command Get-*
zobrazíme veškeré Get příkazy v dané aplikační
doméně.
Ukázka výstupu příkazu Get-Help Get-Date:
NAME
Get-Date
SYNOPSIS
Gets the current date and time.
SYNTAX
Get-Date [[-Date] <DateTime>] [-Day <Int32>] [-DisplayHint {Date | Time | DateTime}] [-Format <String>] [-Hour <Int32>] [-Millisecond <Int32>] [-Minute <Int32>] [-Month <Int32>] [-Second <Int32>] [-Year
<Int32>] [<CommonParameters>]
Get-Date [[-Date] <DateTime>] [-Day <Int32>] [-DisplayHint {Date | Time | DateTime}] [-Hour <Int32>] [-Millisecond <Int32>] [-Minute <Int32>] [-Month <Int32>] [-Second <Int32>] [-UFormat <String>] [-Year
<Int32>] [<CommonParameters>]
DESCRIPTION
The Get-Date cmdlet gets a DateTime object that represents the current date or a date that you specify. It can format the date and time in several Windows and UNIX formats. You can use Get-Date to
generate a date or time character string, and then send the string to other cmdlets or programs.
RELATED LINKS
Online Version: http://go.microsoft.com/fwlink/?LinkId=821781
New-TimeSpan
Set-Date
REMARKS
To see the examples, type: "get-help Get-Date -examples".
For more information, type: "get-help Get-Date -detailed".
For technical information, type: "get-help Get-Date -full".
For online help, type: "get-help Get-Date -online"
Pojďme se blíže podívat na výstup příkazu Get-Help:
NAME- tato vlastnost specifikuje název příkazu, pro který zobrazujeme nápověduSYNOPSIS- krátký popis příkazuSYNTAX- syntaxe příkazu včetně argumentů. U každého argumentu je zobrazen požadovaný vstupní datový typDESCRIPTION- detailní popis příkazuRELATED LINKS- další odkazy spojené s tímto příkazem. Online Version tag určuje online verzi nápovědy, kterou lze zobrazit parametrem-Online, napříkladGet-Help Get-Date -OnlineREMARKS- další hinty a ukázky jak pracovat s nápovědou pro daný příkaz
Zadáním příkazu Get v PowerShellu většinou dostaneme
specifikované vlastnosti objektu. To ale neznamená, že daný objekt nemá
více vlastností. Abychom zobrazili veškeré vlastnosti daného objektu,
použijeme příkaz Select-Object * za použití roury.
Funkcionalitu příkazu Select-Object si ještě více rozebereme
později.
Ukázka výstupu základních vlastností objektu, pomocí příkazu
Get-Item, který obecně vrací informace o daném objektu v
cestě. Celý příkaz je Get-Item C:\test\highlight.zip, soubor
musí existovat:
Directory: C:\test Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 7/30/2020 12:28 PM 266162 highlight.zip
Ukázka výstupu všech vlastností objektu pomocí sekvence příkazů
Get-Item C:\test\highlight.zip | Select-Object *:
PSPath : Microsoft.PowerShell.Core\FileSystem::C:\test\highlight.zip
PSParentPath : Microsoft.PowerShell.Core\FileSystem::C:\test
PSChildName : highlight.zip
PSDrive : C
PSProvider : Microsoft.PowerShell.Core\FileSystem
PSIsContainer : False
Mode : -a----
VersionInfo : File: C:\test\highlight.zip
InternalName:
OriginalFilename:
FileVersion:
FileDescription:
Product:
ProductVersion:
Debug: False
Patched: False
PreRelease: False
PrivateBuild: False
SpecialBuild: False
Language:
BaseName : highlight
Target : {}
LinkType :
Name : highlight.zip
Length : 266162
DirectoryName : C:\test
Directory : C:\test
IsReadOnly : False
Exists : True
FullName : C:\test\highlight.zip
Extension : .zip
CreationTime : 7/30/2020 12:28:20 PM
CreationTimeUtc : 7/30/2020 10:28:20 AM
LastAccessTime : 7/30/2020 12:28:21 PM
LastAccessTimeUtc : 7/30/2020 10:28:21 AM
LastWriteTime : 7/30/2020 12:28:21 PM
LastWriteTimeUtc : 7/30/2020 10:28:21 AM
Attributes : Archive
PowerShell a roura (pipeline)
Roura je v PowerShellu jedna z nejsilnějších věcí celého frameworku. Na rozdíl od klasických textových shellů, (například bash nebo Windows Command Line) umí PowerShell poslat rourou celé objekty, včetně všech vlastností a metod.
Podívejme se na tento ukázkový příklad příkazu:
'C:\test\highlight.zip','C:\test\output.txt' | Get-Item | Select-Object FullName, Length, LastAccessTime, LastWriteTime, Mode | Sort-Object Length -Descending | Format-List
Vrátí nám následující výstup:
FullName : C:\test\highlight.zip Length : 266162 LastAccessTime : 7/30/2020 12:28:21 PM LastWriteTime : 7/30/2020 12:28:21 PM Mode : -a---- FullName : C:\test\output.txt Length : 32 LastAccessTime : 7/30/2020 1:21:29 PM LastWriteTime : 7/30/2020 1:21:29 PM Mode : -a----
Nyní si celý příkaz popíšeme:
'C:\test\highlight.zip','C:\test\output.txt'- dva řetězce (stringy), které jsou předány jeden po druhém do roury|Get-Item- příkaz si postupně převezme oba řetězce a vykoná příkaz s danou cestouSelect-Object FullName, Length, LastAccessTime, LastWriteTime, Mode- převezme rourou výstup každéhoGet-Itempříkazu a vybere pouze dané vlastnosti objektu (Select-Object *vždy vrací všechny vlastnosti objektu, což může být někdy nežádoucí)Sort-Object Length -Descending- příkaz seřadí výsledek všech objektů předané rourou a to sestupně (-Descending) podle vlastnosti LengthFormat-List- příkaz zformátuje celý výsledek do listu (defaultní je tabulka)
Ne každý commandlet umí zpracovat vstup pomocí roury. To, který příkaz
a na jakém parametru umí přijmout vstup přes rouru, zjistíme pomocí
příkazu Get-Help s parametrem -Full v sekci
PARAMETERS, například
Get-Help Get-Service -Full. Podívejme se na parametr (neboli
argument) Name a jeho atributy:
-Name <String[]>
Specifies the service names of services to be retrieved. Wildcards are permitted. By default, this cmdlet gets all of the services on the computer.
Required? false
Position? 0
Default value None
Accept pipeline input? True (ByPropertyName, ByValue)
Accept wildcard characters? false
- Nejprve si můžeme všimnout, jaký datový typ argument
-Nameakceptuje, v tomto případě je to pole řetězců (string array definován jakoString[]). - Dále vidíme popis tohoto argumentu, po kterém následují atributy
argumentu:
Required?- určuje, zda je tento argument povinný.Position?- určuje pozici argumentu (PowerShell umí přijmout vstupní argumenty jak podle jména, tak i pozicionálně).Default value- definuje defaultní (výchozí) hodnotu argumentu. V případě hodnotyNoneje prázdná.Accept pipeline input?- určuje, zda daný argument podporuje vstup z roury:Falseznamená, že daný parametr neumí přijmout vstup z roury.Trueznamená, že daný parametr umí přijmout vstup z roury. V tomto případě zde může být uveden atribut ByPropertyName, ByValue nebo ValueFromRemainingArguments. Není neobvyklé že commandlet či funkce má více parametrů které umí přijmout vstup z roury.
Accept wildcard characters?určuje zda daný argument podporuje wildcardové masky, jako například*. Jako příklad může sloužit příkazSet-Itema jeho argument-Path
Pro dnešní lekci pro kurz PowerShell to bylo vše 
V další lekci, PowerShell - Datové typy a práce s objekty, si ukážeme práci s PowerShell profily.


