Artikel top billede

(Foto: Computerworld)

Kom i gang med PowerShell-scripting - del 1

Det er fremtiden for Windows-scripting, stærkere end VBScript – men hvordan bruger du PowerShell?.

Af Redaktionen, Alt om Data

Denne artikel er oprindeligt bragt på Alt om Data. Computerworld overtog i november 2022 Alt om Data. Du kan læse mere om overtagelsen her.

Windows’ grafiske grænseflade er flot, men det kan være anstrengende at bruge den, navnlig når du udfører komplekse pc-vedligeholdelsesopgaver.

Det er grunden til, at superbrugere altid har været interesserede i Windows-scripting og har brugt forprogrammerede kommandoserier til hurtigt og nøjagtigt at automatisere stort set alle aspekter af computerhåndtering. Det kan virkelig spare megen tid og meget bøvl. Men hvilken form for scripting skal man bruge?

Bat-filer? De kan udføre imponerende ting, men de er ikke ligefrem raffinerede – kernekommandoerne og teknologierne har ikke ændret sig meget de seneste 20 år. VBScript? Det er bestemt stærkere, men dets integration med Windows er ringe, og hyppig rovdrift fra malware gør det til noget af en sikkerhedsrisiko.

PowerShell er anderledes. Det er fuldt opdateret med et væld af stærke og tidsbesparende funktioner. Men det accepterer også mange ældre batfil-agtige kommandoer, så man føler sig straks hjemme. Og det er lavet med tanke på sikkerhed.

Mens dos-prompten er ved at blive historie, placerer Microsoft tydeligvis PowerShell som fremtiden inden for Windows-scripting. Hvis du overhovedet er interesseret i pc-håndtering og automatisering, er tiden til at lære, hvordan det hele fungerer.

Kom i gang

PowerShell 2.0 følger med Windows 7 og har indgået i servicepacks til Windows XP, Vista og Server 2003/2008. Hvis du har en opdateret pc, bør du allerede have et eksemplar. Synlige tegn omfatter en ’WindowsSystem32WindowsPowerShell’-mappe og en tydelig PowerShell-indgang, når du klikker ’Start | Programmer | Tilbehør’. Hvis du har en XP- eller Vista-pc, der ikke er udstyret med PowerShell, er det bedst at downloade de seneste servicepacks.

Men hvis du af den ene eller anden grund ikke ønsker at gøre det (og det skal være en god grund, for de er essentielle), kan du også downloade PowerShell 2.0 som del af Windows Management Framework. Læs mere og find den rigtige version på Microsofts site (http://support.microsoft.com/kb/968929).

Når du er kørende, skal du blot klikke ’Start | Programmer | Windows PowerShell’ og derefter starte Windows PowerShell (højreklik på det og vælg ’Kør som administrator i Windows Vista og 7’).

Herfra afslører dit første kig ind i den fagre nye scriptingverden, at der er en påfaldende lighed med den gamle – hvid tekst, sort baggrund, en dos-agtig prompt, der viser din aktuelle mappe... det virker alt sammen meget bekendt.

Det er der naturligvis ikke noget i vejen med – det er faktisk en reel fordel. Du kan stadig skrive cd og trykke [Enter] for at skifte mapper, for eksempel (husk, at der skal være mellemrum efter cd). Hvis du skriver dir, får du stadig en liste over den aktuelle mappes indhold (selv om dette er et sted, hvor outputtet ser lidt anderledes ud end de sædvanlige kommandolinjeresultater).

Det er også ret fikst, at du kan køre eksekverbare kommandolinjeværktøjer, ligesom du altid har gjort. Du kan bruge netstat til at se åbne netforbindelser, ipconfig til at afsløre din ip-adresse eller net til at stoppe og starte Windowstjenester – de virker alle, som du forventer.

Derfor kan du blive ved med at bruge de fleste af dine fortrukne dos-trick med PowerShell – det er slet ikke noget problem – og du behøver kun at lære de nye teknikker, efterhånden som du får brug for dem.

Cmdlets

PowerShell er en meget gennemført scripting-teknologi, der understøtter stort set alt, hvad man kan vente af et programmeringssprog: Variabler, arrays, betinget test, looping, læsning og skrivning af filer, fuld adgang til registreringsdatabasen og meget mere.

Men det behøver du ikke at bekymre dig om i første omgang, for du kan lave meget i PowerShell ved simpelthen at fokusere på dets indbyggede kommandoer, der kaldes cmdlets. For eksempel opregner ’get-process’-cmdletten alle kørende processer. Skriv get-process på PowerShells kommandolinje for at se, hvordan det virker.

Du kan også skrive get-service for at få en liste over dine Windowstjenester, og senere forklarer vi, hvordan get-eventlog kan læse logbegivenheder og fremhæve de sager, du har brug for.

Der er naturligvis også PowerShell-kommandoer til at iværksætte handlinger. Stop-process lukker en proces ned, stop-service stopper en kørende tjeneste, og restart-service starter den igen. Der er endda en fiks cmdlet, der fortæller dig om andre cmdlets: get-command.

Og hvis du søger hjælp til en bestemt cmdlet, kan get-help fremskaffe den. Skriv for eksempel get-help for at se, hvordan man bruger ’stop-service’.

Alt dette er meget nyttigt, men det er også ret dos-agtigt. Det ændrer sig imidlertid, når vi begynder at bruge flere cmdlets sammen.

Kombination af cmdlets

Med cmdletten get-process får du sandsynligvis vist flere oplysninger, end du har brug for, men den er nem at skræddersy. Send dens output til cmdletten format-table med rørsymbolet – ligesom i dos, hvor det som regel er [Shift] og tasten lige til højre for [Venstre Shift] – så kan du vælge nøjagtig, hvad du vil se. Skriv get-process | format-table -property id, name, cpu, handles, for eksempel, for kun at se processens id, navn, cpu-brug og handles.

Det er godt. Men hvad med at tilføje noget intelligens? Du vil bemærke, at mange processer ikke bliver registreret som brugende cpu-tid overhovedet. Hvis du ville ignorere dem, kunne du skrive en kommando som den følgende for at få get-process til at opregne hver eneste proces og sende den videre til cmdletten where-object:

get-process | where-object
{$_.cpu -gt 1} | format-table
-property id, name, cpu, handles

’Where-object’ ser nu på hver eneste proces, undersøger dens cpu-værdi (det er »$_.«, der angiver en variabel, mens »cpu« fortæller PowerShell, hvad det er for en), og hvis tallet er større end 1 (»-gt 1«), sendes den til format table. Processer med ubetydelig eller ingen cpu-brug bliver skjult, og derfor får vi en mere håndterlig liste over krævende programmer.

Du kan også bruge dette:

get-process | where-object
{$_.handles -gt 150} |
format-table iproperty id, name,
cpu, handles

Den første bør kun vise processer, der bruger mere end 150 handles (»-gt« = greater than), for eksempel. En handle er en Windowsressource af den ene eller anden art: Grafik, en hukommelsesblok, en fil, en nøgle i registreringsdatabasen, og det er ofte værd at lægge mærke til et stort forbrug af handles.

Men hvis handles er så vigtige, hvorfor så ikke sortere dem til at begynde med? Det er nemt – tilføj blot endnu en cmdlet:

get-proces | where-object {$_.
Handles -gt 150} | sort-object
handles | format-table -property id,
name, cpu, handles

Hvis du inddrager »sort-object«, får du sorteret efter den procesvariabel, som vi definerer, så det kunne også være »name« eller »cpu« i dette eksempel. Prøv dem, eksperimenter, prøv forskellige ting – det hjælper dig alt sammen med at finde ud af, hvordan PowerShell virker. Vi uddyber mere i næste afsnit.

Prøv noget avanceret formatering

De fleste PowerShell-cmdlets giver resultater, der kun rummer meget enkel formatering, men det kan man nemt gøre noget ved. ’Get-service’ viser for eksempel tjenestestatus, kort navn og vist navn – en rækkefølge, der ikke giver megen mening for os.

Skriv Get-Service | format-table -property DisplayName, status for at ændre visningsrækkefølgen og droppe det (normalt) unødvendige korte navn. Meget bedre.

Hvis du vil fremhæve tjenester, der kører, skal du skrive Get-Service | sort-object status, DisplayName | format-table -property DisplayName, status. Det sorterer først efter tjenestestatus (’Stopped’ eller ’Running’), dernæst efter navn, så du nemt kan finde det, du søger.

Cmdletten group-by gør det muligt at gruppere ting efter graden af interesse. Således samler get-process | group-object company de kørende processer efter den virksomhed, der har produceret dem.

Du kan indføre virksomhedens navn i din færdige tabel, selv om det ikke bliver vist som standard i det ordinære get-process-output. For eksempel viser get-process | format-table -property id, company, name, cpu, handles dig den virksomhed, der har oprettet hver kørende proces (forudsat at oplysningen er tilgængelig i den eksekverbare fil).

Windows’ tjenester svigter somme tider uden egentlig at stoppe. De skal genstartes, før systemet fungerer igen. Spooler-tjenesten er berygtet, og når man spiller gamle dos-spil, går det af og til ud over Windows’ audiotjeneste. Det betyder, at andre Windowsapplikationer ikke har nogen lyd, før den bliver genstartet.

Hvordan genstarter man en tjeneste? Først skal du køre ’services.msc’, finde den pågældende tjeneste og notere dens navn – Windows Audio hedder for eksempel ’Audiosrv’. Opret så et PowerShell-script med en enkelt cmdlet: restart-service ”Audiosrv”.

Vær helt sikker på, at du ikke genstarter en central Windowstjeneste, for hvis du gør det, går din pc sandsynligvis ned. Men hvis det er noget i retning af audiotjenesten, er den god nok. Denne ene linje stopper tjenesten og starter den igen. Det løser forhåbentlig samtidig de systemproblemer, der måtte være.

[themepacific_accordion]
[themepacific_accordion_section title="Fakta"]

Det skal du bruge…

[/themepacific_accordion_section]
[/themepacific_accordion]