Powershell scripts (komme i gang)
Forrige Powershell post viste kort hvordan man kan bruke powershell som nettopp shell . Neste trinn er å scripte i powershell. Ettersom alle .Net klassene er tilgjenglig og alle resultater "out-of-the-box" er objekter er det et kraftig og enkelt språk å scripte i. Under ser du et eksempel som gjør forholdsvis enkelt scripting for å sjekke maskinens Bitlocker Status.
$w2 = get-wmiobject -namespace "root/cimv2/Security/MicrosoftVolumeEncryption" -class Win32_EncryptableVolume
foreach ($i in $w2) {
write-host $i.DriveLetter $i.GetProtectionStatus().ProtectionStatus
}
Scriptet henter et wmi objekt som inneholder status om Bitlocker på hvert volume. Foreach løkken går så gjennom disse objektene og henter ut status på hvert volume. Legg merke til at det benyttes en miks av kommandoer som er innebygget i shellet (get-wmiobject) og .Net objekter og deres tilhørende properties i dette tilfellet. ($i.DriveLetter)
Jeg skal ikke begi meg inn på å lage en full oppstarts guide til powershell scripts, dette finnes allerede, men for mange trengs det antagelig ikke mer enn en liten intro og noen eksempler for å komme i gang.
Som i mange andre scriptspråk starter variabler med $ tegn. Variable kan deklareres som alle mulige .Net typer.
[int32]$foo
[System.Management.ManagementObject]$bar
Funksjoner deklareres med følgende syntaks:
function binToYN ([int32] $in) {
}
Programflyt håndteres på samme måte som i de fleste andre språk, med nesten samme syntaks.
if ($in -gt 0) {
return "YES"
}
else {
return "NO"
}
Standard syntaks for if/else. En annen mulighet er å bruke en switch.
switch ($type) {
1 {$r = get-eventlog -log system -newest 100 | where-object {$_.Eventid -eq $query}; break}
2 {$r = get-eventlog -log system -newest 100 | where-object {$_.Message -contains $query}; break}
3 {$r = get-eventlog -log system -newest 100 | where-object {$_.Source -contains $query}; break}
}
Her benyttes en switch for å utføre ulike operasjoner avhengig av verdien i $type. Videre benyttes funksjonen get-eventlog for å hente ut de 100 nyeste elementene i system loggen. Denne informasjon blir så pipa gjennom funksjonen where-object og her sammenlignes ulike elementer av loggobjektene med et søkekriterie kalt $query.
For å sammenligne er det et sett med ulike "operators", -eq og -contains er i bruk over, i tillegg er det:
-lt Less than
-le Less than or equal to
-gt Greater than
-ge Greater than or equal to
-eq Equal to
-ne Not Equal to
-band Binary AND
-bor Binary OR
-is Is of Type
-and AND (f.eks ($a -ge 6 -AND $a -le 13) )
-or OR (f.eks ($a –eq "B" –OR $a –eq "C") )
Ellers kan sammenligningsmetoder fra .Net objektene benyttes også i en del tilfeller.
$w.SpecVersion.startsWith("1.2")
$w er her et WMI objekt og SpecVersion er en String i dette objektet. .Net string objekter har en metode kalt startsWith() og her benyttes denne direkte for å sjekke om stringen starter med "1.2".
Noen spesielle funksjoner og variable kan det være greit å vite om og:
Get-help -- Funksjonen søker i hjelpefilene og kan benyttes med wildcard f.eks get-help *object*
write-host -- skriver ut tekst i console
read-host -- leser input fra bruker, fram til første \n\r
get-member -- viser hvilke metoder og variable som er tilgjenglig fra et objekt f.eks get-process | get-member
$_ -- "current object", ved loop eller lignende
$args -- input til et script fra kommandolinja
foreach($a in $args) {
write-host $a
}
Se neste Powershell posting i løpet av en dag eller to for en gjennomgang av to mindre powershell scripts: søke i eventlog og hente en webside for å vise headers.