PS C:\GF2> .\kursus.ps1PowerShell­scripting

Fra enkelte kommandoer til dine egne små programmer. Du lærer at skrive scripts, der husker ting, træffer valg og gentager arbejdet for dig.

$ variabler [int] typer if valg switch sortering @() arrays foreach løkker
Windows PowerShell
Kapitel 0

Hvad kan et script?

Før vi lærer reglerne, så se hvad de bliver brugt til. Her er tre små scripts, som en IT-supporter kunne skrive på fem minutter. Tryk på knapperne og se dem arbejde.

30 elevmapper på et øjeblik

En ny klasse starter. Hver elev skal have sin egen mappe på serveren. I hånden er det 30 gange højreklik, "Ny mappe", skriv navn. Scriptet gør det i én bevægelse.

# Lav en mappe til hver elev
foreach ($nr in 1..30) {
    New-Item -ItemType Directory -Path "C:\Klasse\Elev$nr"
}
løkkevariabel
I hånden: ca. 0 sekScriptet: 0,0 sek

Omdøb feriebillederne

Kameraet kalder billederne noget i stil med IMG_4821.jpg. Scriptet går billederne igennem ét ad gangen og giver dem pæne navne med et løbenummer, der tælles op for hvert billede.

$nr = 1
foreach ($fil in Get-ChildItem "*.jpg") {
    Rename-Item $fil "Mallorca_$nr.jpg"
    $nr++
}
variabelløkke
$nr = 1

    Diskplads-vagten

    Scriptet kigger på, hvor meget plads der er tilbage, og vælger selv hvilken besked der skal vises. Træk i skyderen og se, hvilken del af koden der bliver brugt.

    
          
    variabelif / else
    brugtledig

    I et rigtigt script ville tallet komme fra Windows selv. Her styrer du det med skyderen.

    Det fælles for alle tre

    Ingen af scriptene er svære. De bruger de samme få byggeklodser igen og igen: en variabel der husker noget, en løkke der gentager, og et valg der afgør hvad der skal ske. Kommandoerne som New-Item og Rename-Item kaldes cmdlets. Dem skal du ikke lære udenad i dette kursus. Vi koncentrerer os om byggeklodserne omkring dem, for de er ens uanset hvilke kommandoer du senere bruger.

    Efter kurset kan du skrive dine egne små scripts med variabler, typer, if, switch, arrays og løkker. I hvert kapitel er der en simulator, hvor du kan køre koden linje for linje direkte i browseren.

    Kapitel 1

    Dit første script

    Et script er bare en tekstfil med kommandoer, som PowerShell udfører én ad gangen, oppefra og ned.

    Tænk på en opskrift. Når du står i køkkenet, kan du råbe ét trin ad gangen: "Tænd ovnen!", "Pisk æggene!". Det svarer til at skrive kommandoer direkte i PowerShell-vinduet.

    En opskrift skriver alle trinene ned på forhånd, i den rigtige rækkefølge. Så kan den bruges igen og igen, og af andre. Det er et script.

    Sådan laver du et script

    1. Åbn Visual Studio Code (med PowerShell-udvidelsen) eller PowerShell ISE, som følger med Windows.
    2. Skriv dine kommandoer, én pr. linje.
    3. Gem filen med endelsen .ps1, fx hej.ps1. Endelsen fortæller Windows at det er et PowerShell-script.
    4. Kør scriptet med F5 i editoren, eller skriv .\hej.ps1 i PowerShell-vinduet, når du står i samme mappe.

    Får du en rød fejl om "running scripts is disabled"? Windows blokerer scripts som standard. Kør denne linje én gang i PowerShell, så må dine egne scripts køre:

    Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

    Skriv noget på skærmen

    Write-Host skriver tekst i vinduet. Tekst skal stå i anførselstegn. Alt efter et # er en kommentar: en note til mennesker, som PowerShell springer over.

    Prøv simulatoren nedenfor. Tryk Trin flere gange og se den orange markering gå oppefra og ned. Markeringen viser den linje, der bliver udført ved næste tryk.

    Du kan rette i koden. Prøv at skrive dit eget navn, eller byt om på to linjer og se rækkefølgen ændre sig. Kør kører hele scriptet på én gang, Afspil kører det langsomt.

    Kapitel 2

    Variabler

    En variabel er et navn, som scriptet kan gemme en værdi under og hente den frem igen senere.

    Tænk på en flyttekasse med en etiket. Etiketten er variablens navn, og det du lægger i kassen er værdien. Dollartegnet $ betyder "det her er en kasse".

    Lægger du noget nyt i en kasse, ryger det gamle ud. En kasse kan kun indeholde én ting ad gangen.

    Kasse-reolen

    Programmet til venstre bliver udført én linje ad gangen. Tryk på knappen og hold øje med kasserne.

    Tryk "Udfør næste linje" for at starte.

    Reglerne for navne

    RegelGodtSkidt
    Starter altid med $$alderalder
    Ingen mellemrum. Brug store bogstaver eller _ til at dele ord$antalElever$antal elever
    Beskriv hvad der er i kassen$fornavn$x, $ting2
    Store og små bogstaver er ligegyldige$Navn og $navn er den samme kasse

    Variabler inde i tekst

    Skriver du en variabel inde i dobbelte anførselstegn, sætter PowerShell værdien ind. Med enkelte anførselstegn bliver teksten stående præcis som den er skrevet.

    Læg mærke til $point = $point + 5. Det ligner matematik, men det er en ordre: "tag det der ligger i kassen, læg 5 til, og læg resultatet tilbage i kassen". Det kan også skrives kortere som $point += 5. Det kommer lige herunder.

    Kortformer: ++, --, += og de andre

    Tit skal en variabel ændres ud fra det, den allerede indeholder: pointene tælles op, et liv trækkes fra, en vare kommer i kurven. Det sker så ofte, at PowerShell har kortformer til det. De gør præcis det samme som den lange form, du bare skal skrive mindre.

    Tænk på en tæller i hånden, som en dørmand bruger til at tælle gæster. Han skriver ikke et nyt tal ned hver gang. Han trykker bare på knappen, og tallet bliver én højere. Det er $gaester++.

    Bag kortformen sker det samme som før: tag værdien ud af kassen, regn, og læg den nye værdi tilbage.

    KortformBetyderSamme somHvis $x er 10, bliver den
    $x++Læg 1 til$x = $x + 111
    $x--Træk 1 fra$x = $x - 19
    $x += 5Læg 5 til$x = $x + 515
    $x -= 3Træk 3 fra$x = $x - 37
    $x *= 2Gang med 2$x = $x * 220
    $x /= 4Del med 4$x = $x / 42.5 (nu et kommatal!)
    $x %= 3Rest ved division med 3$x = $x % 31

    Tællepulten

    Vælg en variabel og tryk på en kortform. Pulten viser linjen, den lange form og værdien før og efter. Hold øje med typen, og prøv også kortformerne på tekst-variablen $navn. Nogle virker, andre giver fejl.

    Dit script indtil nu

    Prøv kortformerne i et script

    Følg med i variabelpanelet med Trin. Kortformerne virker også på tekst og arrays: += sætter tekst sammen og sætter en ny vogn på toget.

    Tre typiske fejl med kortformer

    $point + 5 ændrer ingenting. Den regner 15 ud og skriver det på skærmen, men uden = kommer resultatet aldrig tilbage i kassen.

    $point =+ 5 med tegnene byttet om giver ingen fejl. PowerShell læser det som $point = +5, så pointene bliver sat til 5 i stedet for at stige med 5.

    $navn++ virker kun på tal. Tekst kan ikke tælles op, så du får en fejl.

    Kapitel 3

    Typer

    En værdi har altid en type: er det tekst, et heltal, et kommatal eller sandt/falsk? Typen afgør, hvad PowerShell kan gøre med værdien.

    Tallet 5 på en lommeregner og "5" skrevet på en seddel. Lommeregneren kan regne med sit 5-tal. Sedlen kan du kun sætte sammen med andre sedler: to sedler med "5" ved siden af hinanden giver "55".

    I PowerShell er 5 et tal og "5" er tekst. De ser ens ud på skærmen, men opfører sig forskelligt.

    De typer du skal kende

    TypeHvad er detEksempler
    [string]Tekst. Står altid i anførselstegn."Mia", 'hej', "42"
    [int]Heltal (Int32). Kan være negativt.42, -7, 0
    [double]Kommatal. Bruger punktum, ikke komma!3.14, 0.5
    [bool]Sandt eller falsk. Kun to mulige værdier.$true, $false
    [array]En liste med flere værdier (kapitel 6).@(1, 2, 3)

    Du kan altid spørge en værdi om dens type med .GetType().Name. Prøv det i simulatoren længere nede.

    Venstre side bestemmer

    Når du bruger + på to værdier med forskellig type, kigger PowerShell på den venstre side og prøver at lave den højre om til samme type. Vælg to værdier og se hvad der sker.

    Venstre
    Højre
    +

    Lav en type om: casting

    Du kan selv bestemme typen ved at skrive den i firkantede parenteser foran værdien. Det hedder at caste. Skriver du typen foran variablen, når du laver den første gang, bliver den låst til den type fremover.

    Hvorfor typen er så vigtig

    For et menneske betyder "fem", "5" og 5 det samme. Computeren ser tre helt forskellige ting: et ord med bogstaverne f, e og m, et tegn der ligner et 5-tal, og et rigtigt tal den kan regne med. Den gætter aldrig, hvad du mente. Den gør det, typen siger.

    Når typen er forkert, kan der ske tre ting:

    Det virkerPowerShell kan lave værdien om, og du får det rigtige resultat. Nogle gange ved held.
    Rød fejlScriptet stopper og fortæller dig hvor. Irriterende, men nemt at finde og rette.
    Forkert uden fejlScriptet kører videre med et forkert resultat. Ingen opdager det. Det er den farligste slags.

    Tænk på en kasse i et supermarked, der lægger priserne sammen som tekst. Ved en vare til 7 kr. og en til 5 kr. står der "75 kr." på bonen. Kassen går ikke i stå. Den tager bare forkert betaling, igen og igen.

    Fejlgalleriet

    Hvert kort beskriver en lille situation: hvad du vil have scriptet til at gøre, og hvilket svar du forventer. Under det står den linje, der bliver kørt. Gæt, hvad der sker:

    • Virker Linjen giver præcis det svar, du forventede.
    • Rød fejl Scriptet stopper med en fejlmeddelelse.
    • Forkert uden fejl Scriptet kører videre, men svaret er et andet end det, du forventede.

    Brug reglen venstre side bestemmer, men pas på: nogle af kortene er lumske. Når du har gættet, vender kortet og viser, hvad der skete, hvorfor, og hvordan du retter det.

    0 af 10 gættet rigtigt

    Samme tekst, fire opførsler. Kig på "10" i galleriet. Med - og / opfører den sig som et tal, fordi tekst ikke kan trækkes fra eller deles. Med + og * opfører den sig som tekst. Med -gt bliver den sammenlignet som et ord i en ordbog. Du kan ikke regne med held. Sørg for, at typen er rigtig fra starten.

    Read-Host giver altid tekst

    Alt hvad brugeren skriver med Read-Host, kommer ind som [string]. Også når der bliver skrevet et tal. Det er som en blanket på papir: der står "9" med blæk, men blækket er ikke et tal, før nogen læser det som et.

    Kør scriptet herunder og skriv 9, når du bliver spurgt. Læs outputtet grundigt: der er to fejl, og ingen af dem er røde.

    1

    "Næste år er du 91". $alder er teksten "9", og tekst står til venstre. Derfor bliver 1 sat bagpå som tekst i stedet for at blive lagt til.

    2

    En 9-årig får voksenbillet. Når venstre side er tekst, sammenligner -ge som i en ordbog, tegn for tegn. "9" kommer efter "1" i ordbogen, så "9" regnes for større end "18".

    Løsningen er én lille ændring: sæt [int] foran variablen, så teksten bliver lavet om til et tal med det samme. Kør igen med 9, og prøv derefter at skrive fem.

    Skriver brugeren "fem", stopper scriptet med en rød fejl i første linje. Det er faktisk det, du vil have. En tydelig fejl lige der, hvor problemet opstår, er meget bedre end et forkert svar længere nede i scriptet.

    Tommelfingerregler for typer

    1. Alt fra Read-Host er tekst. Cast det med [int] eller [double] med det samme.
    2. Skriv tal uden anførselstegn. $pris = 5, ikke $pris = "5".
    3. Lås variabler, der skal være tal. [int]$antal = 0 kan aldrig blive til tekst ved et uheld.
    4. I tvivl? Spørg om typen med .GetType().Name.
    5. En rød fejl er din ven. Et forkert resultat uden fejl er fjenden.

    Spil: Typesortering

    Hvilken type har værdien? Tryk på den rigtige kasse. Kig godt efter anførselstegn og punktummer.

    Kapitel 4

    if, elseif og else

    Med if kan scriptet træffe et valg: gør én ting, hvis noget er sandt, og noget andet hvis det ikke er.

    Tænk på et vejkryds. Du kommer til krydset og kigger på skiltet: "Er det over 25 grader?" Svaret afgør, hvilken vej du kører. Du kører kun ad én af vejene.

    Betingelsen står i parentes ( ), og det der skal ske, står i krøllede parenteser { }.

    Hvad skal jeg have på?

    Træk i temperaturen. Se hvilken vej scriptet tager gennem krydsene, og hvilken linje i koden der bliver brugt. PowerShell tester betingelserne oppefra og stopper ved den første, der er sand.

    18°
    
          

    Prøv præcis 25 og præcis 10. Hvorfor får du det resultat du gør?

    Sammenligninger

    PowerShell sammenligner med små ord med bindestreg foran, ikke med tegn som > og =.

    OperatorBetyderEksempel der er sandt
    -eqer lig med (equal)5 -eq 5
    -neer ikke lig med (not equal)5 -ne 3
    -gtstørre end (greater than)7 -gt 3
    -ltmindre end (less than)3 -lt 7
    -gestørre end eller lig med5 -ge 5
    -lemindre end eller lig med4 -le 5
    -andbegge skal være sande(5 -gt 1) -and (2 -lt 3)
    -ormindst én skal være sand(5 -gt 9) -or (2 -lt 3)
    -notvender sandt og falsk om-not $false

    Hvorfor ikke bare >? I PowerShell betyder > "send output til en fil". Skriver du if ($x > 5), laver PowerShell i stedet en fil ved navn 5. Og et enkelt = betyder altid "gem i variabel". Simulatoren her giver dig en fejl, så du opdager det.

    Tekst sammenlignes uden at se på store og små bogstaver: "Mia" -eq "MIA" er sandt.

    Prøv selv

    Scriptet spørger om din alder. Read-Host giver altid tekst tilbage, så vi låser variablen til [int], før vi sammenligner med tal.

    Kapitel 5

    switch

    Når én værdi skal sammenlignes med mange muligheder, bliver en lang kæde af elseif hurtigt rodet. Så bruger man switch.

    Tænk på sorteringsbåndet på et posthus. Pakken kører forbi en række sluser, der hver har et postnummer. Ved den sluse hvor nummeret passer, falder pakken ned. Passer ingen, havner den i returkassen.

    I en switch er pakken den værdi du tester, sluserne er dine cases, og returkassen hedder default.

    Karaktermaskinen

    Vælg en karakter og send den ud på båndet.

    $karakter =
    ?
    
          

    Samme program, to måder

    if ($dag -eq 1) { "Mandag" }
    elseif ($dag -eq 2) { "Tirsdag" }
    elseif ($dag -eq 3) { "Onsdag" }
    else { "Ukendt dag" }
    switch ($dag) {
        1 { "Mandag" }
        2 { "Tirsdag" }
        3 { "Onsdag" }
        default { "Ukendt dag" }
    }

    De gør præcis det samme. switch-udgaven er lettere at læse, fordi $dag kun står ét sted.

    Cases med en betingelse

    En case kan også være en betingelse i krøllede parenteser. Inde i den hedder værdien $_ (læs: "den nuværende værdi").

    Pas på: switch stopper ikke af sig selv ved den første case, der passer. Den tester dem alle, og hver case der passer bliver udført. Skal den stoppe, skriver du break. Kør scriptet nedenfor, og prøv derefter at fjerne break fra de tre første cases.

    Kapitel 6

    Arrays

    En variabel kan kun rumme én ting. Et array er en variabel, der rummer en hel liste af ting i en bestemt rækkefølge.

    Tænk på et tog. Hele toget har ét navn, fx $frugt, og hver vogn har et nummer. Nummeret kaldes et indeks, og det skrives i firkantede parenteser: $frugt[1].

    Det vigtigste at huske: den første vogn har nummer 0, ikke 1.

    Togstationen

    Prøv knapperne. Under toget kan du se præcis hvilken PowerShell-linje der blev kørt, og hvad den gav.

    $frugt = @("æble", "banan", "citron")

    Negative indeks tæller bagfra: $frugt[-1] er altid den sidste vogn. Prøv at læse et indeks der ikke findes, fx 10. Du får ingen fejl, bare ingenting ($null). Men prøver du at skifte indholdet i en vogn der ikke findes, får du en fejl.

    Opskriften på arrays

    KodeHvad sker der
    $tal = @(4, 8, 15)Lav et array med tre tal
    $tom = @()Lav et tomt array
    $tal[0]Den første værdi (4)
    $tal[-1]Den sidste værdi (15)
    $tal.CountAntal værdier (3)
    $tal += 16Tilføj 16 bagerst
    $tal[1] = 99Skift værdien på plads 1
    $tal -contains 8True hvis 8 er i listen
    1..5Et array med tallene 1 til 5
    Kapitel 7

    Løkker

    En løkke gentager en blok kode. Det er her scripts for alvor sparer dig for arbejde: det er lige så let at gøre noget 3 gange som 3000 gange.

    Tænk på en løbebane. Træneren siger "løb 4 omgange". Du løber den samme rute igen og igen, og tæller omgangene. Når du har løbet 4, stopper du.

    Hver omgang hedder en iteration. Koden i { } er ruten, og betingelsen er det, der afgør om du skal løbe en omgang mere.

    Fire slags løkker

    foreach

    For hver ting i en liste. Den mest brugte i PowerShell.

    for

    Tæl fra et tal til et andet med en tæller.

    while

    Gentag så længe noget er sandt. Tjekker før hver omgang.

    do ... until

    Kør mindst én gang, og gentag indtil noget bliver sandt.

    Vælg en løkke og tryk Trin eller Afspil. Følg med i variablerne og tæl omgangene nederst.

    foreach ($elev in $elever) betyder: tag den første elev og læg den i $elev, kør blokken, tag så den næste, og så videre, til listen er tom. Du bestemmer selv navnet på $elev.

    Den uendelige løkke

    Den klassiske fejl: løkken ændrer aldrig det, betingelsen tjekker. Scriptet nedenfor skulle skrive tallene 1 til 5, men der mangler en linje. Kør det, se simulatoren stoppe det, og ret fejlen.

    I et rigtigt PowerShell-vindue stopper du et script der hænger med Ctrl + C.

    break og continue

    break stopper løkken helt. continue springer resten af den nuværende omgang over og går videre til den næste.

    % betyder "rest ved division". 7 % 2 er 1, og 8 % 2 er 0. Derfor er $tal % 2 -eq 0 en måde at spørge "er tallet lige?"

    Kapitel 8

    Byg selv

    Nu skriver du selv. Hver opgave har en simulator og en Tjek-knap, der kører dit script og sammenligner outputtet med det forventede. Nogle opgaver tester også med andre værdier, så du ikke kan snyde ved at skrive svaret direkte.

    Kapitel 9

    Opgavesamling

    20 opgaver i to sværhedsgrader. Tryk på en overskrift for at folde opgaven ud. Hver opgave har sin egen simulator, et hint og en løsning, som du først ser, når du selv folder dem ud.

    Niveau 1

    Grundlæggende. Én ting ad gangen: en variabel, et if, en løkke. Start her.

    Niveau 2

    Udfordring. Flere byggeklodser i samme script, fx en løkke med et if indeni. Tænk først, skriv bagefter.

    0 af 20 løst

    Sådan bliver du tjekket. Tjek-knappen kører dit script og sammenligner outputtet med det forventede. I opgaver med en startværdi, fx $alder = 17, bliver dit script også kørt med andre værdier. Det skal altså virke generelt og ikke kun for det ene tal.

    Niveau 1 Grundlæggende

    Niveau 2 Udfordring

    Kapitel 10

    Afsluttende test

    14 spørgsmål om alt fra kurset. Mange af dem viser et script, hvor du skal forudsige, hvad det skriver. Du får forklaring efter hvert svar.

    Kapitel 11

    Snydeark

    Alt det vigtigste på én side. Brug det, når du skriver dine egne scripts.

    Variabler

    $navn = "Mia"
    $point = 10
    $point += 5          # nu 15
    $point++             # læg 1 til
    $liv--               # træk 1 fra
    $point *= 2          # også -=  /=  %=
    "Hej $navn"          # sætter værdien ind
    'Hej $navn'          # skriver det som det står
    "Sum: $($point * 2)" # regnestykke i tekst

    Typer

    "tekst"    # [string]
    42         # [int]
    3.14       # [double]
    $true      # [bool]
    [int]"42"  # cast tekst til tal
    [int]$alder = 17   # låst til heltal
    $x.GetType().Name  # spørg om typen
    [int]$t = Read-Host "Tal"  # Read-Host giver tekst!

    if

    if ($x -gt 10) {
        "stor"
    } elseif ($x -eq 10) {
        "præcis 10"
    } else {
        "lille"
    }
    # -eq -ne -gt -lt -ge -le
    # -and -or -not

    switch

    switch ($dag) {
        1 { "Mandag" }
        2 { "Tirsdag" }
        { $_ -gt 5 } { "Weekend"; break }
        default { "Ukendt" }
    }

    Arrays

    $a = @("x", "y", "z")
    $a[0]        # første
    $a[-1]       # sidste
    $a.Count     # antal
    $a += "w"    # tilføj
    $a -contains "y"
    1..10        # tallene 1 til 10

    Løkker

    foreach ($x in $a) { $x }
    
    for ($i = 0; $i -lt 5; $i++) { $i }
    
    while ($i -gt 0) { $i-- }
    
    do { $i++ } until ($i -ge 3)
    
    break      # stop løkken
    continue   # næste omgang

    Klar til mere? Næste skridt er at kombinere det du kan med rigtige cmdlets som Get-ChildItem, New-Item og Get-Service, præcis som i de tre eksempler i kapitel 0. Nu kan du læse og forstå dem. Vil du videre, så se det ekstra kapitel om cmdlets.

    Ekstra kapitel

    Cmdlets: PowerShells værktøjskasse

    Indtil nu har du lært selve sproget. Cmdlets er de færdige værktøjer, som sproget styrer: de henter filer, starter programmer, pinger og meget mere.

    Uden for GF2-stoffet

    Dette kapitel er ekstra og ikke en del af pensum på GF2. Du bliver ikke testet i det. Det er til dig, der er nysgerrig, eller som er færdig med opgaverne og vil se, hvad PowerShell bruges til ude i virkeligheden.

    Opgaverne her kører i rigtig PowerShell på din egen computer, ikke i simulatoren.

    Tænk på en værktøjskasse. Variabler, if og løkker er dine hænder: de bestemmer, hvad der skal ske og hvor mange gange. Cmdlets er værktøjerne i kassen: en skruetrækker, en hammer, et målebånd. Hvert værktøj kan én ting, og det kan det godt.

    Hænderne alene kan ikke skrue en skrue i, og en skruetrækker gør ingenting af sig selv. Det er kombinationen, der gør et script nyttigt.

    Navnet fortæller, hvad den gør

    Et cmdlet (udtales "command-let") er en indbygget kommando. Alle cmdlets er navngivet efter samme mønster: et verbum (hvad der skal ske), en bindestreg og et navneord (hvad det sker med). Derfor kan du ofte gætte navnet på en cmdlet, du aldrig har set før.

    Get-Process"Hent processerne"
    VerbumBetyderÆndrer noget?
    GetHent eller vis nogetNej, kun læser
    NewOpret noget nytJa
    SetÆndr noget, der findesJa
    RemoveSlet nogetJa, og kan ikke fortrydes
    Start / StopStart eller stop et program eller en tjenesteJa
    TestTjek om noget virker, svarer sandt eller falskNej

    Byg en cmdlet

    Vælg et verbum og et navneord. Nogle kombinationer findes, andre gør ikke. Læg mærke til, at alle Get-cmdlets er ufarlige at prøve.

    Verbum
    Navneord

    Parametre: indstillingerne på værktøjet

    En parameter er en indstilling, du giver cmdlet'en med. Den starter altid med en bindestreg. Tænk på knapperne på en vaskemaskine: selve maskinen er den samme, men du vælger temperatur og program.

    Get-ChildItem -Path C:\Windows -File      # kun filer, i C:\Windows
    Get-Random -Minimum 1 -Maximum 7           # et tal fra 1 til 6
    New-Item -ItemType Directory -Name Test    # opret mappen Test

    Du kender allerede parametre fra Write-Host "Hej" -ForegroundColor Green.

    Find selv: Get-Command og Get-Help

    Ingen kan huske alle cmdlets udenad. Det behøver du heller ikke, for PowerShell kan selv fortælle dig, hvad der findes, og hvordan det bruges.

    Get-Command -Noun Service          # alle cmdlets der arbejder med tjenester
    Get-Command -Verb Test             # alle cmdlets der tester noget
    Get-Help Get-ChildItem -Examples   # eksempler på brug

    Første gang du bruger Get-Help, spørger den måske om at hente hjælpeteksterne. Kør Update-Help som administrator, eller tilføj -Online for at læse hjælpen i browseren.

    Cmdlets giver objekter, ikke tekst

    Når Get-Process svarer, får du ikke bare tekst på skærmen. Du får objekter: én pakke pr. proces, og hver pakke har mærkater med navn, id, hukommelse og så videre. Mærkaterne hedder egenskaber, og du læser dem med et punktum, præcis som .Count og .Length.

    $p = Get-Process -Name explorer
    $p.Id            # procesnummeret
    $p.WorkingSet    # hukommelse i bytes

    Pipelinen: et samlebånd af cmdlets

    Tegnet | hedder en pipe. Det sender objekterne fra én cmdlet videre til den næste, ligesom et samlebånd på en fabrik: første station henter varerne, den næste frasorterer, den næste stiller dem i rækkefølge, og den sidste pakker kun det, der skal med.

    Byg din egen pipeline nedenfor. Vælg hvad hver station skal gøre, og tryk Kør pipelinen. Processerne er opfundne, men det er præcis sådan, det virker på din computer.

    Den samme pipeline på en rigtig computer kunne se sådan ud. Hukommelsen hedder dér WorkingSet og står i bytes i stedet for RAM i MB.

    Get-Process | Where-Object CPU -gt 50 | Sort-Object CPU -Descending | Select-Object -First 3

    Nyttige cmdlets

    CmdletGørEksempel
    Get-ChildItemViser filer og mapperGet-ChildItem C:\Temp -File
    Set-LocationSkifter mappe, som cdSet-Location $HOME
    New-ItemOpretter fil eller mappeNew-Item -ItemType File -Name a.txt
    Rename-ItemOmdøberRename-Item a.txt b.txt
    Remove-ItemSletterRemove-Item b.txt -WhatIf
    Get-Content / Set-ContentLæser og skriver tekstfilerGet-Content log.txt
    Get-ProcessViser kørende programmerGet-Process -Name chrome
    Get-ServiceViser Windows-tjenesterGet-Service -Name Spooler
    Test-ConnectionPinger en adresseTest-Connection 8.8.8.8 -Count 2
    Get-NetIPAddressViser IP-adresserGet-NetIPAddress -AddressFamily IPv4
    Where-ObjectFrasorterer i en pipeline... | Where-Object Status -eq Running
    Sort-Object / Select-ObjectSorterer og vælger... | Sort-Object Length | Select-Object -First 5

    Pas på med cmdlets der ændrer noget. Remove-Item sletter uden papirkurv. Tilføj -WhatIf første gang, så fortæller PowerShell hvad der ville ske, uden at gøre det. Lav øvelserne i en øvemappe, aldrig i Windows- eller systemmapper.

    Cmdlets og det, du kan fra GF2

    Her er det hele samlet: en variabel, en foreach-løkke, et if og tre cmdlets. Scriptet advarer om store filer i Downloads. Nu kan du læse hver linje.

    $filer = Get-ChildItem -Path "$HOME\Downloads" -File
    foreach ($fil in $filer) {
        $mb = [math]::Round($fil.Length / 1MB, 1)
        if ($mb -gt 100) {
            Write-Host "$($fil.Name) fylder $mb MB" -ForegroundColor Yellow
        }
    }

    10 opgaver med cmdlets

    Åbn PowerShell eller Visual Studio Code på din computer. Lav opgave 3 først, så du arbejder i en øvemappe. Sæt flueben, når du har fået en opgave til at virke.

    0 af 10 løst

    Ryd op bagefter. Når du er færdig, kan du slette øvemappen. Kør først med -WhatIf, så du kan se, hvad der bliver slettet:

    Set-Location $HOME
    Remove-Item "$HOME\PS-Oevelse" -Recurse -WhatIf

    Ser det rigtigt ud, kører du linjen igen uden -WhatIf.