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ť taktoReplace(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ť taktoReplace(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
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.