IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

3. diel - PowerShell - Dátové typy a práce s objektmi

V predchádzajúcej lekcii, PowerShell - Syntax, príkazy a rúra (pipeline) , sme si ukázali syntax príkazov a použitia rúry.

V dnešnej lekcii kurze PowerShell frameworku sa zoznámime so základnými dátovými typmi a objekty PowerShellu.

Dátové typy PowerShellu

Dátový typ definuje v programovaní druh alebo význam hodnôt, ktorých môže nadobúdať premenná alebo konštanta.
zdroj: Wikipedia

Keďže je PowerShell postavený na .NET Frameworku (PowerShell 7 na .NET Core), využíva štandardné dátové typy. To je napríklad:

  • reťazec (string),
  • číslo (int32, int64)
  • alebo napríklad hash tabuľka (hash table).

PowerShell má však aj svoje vlastné typy ako napríklad PSCustom objekt (PSCustomObject), ktorý má v PowerShellu široké využitie a tomuto sa dnes budeme venovať najviac.

Vynútenie dátového typu sa vykonáva v PowerShellu pri priraďovaní hodnoty premennej pomocou [] zátvoriek a menom dátového typu, napríklad [string]$Var=10.

Všeobecne platí, že v PowerShellu netreba určovať dátový typ, pretože je priraďuje automaticky. Ak je potreba, PowerShell vie na pozadí vykonať automatickú konverziu dátového typu, ak je to však možné.

Každý PowerShell objekt má k dispozícii metódu .GetType(), ktorá zobrazí informácie o danom objekte a jeho dátový typ. Použitím príkazu Select-Object * zobrazíme všetky vlastnosti objektu.

Než začneme pracovať s objektom, mali by sme vedieť s akým typom údajov pracujeme. Každý dátový typ má totiž iné metódy a vlastnosti. Nemá teda zmysel na dátovom type [int] volať metódu .ToUpper(). Ak by sme to aj napriek tomu skúsili, dostaneme tento error:

Method invocation failed because [System.Int32] does not contain a method named 'toupper'.

Error nám hovorí, že metóda pre tento typ údajov neexistuje, prečo by taky existovala.

Prístup k metódam a vlastnostiam dátového typu v PowerShellu vykonávame pomocou tečkové notácie .. Zoberme si napríklad dátový typ textového reťazca (string). V minulých lekciách sme si predstavili príkaz Get-Member, ktorý teraz využijeme:

Windows PowerShell
$VarString="testovací řetězec"
$VarString | Get-Member

   TypeName: System.String

Name                 MemberType          Definition
----                 ----------          ----------
PadLeft              Method              string PadLeft(int totalWidth), string PadLeft(int totalWidth, char paddingChar)
PadRight             Method              string PadRight(int totalWidth), string PadRight(int totalWidth, char paddingChar)
Remove               Method              string Remove(int startIndex, int count), string Remove(int startIndex)
Replace              Method              string Replace(char oldChar, char newChar), string Replace(string oldValue, string newValue)
Substring            Method              string Substring(int startIndex), string Substring(int startIndex, int length)
ToBoolean            Method              bool IConvertible.ToBoolean(System.IFormatProvider provider)
Length               Property            int Length {get;}
...

Výstup z príkazu Get-Member vyššie bol skrátený z dôvodu veľkého počtu metód, výstup je teda oveľa dlhšia.

Na výstupe príkazu Get-Member vidíme:

  • dátový typ daného objektu: TypeName: System.String
  • pre každý member vidíme tri stĺpce: názov metódy alebo vlastnosti (Name), napríklad Replace

    typ (MemberType), v tomto prípade to bude metóda (Method) či vlastnosť (Property)

    definícia (Definition), ktorá určuje dátový typ výstup danej metódy. Napr. výstup v dátovom typu string, potom nasleduje názov metódy a ďalej jej argumenty. Metóda s argumentmi môže vyzerať takto Replace(char oldChar, char newChar).

  • názov metódy alebo vlastnosti (Name), napríklad Replace
  • typ (MemberType), v tomto prípade to bude metóda (Method) či vlastnosť (Property)
  • definícia (Definition), ktorá určuje dátový typ výstup danej metódy. Napr. výstup v dátovom typu string, potom nasleduje názov metódy a ďalej jej argumenty. Metóda s argumentmi môže vyzerať takto Replace(char oldChar, char newChar).

Metódu Replace() si predvedieme na nasledujúcom príklade:

$test='toto je test'
$test.Replace('toto','tohle')

tohle je test

Apostrofy ' sa používajú pre definíciu statického reťazca, napríklad $var1='toto je statický řetězec'.

Úvodzovky " sa používajú v prípade:

  • expandovanie premennej - $Name='Vojtěch'; $var2="jmenuji se $Name"
  • či čiastkového príkazu (subexpression) - $var3="jmenuji se $(Read-Host 'Jak se jmenuješ?')"
PSCustomObject

PSCustomObject je zvláštny dátový typ PowerShellu, ktorý je využívaný pre tvorbu vlastných objektov s vlastnými metódami a vlastnosťami. Dalo by sa povedať, že je to náhrada triedy.

Tvorba objektu

PSCustomObject možno v PowerShellu vytvoriť niekoľkými spôsobmi:

1. Pomocou príkazu Select-Object:

(Get-Service fax | Select-Object name,status).GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    PSCustomObject                           System.Object

2. Pomocou príkazu New-Object psobject:

$obj = New-Object psobject
$obj.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    PSCustomObject                           System.Object

3. Pomocou triedy [PSCustomObject] a jej metódy ::new():

$obj=[PSCustomObject]::new()

Metódy a vlastnosti tried nie sú volány tečkové notáciou ., Ale ::.

Pridanie Member do objektu

Do akéhokoľvek objektu typu PSCustomObject môžeme priradiť metódu ScriptMethod alebo vlastnosť NoteProperty pomocou príkazu Add-Member:

$obj | Add-Member -MemberType NoteProperty -Name 'Name' -Value 'Vojtěch'
$obj | Add-Member -MemberType ScriptMethod -Name NameToUpper -Value {$this.'Name'.ToUpper()}
$obj | Get-Member

   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
Name        NoteProperty string Name=Vojtěch
NameToUpper ScriptMethod System.Object NameToUpper();

Ak chceme aktualizovať či prepísať hodnotu už existujúceho member v objekte PSCustom, u príkazu Add-Member musíme použiť argument -Force, ktorý daný member odoberie a vytvorí ho znova s novými hodnotami. Bez argumentu -Force nám PowerShell vráti nasledujúce error:

$obj | Add-Member -MemberType NoteProperty -Name 'Name' -Value 'Vojtěch'

Add-Member : Cannot add a member with the name "Name" because a member with that name already exists. To overwrite the member anyway, add the
Force parameter to your command.
At line:2 char:8
+ $obj | Add-Member -MemberType NoteProperty -Name 'Name' -Value 'Vojtě ...
+        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (@{Name=Vojtěch}:PSObject) [Add-Member], InvalidOperationException
    + FullyQualifiedErrorId : MemberAlreadyExists,Microsoft.PowerShell.Commands.AddMemberCommand
Účelom WMI (W indows M anagement Aj nstrumentation) je definovať vlastnú sadu špecifikácií nezávislých na prostredie, ktoré umožňujú zdieľanie informácií o správe medzi aplikáciami pre správu.
zdroj: Wikipedia

Načo nám taký objekt môže slúžiť v reálnom živote si názorne predvedieme na kúsku kódu s využitím WMI:

# načtení WMI dat z třídy win32_OperatingSystem
$OperatingSystem = Get-WmiObject win32_OperatingSystem
# načtení WMI dat z třídy win32_ComputerSystem
$ComputerSystem = Get-WmiObject win32_ComputerSystem
$ComputerInfo = New-Object psobject
$ComputerInfo | Add-Member -MemberType NoteProperty -Name ComputerName -Value $ComputerSystem.Name
$ComputerInfo | Add-Member -MemberType NoteProperty -Name MemoryGB -Value ($ComputerSystem.TotalPhysicalMemory/1GB -as [int])
$ComputerInfo | Add-Member -MemberType NoteProperty -Name CpuCount -Value $ComputerSystem.NumberOfProcessors
$ComputerInfo | Add-Member -MemberType NoteProperty -Name OperatingSystem -Value $OperatingSystem.Caption
$ComputerInfo | Add-Member -MemberType NoteProperty -Name OperatingSystemInstallDate -Value ($OperatingSystem.ConvertToDateTime($OperatingSystem.InstallDate))
$ComputerInfo | Add-Member -MemberType NoteProperty -Name LastBootupTime -Value ($OperatingSystem.ConvertToDateTime($OperatingSystem.LastBootUpTime))
$ComputerInfo | Add-Member -MemberType ScriptMethod -Name GetUptime -Value {(Get-Date) - $OperatingSystem.ConvertToDateTime($OperatingSystem.LastBootUpTime)}

Vlastnosti nášho objektu teraz vyzerajú nasledovne:

$ComputerInfo

ComputerName               : PC046418
MemoryGB                   : 16
CpuCount                   : 1
OperatingSystem            : Microsoft Windows 10 Pro
OperatingSystemInstallDate : 8/29/2019 12:41:44 PM
LastBootupTime             : 8/11/2020 7:08:31 AM

Metóda GetUptime() nám vráti uptime počítača v dátovom type [TimeSpan]. Uptime je dynamicky aktualizovaný pri každom zavolaní metódy GetUptime():

$ComputerInfo.GetUptime()

Days              : 1
Hours             : 12
Minutes           : 21
Seconds           : 29
Milliseconds      : 482
Ticks             : 1308894828649
TotalDays         : 1.5149245701956
TotalHours        : 36.3581896846944
TotalMinutes      : 2181.49138108167
TotalSeconds      : 130889.4828649
TotalMilliseconds : 130889482.8649

Takýto kúsok kódu nám stačí napísať iba raz a stačí ho potom pridať napríklad do PowerShell profilu. Pri každom spustení PowerShellu potom už máme tento objekt pripravený v našej session.

Čo sú profily, ako sa s nimi pracuje a ako je vlastne uviesť do prevádzky si povieme inokedy:)

V ďalšej lekcii, PowerShell - Profily , sa zoznámime s PowerShell profilmi.


 

Predchádzajúci článok
PowerShell - Syntax, príkazy a rúra (pipeline)
Všetky články v sekcii
PowerShell
Preskočiť článok
(neodporúčame)
PowerShell - Profily
Článok pre vás napísal Vojtěch Kašný
Avatar
Užívateľské hodnotenie:
3 hlasov
Aktivity