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-Verb
nebo online v Microsoft dokumentaci - podstatné jméno je jednotného čísla
(singular), tedy např.
Set-Service
je správně, nikolivSet-Services
- vybrané sloveso musí odpovídat logice příkazu, tedy
sloveso
Get
není nikdy použito pro příkazy, které například manipulují s obsahem souboru na disku. Obecně platí, žeGet
pří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-Full
je volitelný parameter příkazuGet-Help
a 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 -Online
REMARKS
- 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-Item
pří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
-Name
akceptuje, 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ě hodnotyNone
je prázdná.Accept pipeline input?
- určuje, zda daný argument podporuje vstup z roury:False
znamená, že daný parametr neumí přijmout vstup z roury.True
znamená, ž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-Item
a 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.