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"
}
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++
}
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.
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.
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
- Åbn Visual Studio Code (med PowerShell-udvidelsen) eller PowerShell ISE, som følger med Windows.
- Skriv dine kommandoer, én pr. linje.
- Gem filen med endelsen
.ps1, fxhej.ps1. Endelsen fortæller Windows at det er et PowerShell-script. - Kør scriptet med F5 i editoren, eller skriv
.\hej.ps1i 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.
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
| Regel | Godt | Skidt |
|---|---|---|
Starter altid med $ | $alder | alder |
| 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.
| Kortform | Betyder | Samme som | Hvis $x er 10, bliver den |
|---|---|---|---|
$x++ | Læg 1 til | $x = $x + 1 | 11 |
$x-- | Træk 1 fra | $x = $x - 1 | 9 |
$x += 5 | Læg 5 til | $x = $x + 5 | 15 |
$x -= 3 | Træk 3 fra | $x = $x - 3 | 7 |
$x *= 2 | Gang med 2 | $x = $x * 2 | 20 |
$x /= 4 | Del med 4 | $x = $x / 4 | 2.5 (nu et kommatal!) |
$x %= 3 | Rest ved division med 3 | $x = $x % 3 | 1 |
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.
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.
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
| Type | Hvad er det | Eksempler |
|---|---|---|
[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.
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:
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.
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.
"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.
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
- Alt fra
Read-Hoster tekst. Cast det med[int]eller[double]med det samme. - Skriv tal uden anførselstegn.
$pris = 5, ikke$pris = "5". - Lås variabler, der skal være tal.
[int]$antal = 0kan aldrig blive til tekst ved et uheld. - I tvivl? Spørg om typen med
.GetType().Name. - 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.
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.
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 =.
| Operator | Betyder | Eksempel der er sandt |
|---|---|---|
-eq | er lig med (equal) | 5 -eq 5 |
-ne | er ikke lig med (not equal) | 5 -ne 3 |
-gt | større end (greater than) | 7 -gt 3 |
-lt | mindre end (less than) | 3 -lt 7 |
-ge | større end eller lig med | 5 -ge 5 |
-le | mindre end eller lig med | 4 -le 5 |
-and | begge skal være sande | (5 -gt 1) -and (2 -lt 3) |
-or | mindst én skal være sand | (5 -gt 9) -or (2 -lt 3) |
-not | vender 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.
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.
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.
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
| Kode | Hvad 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.Count | Antal værdier (3) |
$tal += 16 | Tilføj 16 bagerst |
$tal[1] = 99 | Skift værdien på plads 1 |
$tal -contains 8 | True hvis 8 er i listen |
1..5 | Et array med tallene 1 til 5 |
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
foreachFor hver ting i en liste. Den mest brugte i PowerShell.
forTæl fra et tal til et andet med en tæller.
whileGentag så længe noget er sandt. Tjekker før hver omgang.
do ... untilKø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.
for har tre dele adskilt af semikolon: start ($i = 1), betingelse ($i -le 5) og trin ($i++, som betyder "læg 1 til"). Betingelsen tjekkes før hver omgang, trinnet køres efter hver omgang.
while tjekker betingelsen, før den løber en omgang. Er betingelsen falsk fra start, køres blokken aldrig. Du skal selv sørge for, at noget inde i løkken ændrer sig, ellers stopper den aldrig.
do ... until løber en omgang først og tjekker bagefter. Den er god, når noget skal ske mindst én gang, fx et terningkast eller et spørgsmål til brugeren.
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?"
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.
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.
Grundlæggende. Én ting ad gangen: en variabel, et if, en løkke. Start her.
Udfordring. Flere byggeklodser i samme script, fx en løkke med et if indeni. Tænk først, skriv bagefter.
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
Du har løst alle opgaverne i denne visning. Flot!
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.
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 -notswitch
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 10Lø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 omgangKlar 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.
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.
| Verbum | Betyder | Ændrer noget? |
|---|---|---|
Get | Hent eller vis noget | Nej, kun læser |
New | Opret noget nyt | Ja |
Set | Ændr noget, der findes | Ja |
Remove | Slet noget | Ja, og kan ikke fortrydes |
Start / Stop | Start eller stop et program eller en tjeneste | Ja |
Test | Tjek om noget virker, svarer sandt eller falsk | Nej |
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.
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
| Cmdlet | Gør | Eksempel |
|---|---|---|
Get-ChildItem | Viser filer og mapper | Get-ChildItem C:\Temp -File |
Set-Location | Skifter mappe, som cd | Set-Location $HOME |
New-Item | Opretter fil eller mappe | New-Item -ItemType File -Name a.txt |
Rename-Item | Omdøber | Rename-Item a.txt b.txt |
Remove-Item | Sletter | Remove-Item b.txt -WhatIf |
Get-Content / Set-Content | Læser og skriver tekstfiler | Get-Content log.txt |
Get-Process | Viser kørende programmer | Get-Process -Name chrome |
Get-Service | Viser Windows-tjenester | Get-Service -Name Spooler |
Test-Connection | Pinger en adresse | Test-Connection 8.8.8.8 -Count 2 |
Get-NetIPAddress | Viser IP-adresser | Get-NetIPAddress -AddressFamily IPv4 |
Where-Object | Frasorterer i en pipeline | ... | Where-Object Status -eq Running |
Sort-Object / Select-Object | Sorterer 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.
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.