NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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ě, nikoliv Set-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í, že Get 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říkazu Get-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ědu
  • SYNOPSIS - krátký popis příkazu
  • SYNTAX - syntaxe příkazu včetně argumentů. U každého argumentu je zobrazen požadovaný vstupní datový typ
  • DESCRIPTION - detailní popis příkazu
  • RELATED 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říklad Get-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 cestou
  • Select-Object FullName, Length, LastAccessTime, LastWriteTime, Mode - převezme rourou výstup každého Get-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 Length
  • Format-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 jako String[]).
  • 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ě hodnoty None 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 ValueFromRema­iningArguments. 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říkaz Set-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.


 

Předchozí článek
PowerShell pro začatečníky
Všechny články v sekci
PowerShell
Přeskočit článek
(nedoporučujeme)
PowerShell - Datové typy a práce s objekty
Článek pro vás napsal Vojtěch Kašný
Avatar
Uživatelské hodnocení:
110 hlasů
Aktivity