Kom igang med Powershell – del 2

Du finner del 1 her.

Bruk av moduler i Powershell

Den primære måten å utvide funksjonaliteten i Powershell 2.0 er gjennom bruk av moduler. En modul er en pakke som inneholder Powershell kommandoer, slik som cmdlets, funksjoner, variabler, alias og såkalte providers. Providers gjør det mulig å aksessere datakilder gjennom stasjonsalias.

Moduler lar utviklere og administratorer dele opp og organisere Powershell koden i gjenbrukbare, komplette pakker. Kode fra en modul utføres i sin egen kontekst, og affekterer ikke tilstanden utenfor modulen.

Der snapins må installeres (dll basert installasjon) og registreres i registry, kan moduler enkelt kun kopieres inn uten noen form for installasjon.

Fordi moduler ikke må installeres, kan man bruke disse uten å være administrator.

Du kan altså benytte både moduler og snapins for å legge til kommandoer i ditt Powershell miljø. Moduler kan legge til alle typer kommandoer, cmdlets, providers, funksjoner, variabler, aliase og stasjoner. Snapins kan kun legge til cmdlets og providers.

Hvis du ønsker å se hvor en cmdlet er definert, kan du utføre følgende kommando:

get-command <cmdlet-name> | format-list -property verb, noun, pssnapin, module

For eksempel, hvis du ønsker å se hvor Get-Process er definert:

get-command get-process | format-list -property verb, noun, pssnapin, module

Moduler kan lastes fra hvor som helst, men det er enklest å benytte erklærte modulområder. Ved å bruke erklærte modulområder er det lettere å oppdage modulene, samt at de kan aktiveres uten at hele stien til modulen må angis. Det er i utgangspunktet to erklærte områder hvor moduler kan ligge:

· %System%\WindowsPowershell\1.0\Modules ($PSHome\Modules)

· %Userprofile%\Documents\WindowsPowershell\Modules

Du kan sjekke hvilke stier som er erklærte modulområder på ditt system ved å kjøre følgende kommando:

$env:psmodulepath

image

Modulfilene kan kopieres til brukerens modulområde, eller til systemets modulområde. Man kan også laste moduler ved å eksplisitt angi banen til modulen.

For å aktivere modulen bruker man kommandoen Import-Module og modulens navn. Man kan få en oversikt over tilgjenglige moduler ved å bruke kommandoen Get-Module –ListAvailable.

Redirection

I alle kommandolinjer er redirection en sentral funksjon, hvor man styrer output dit man vil ha det. For eksempel ønsker du å lage deg etn oversikt over alle cmdlets som er tilgjengelig. Denne oversikten ønsker du å ha i ei fil.

Get-command > commandref.txt

Ved å erstatte > med >> legger du til teksten, hvis fila finnes fra før med innhold.

Senere vil du se at det også er flere måter å oppnå dette på, også for å styre output andre steder.

Hvis du ønsker å skrive ut alle kommandoene grupper etter subjektivet, så kan du kjøre følgende kommando:

Get-command | sort-object noun |format-table –group noun

Spesialtegn

Noen ganger har du behov for skrive ut tegn som egentlig ikke skrives ut synlig, slik som linjeskift, tabulator eller lage en lyd.

Tegn

Escape sekvens

Null

`0

Alert

`a

Backspace

`b

Form Feed

`f

Ny linje (Linjeskift)

`n

Carriage Return (Enter)

`r

Tab

`t

Vertical quote

`v

Prøv følgende kommando for å bygge din egen tre kolonners rapport.

[20] » write-host "Kolonne1 `t Kolonne2 `t Kolonne3 `nRekke1-1 `tRekke1-2 `tRekke1-3 `nRekke2-1 `tRekke2-2 `tRekke2-3"

Kolonne1 Kolonne2 Kolonne3

Rekke1-1 Rekke1-2 Rekke1-3

Rekke2-1 Rekke2-2 Rekke2-3

[21] » write-host `a`a`a`a

Scope

Funksjoner og variabler har en begrenset synlighet og levetid i Poweshell. Dette betyr at verdier vi setter eller funksjoner vi oppretter ikke nødvendigvis er tilgjengelig i hele systemet. Man kan se på scope i et foreldre-barn (parent-child) perspektiv, hvor det første og øverste leddet heter global. Childscopes kan aksessere verdier i et parentscope, men ikke motsatt. Scopet til det kjørende scriptet er navngitt script, og når vi kommer til variabler skal vi se litt nærmere på dette. Men jeg ønsker å presentere begrepet dot sourcing; når vi starter script fra PowerShell benytter vi ofte et punktum (dot) før scriptnavnet. Dette betyr at scriptet skal kjøre i samme scope som kommandolinja kjører i, og gir samme funksjonalitet som om du skulle skrevet alle kommandoene i kommandolinja direkte.

Funksjoner

Funksjoner er små rutiner med kildekode. Dette betyr kodelinjer satt sammen til å utføre en bestemt oppgave. Funksjoner har sin egen scope. Det betyr at variabler som deklareres og finnes i en funksjon kun er tilgjengelig til funksjonen. Hvis funksjonen kjører som en del av et script, har funksjonen adgang til scriptetes scope, fordi scriptet er funksjonens foreldre scope.

Eksempel på funksjon:

Function foo {write-host “bar”}

image

Pipelining

En av Powershells kraftigste fordeler er pipelining funksjonaliteten. Pipelining betyr å flytte data og objekter fra en kommando (cmdlet) til en annen.

Et eksempel mange kjenner seg igjen i fra cmd.exe verden er more

dir | more

Denne kommandolinjen tar resultatet fra dir kommandoen og ”piper” det til more.

Tradisjonelt pipes data mellom kommandoer i tekst format. Dette er endret med PowerShell, hvor data pipes som objekter. Dette er en meget sterk måte å håndtere data mellom objekter på, som gir flotte muligheter for avanserte script. Vi kommer til å bruke pipelining mye i resten av kurset.

Tegnet for pipe er |

Kjør følgende kommando:

Get-process | where { $_.handlecount –gt 400 } | format-list

Denne kommandoen henter en liste med kjørende prosesser ( get-process). Deretter så piper den resultatet inn i where . Fordi vi flytter objekter over til where kommandoen kan vi lese av attributter på objektet. Et process objekt har flere egenskaper, men vi leser av egenskapen handlecount. $_ er en standardangivelse for resultatet av foregående operasion, så med $_ mener vi resultatet fra foregående kommando. –gt står for større enn (greater than). Etter at vi har plukket ut alle processobjekter som har handlecount større enn 400, formaterer vi dette som en liste før vi skriver ut (format-list).

Tips:

Når man benytter where kan man også sette sammen flere uttrykk:

-and Logisk and

-or Logisk or

-bor Bitwise or

-band Bitwise and

-xor XOR operator

For å se en liste over alle egenskapene processene har som vi kan jobbe med, kjør følgende kommando:

get-process | get-member -membertype property

I lista vil du nå finnes egenskapen responding, som er satt til en boolsk egenskap. Vi kan nå liste ut alle prosesser som ikke svarer (not responding) med følgende kommando:

Get-process | where { $_.responding –eq 0 } | format-list

Merk at overstående kommando mest sannsynlig ikke returnerer noen treff i din test – den returnerer kun applikasjoner som henger!

Eller alle prosesser som svarer:

Get-process | where { $_.responding –eq 1 } | format-list

Vi kan også endre formateringen, og bestemme hvilke felt som skal være med I utdata på følgende mate:

get-process | where { $_.responding -eq 1 } | format-table ProcessName,Id,Responding

Vi kan også bygge videre på et tidligere eksempel hvor vi lister ut filer, og ønsker å formatere resultatet av dir kommandoen (en linje) :

Dir –exclude *.old,*.bak,*.tmp –recurse | select-object FullName,Length,LastWriteTime | format-table –auto

Denne kommandoen lister ut alle filer i mappen vi står i, samt undermapper. Den tar ikke med filer med endelsen old, bak eller tmp. For hver av filene skriver den ut fullt navn, størrelsen, og siste gang den ble skrevet til. Dette formateres i en tabell.

Format-Table skal vi se nærmere på seinere også ,men den har også mulighet for å bestemme hvilke felt som skal vises eller ikke. Fordelen med å bruke Select-Object er at vi kan sende utdataene andre steder enn til skjermen (for eksempel til fil) og kun få med de utvalgte feltene.

Hjelpesystemet

PowerShell har et kraftig hjelpesystem, som baseres på kommandoen get-help og get-pagedhelp. Det er også opprettet alias som help og man for Get-PagedHelp.

For å lage deg en oversikt over hvilke hjelpefiler som er tilgjengelig kan du kjøre kommandoen help *_*

Help *_*

Disse hjelpefilene begynner med about_ og omhandler emner du kan slå opp i hjelpesystemet.

Wildcards er også støttet i oppslagene, for eksempel kan du slå opp hjelp for logiske operatører med følgende kommando:

[56] Get-help about_logi*

Du kan hente fullstendig hjelp ved å benytte parameteren –full

Get-help new-item –full

De fleste av oss leter etter eksempler når vi prøver å benytte en kommando. Du kan hente kun eksemplene på følgende måte:

Get-help new-item -examples