PowerShell

This page contains PowerShell references I use when writing my scripts. They come very handy when you are learning basic PowerShell scripting. It is mainly taken from this norwegian article written by Jan Egil Ring.

Download PowerGUI to easy get control over your PowerShell Script

Rename all files in a folder oneliner:

Dir $home\ *.ps1 -Recurse |

Foreach-Object { Rename-Item $_.FullName ((Join-Path $_.DirectoryName
$_.BaseName) + “.old.ps1”) -whatif}

 

Conditional statements

If-statementet lar scriptet avgjøre om en handling skal utføres basert på evalueringen av angitte expression. Eksempel:

Selv om dette statementet lar seg skrive på èn linje er det vanlig å skrive det over flere linjer for bedre lesbarhet:

I dette tilfellet hvor $a er satt til verdien 10 vil statementet returnere “Verdien er større enn 5”.

Loop statements

En while-loop vil utføre angitte statement så lenge den angitte expression evalueres til $true. Eksempel:

Resultatet av denne while loop`en ser slik ut:

En do-while-loop er nesten det samme som en while-loop. Forskjellen er at angitte statement kjøres en gang før angitte expression evalueres. Forrige eksempel vil i en do-while-loop se slik ut:

En for-loop er en loop som lar scriptet gå gjennom en samling av objekter. Eksempel:

Det første elementet, $a=1, er den initielle verdien. Det andre elementet, $a –lt 6, er evalueringen det testes mot. Det tredje elementet, $a++, er en expression hvor verdien økes/minskes. Statementet utføres før det andre elementet evalueres til $true.

En foreach-loop er det mest brukte loop-statementet, og brukes for å utføre en handling på alle objekter i en samling av data. Eksempelet vi bruker her er et praktisk eksempel fra Active Directory hvor vi vil legge til alle brukere i domenet i en bestemt gruppe:

Vi definerer først samlingen av data (objekter) vi vi jobbe mot i variabelen $AllUsers.

Deretter definerer vi at foreach-loopen skal kjøres mot $user (dynamisk variabel som representerer hvert objekt i datasamlingen vi jobber mot) in $allusers.

For hvert objekt ($user i dette tilfellet) kjører vi Add-ADGroupMember for å legge til brukerne i angitt Active Directory gruppe.

Switch statement

Switch-statementet er det mest kraftfulle statementet i PowerShell. Basis funksjonaliteten er som i andre språk; Man kan velge en handling basert på en bestemt verdi (expression). I tillegg kan det behandle hele datasamlinger (collections) i motsetning til kun enkeltobjekter. Det støtter avansert pattern matching med –like og –match operatørene. I tillegg kan man kjøre hele filer gjennom switch-statementet, da typisk logg-filer etc. Store filer bør man være forsiktig med med tanke på ytelse og ressursbruk. Et enkelt eksempel:

Dette switch-statementet velger hva som skal returneres basert på verdien av variabelen $a.

Flow-control cmdlets

Selv om PowerShell i seg selv har støtte for flyt-kontroll gjennom de ulike statementene vi har sett på, eksisterer det også to cmdlets for dette.

ForEach-Object fungerer på mange måter som foreach statementet, men noen forskjeller er det. Ved bruk av ForEach-Object må man ikke assigne en dedikert variabel for hvert objekt i datasamlingen, man kan bruke den innebygde $_, som vil si “gjeldende objekt i pipeline”. En annen viktig forskjell er at foreach vil generere hele listen over objekter som skal behandles før noe utføres på disse objektene, mens ForEach-Object behandler ett og ett objekt. Når man jobber med store datamengder kan dette ha stor påvirkning på ytelsen. ForEach-Object har også støtte for flere såkalte script blocks; Begin (prosesseres før noen objekter prosesseres) , Process (prosesseres for hvert objekt) og End (prosesseres etter alle objekter er prosessert). Selv om det er flere nyanser mellom foreach og ForEach-Object har vi gått gjennom de viktigste. La oss se på et eksempel:

Her gjør vi det samme som i et tidligere eksempel, vi henter alle brukere i Active Directory, og for hvert objekt kjører vi en kommando som legger de til som medlem av en gruppe. I motsetning til foreach-varianten har vi ikke definert noen variabel for hvert objekt, men benytter i stedet $_.

Where-Object kan ses på som en enkel switch cmdlet. For hvert objekt i pipeline kjører den en scripblock, og dersom scriptblock`en evalueres til $true sendes objektet videre i pipeline. Et par eksempler:

Det første eksempelet henter alle brukere i Active Directory og disse pipes videre til Where-Object. Scriptblock`en i Where-Object sier at vi vil sende alle bruker-objekter som har Department-attributtet satt til “Salg”.

Det andre eksempelet henter alle servicer på maskinen og piper disse videre til Where-Object. Scriptblock`en sier at vi vil sende alle objekter som har Displayname er lik “Print Spooler”.

Break/Continue statements

I motsetning til andre språk har ikke PowerShell noe “goto:” statement, siden dette fort kan gjøre lange script veldig komplekse og vanskelig å sette seg inn i. I stedet har vi statementene break og continue, i tillegg til labeled loops. Med break og continue kan man påvirke hvordan en loop skal virke under gitte kriterier.

Eksempel på bruk av continue statement:

Denne foreach-løkken vil skrive alle tall mellom 1 og 10, unntatt 8, tilbake til konsollet. If-løkken indikerer at hvis det gjeldende tallet i løkken er 8, fortsetter loopen til neste objekt, og 8 skrives dermed ikke tilbake til konsollet. Hadde man i stedet brukt et break statement ville løkken avsluttet og verken 8, 9 eller 10 ville blitt returnert.

Eksempel på bruk av break statement:

Denne for-loopen kjører i utgangspunktet til tallet 50 er nådd, men ved hjelp av break-statementet i if-løkken som slår inn når tallet 10 er nådd vil scriptet bryte ut av loopen.

Eksempel på bruk av et labeled break statement:

Hvis $a har en verdi vil en ny while-løkke sjekke om $b har en verdi. Om $b har en verdi vil løkken kjøre for evig om man ikke har med et break statement. Når man i den indre løkken breaker til en label (den ytre løkka) vil scriptet gå ut av den indre loopen. Hadde man i den indre løkka kun skrevet break ville den kun breaket tilbake til while ($b) løkka, og den hadde kjørt for evig.

Hvis $b ikke har en verdi vil den ytre løkka kan avsluttes med kun break (uten label), siden den ikke er en del av en overordnet løkke.

Hvis $a ikke har en verdi vil ikke den ytre while-løkka kjøres, og dermed heller ikke den indre.

  Arithmetic operators
+ Addition, concatenation
– Subtraction
* Multiplication, string repetition
/ Division
% Modulus

Array operators
.. Range operator
, Array operator
[] Array operator

Assignment operators
= Assigns a value to a variable
+= Adds a value to a variable
-= Subtracts a value from a variable
*= Multiplies a variable by a value
/= Divides a variable by a value
%= Performs a modulus on a variable

Comparison operators
-eq Equal To
-lt Less Than
-gt Greater Than
-ge Greater Than or Eqaul To
-le Less Than or Equal To
-ne Not Equal To
-is Compare types (2 -is int)

Logical and bitwise operators
-and And
-or Or
-not Not
! Not
-band Bitwise And
-bor Bitwise Or
-bnot Bitwise Not

Redirection operators
>  Create
>>  Append
2> Redirect error output
2>> Redirect error output and append
2>&1 Redirect error to output

Unary operators
++ Increment a variable
— Decrement a variable
+ – Indicate that a number is positive
– – Indicate that a number is negative

Containment operators
-contain
-notcontain

Text, pattern and string  operators
-match Regex pattern matching
-notmatch Regex pattern matching
-like Globbing pattern matching
-notlike Globbing pattern matching
-replace Replace elements in a string
-join Join elements of a collection to a single string
-split Split strings into a collection of substrings
+ Concatenate two strings
* Repeat a string some number of times
-f Format a string

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s