PowerShell Cookbook

Dette er en liste over ting, som mine kolleger og jeg har fundet nyttige i vores arbejde. Det er ikke meningen, at den skal være encyklopædisk, men snarere et sted at registrere ting, som en nybegynder ville finde nyttige, især ting, der kan tage lang tid at finde ud af.

Denne side blev startet, før O’Reilly udgav Windows PowerShell Cookbook af Lee Holmes. Jeg anbefaler O’Reillys bog, men denne side er ikke relateret til den.

Se også PowerShell gotchas.

Outline

  • Kom godt i gang/installation
    • Installer PowerShell
    • Installer Community Extensions-biblioteket
    • Få bugt med meddelelsen “execution of scripts is disabled”
    • Sæt dine “scripts” op:
    • PowerShell-drevplacering
    • Konfigurer din kommandoprompt
  • Diverse opgaver
    • Skrive til skærmen
    • Spørge brugeren om input
    • Manipulere datoer
    • Sende e-mail
    • Stille sig i dvale
    • Liste over en mappe (rekursivt)
    • Teste, om en fil findes
    • Læse fillinjer i en array
    • Skriv til en fil
    • Skriv en fil om i en fil
    • Slet en fil
    • Arbejd med regulære udtryk
    • Split and join strings
    • Grab en web side
    • Læs og skriv i registreringsdatabasen
    • Forstå anførselstegn
    • Tid en kommando
    • Tekst til tale
    • Access til Windows’ udklipsholder
    • Indlæs en .NET-samling
    • Udfør kode, der er oprettet ved kørselstid
    • Udfør et program med et mellemrum i dets sti

Kom godt i gang/installation

Installer PowerShell

Du kan få PowerShell fra:
https://www.microsoft.com/windowsserver2003/technologies/management/powershell/download.mspx

top

Installer biblioteket Community Extensions

Biblioteket PowerShell Community Extensions (PSCX) er tilgængeligt her:
https://www.codeplex.com/Wiki/View.aspx?ProjectName=PowerShellCX

Det er en nyttig samling af cmdlets og funktioner. Det installerer en “PowerShell her”-kontekstmenu i WindowsExplorer, der åbner et PowerShell-kommandovindue i den mappe, som du højreklikker på. PSCX indeholder også en prøvefil Profile.ps1.

Når PSCX er installeret, skal du skrive man about_pscx for at få vist en oversigt over de cmdlets, providers osv. der følger med PSCX.

top

Slip af med meddelelsen “udførelse af scripts er deaktiveret”

Det første problem, du sandsynligvis vil støde på, når du kører PowerShell-scripts, er noget i stil med dette:

PSH> .\myScript.ps1File D:\myScript.ps1 cannot be loaded. The fileD:\myScript.ps1 is not digitally signed. The script will not execute on thesystem. Please see "get-help about_signing" for more details..
At line:1 char:13 + .\myScript.ps1 <<<<

Dette skyldes den standardsikkerhedsindstilling i PowerShell, der forbyder, at ondsindede scripts kan køres.

Du kan ændre denne adfærd ved at gøre dette:

PSH> set-executionPolicy RemoteSigned

Nu vil kun scripts, der kommer fra eksterne kilder, kræve digital signering.

top

Opsæt dine “scripts:” PowerShell-drevplacering

Når du har skrevet en række PowerShell-scripts, kan du måske finde det nyttigt at samle dem ét sted og oprette et PSDrive med navnet scripts: for hurtigt at kunne finde dem. Du kan føje følgende til din PSCX-profil for at oprette et sådant PSDrive.

New-PSdrive -name scripts -PSprovider filesystem -root C:\bin\PowerShellScripts

top

Konfigurer din kommandoprompt

For at konfigurere din kommandoprompt skal du blot oprette en funktion ved navn prompt og føje den til din profil. Følgende vil f.eks. få arbejdskataloget til at blive vist.

function prompt { "$pwd> " }

Bemærk, at du kan lægge en hvilken som helst kode ind i prompt-funktionen, og at koden vil blive kørt, hver gang du trykker på return.

top

Diverse opgaver

Skrive til skærmen

Brug Write-Host til at skrive output. Du kan eventuelt angive -foregroundcolor for at farve output. F.eks. kan fejl og advarsler fremhæves med rødt.

Eksempel:

Write-Host "Hello world" -foregroundcolor red

top

Opfordrer brugeren til at indtaste input

Brug Read-Host.

Eksempel:

$a = Read-Host "Enter your name"Write-Host "Hello" $a

top

Manipulér datoer

Cmdlet get-date returnerer et DateTime-objekt. Uden argument returnerer den det aktuelle klokkeslæt og den aktuelle dato. Med et strengargument, uden at det er nødvendigt at sætte citationstegn, analyserer den strengen til en dato.

Eksempel: Find antallet af dage og timer siden USA’s tohundredeårsdag.

(get-date) - (get-date 7/4/1976)

Du kan også omdanne strenge til DateTime-objekter ved at bruge cast .

top

Send e-mail

Brug cmdletten Send-SmtpMail fra PowerShell Community Extensions.

Eksempel:

Send-SmtpMail -SmtpHost wotan.mdacc.tmc.edu -from [email protected] -to [email protected] -body "hello world"

top

Sleep

Brug cmdletten Start-Sleep. Tager som standard sekunder, men har en -milliseconds indstilling.

Eksempel:

Write-Host "hello"; Start-Sleep 5; Write-Host "world"

top

Liste en mappe (rekursivt)

Du kan bruge kommandoen dir, som i virkeligheden er et alias til Get-ChildItem. Hvis du vil liste en mappe rekursivt, skal du blot tilføje indstillingen -recurse.

Eksempel:

dir f:\bin -recurse

top

Test, om en fil findes

Brug test-path.

top

Læs fillinjer i et array

Brug get-content.

Eksempel:

$a = (get-content foo.txt)

top

Skriv til en fil

Brug Out-File. Medmindre du ønsker Unicode-udskrift, skal du angive -encoding ASCII

Eksempel:

$foo | out-file -encoding ASCII foo.txt

top

Omdøb en fil

Brug Rename-Item eller dens alias ren.

top

Slet en fil

Brug Delete-Item eller dens alias del.

top

Arbejde med regulære udtryk

Se Regulære udtryk i PowerShell og Perl.

top

Opdele og sammenføje strenge

Trenge har en split-metode. Argumentet til split() er en streng, der indeholder tegn, der skal opdeles på. Funktionen ::split er mere generel. Dens første argument er den streng, der skal opdeles, og dens andet argument er et regulært udtryk, som den skal opdele på.

Eksempel:

$a.split("`t ")

vil opdele strengen $a i et array af strenge og opdele, hvor der er en tabulator eller et mellemrum.

Eksempel:

$a = "123,456,apple"; ::split($a, ",(?!\d)")

vil opdele $a på kommaer, der ikke er efterfulgt af cifre. Så opdelingen ville give “123,456” og “apple”.

Hvis den streng, du deler, er en Windows-sti, skal du måske bruge den specialiserede Split-Path-kommando.

For at samle et array til en enkelt streng skal du bruge ::join-metoden. Det første argument er adskillelsestegnet, og det andet er arrayet.

Eksempel:

$a = 1, 2, 3;#note: this is an array, not a string$b = ::join("*", $a)

Nu indeholder $b “1*2*3”.

top

Grib en webside

Brug enten Get-Url fra PSCX eller net.webclient-objektet fra .NET. Førstnævnte er mere kortfattet, men sidstnævnte giver flere muligheder.

Eksempel:

$w = Get-Url "https://www.w3.org"

$w = (new-object net.webclient).DownloadString("https://www.w3.org")

Koden (new-object net.webclient) opretter et .NET WebClient-objekt WebClient med mange nyttige metoder. Du kan f.eks. kalde DownladFile for at gemme direkte på disken i stedet for til en streng. Der er også UploadData og UploadFile metoder.

top

Læs og skriv til registreringsdatabasen

Du kan navigere i registreringsdatabasen som i filsystemet, selv om der er nogle detaljer, du skal kende.

Hvert hive i registreringsdatabasen er som et drev. Så hvis du f.eks. vil udforske HKEY_CURRENT_USER, kan du cd HKCU: og derefter bruge cd til at arbejde dig ned gennem træet. Brug Get-ItemProperty til at læse og Set-ItemProperty til at skrive. Du kan også bruge Remove-ItemProperty til at slette.

Eksempel:

Med nedenstående kommandoer får du en liste over indholdet af den registreringsnode, der konfigurerer cmd.exe-skal. Ved at indstille CompletionChar til 9 slår vi tabulatorudfyldning til.

cd HKCU:\Software\Microsoft\Command ProcessorGet-ItemProperty .Set-ItemProperty . -name CompletionChar -Value 9

Denne TechNet-artikel går mere i detaljer.

top

Forstå anførselstegn

PowerShell har fire slags anførselstegn: enkle og dobbelte almindelige anførselstegn samt enkle og dobbelte her-strenge. Inden for dobbelte anførselstegn og dobbelte her-strenge erstattes variabelnavne med deres værdier, og PowerShell-emnefølger fortolkes. Inden for enkle anførselstegn og enkle here-strings udvides variabelnavne ikke, og escape-sekvenser fortolkes ikke. F.eks. vil kodestumpen

 $a = "bar" 'foo`t$a', "foo`t$a"

give output

 foo`t$a foo bar

, fordi `t inden for de dobbelte citationstegn udvides til en tabulator og $a udvides til “bar”.

PowerShell here-strings er som here-dokumenter i Perl. Inde i en here-streng er dobbelte og enkelte anførselstegn ikke specielle, men anføres bogstaveligt. Desuden bevares linjeskift.

En here-string begynder med enten @" eller @' og slutter med de samme symboler i den modsatte rækkefølge. Der skal være en newline efter den indledende markering og før den afsluttende markering.

Eksempel

 $a = "bar" $b = @" foo "baz" 'qux' $a "@ $b

producerer

 foo "baz" 'qux' bar

og

 $a = "bar" $b = @' foo "baz" 'qux' $a '@ $b

producerer

 foo "baz" 'qux' $a

Bemærk, at der ikke må være noget hvidt mellemrum efter det citationstegn, der åbner en her-streng. Ellers får du meddelelsen “Unrecognized token in source text.”

Og selv om de ligner hinanden, er PowerShell here-strings og C# verbatimstrings ret forskellige. Følgende tabel opsummerer forskellene.

C# verbatim-strings PowerShell her-strings
Kan indeholde linjeskift Skal indeholde linjeskift
Kun dobbelt anførselstegnsvariant Enkel- og dobbelt anførselstegnsvariant
Begynder med @” Begynder med @” (eller @’) plus et linjeskift
Ender med “ Ender med et linjeskift efterfulgt af “@ (eller ‘@)
Kan ikke indeholde u-escaped double quotes Må indeholde anførselstegn
Slukker for C#- undvigelsessekvenser ‘@ slukker for PowerShell- undvigelsessekvenser, men “@ gør ikke

top

Tidsindstille en kommando

Brug Measure-Command til at tidsindstille, hvor lang tid en opgave tager at fuldføre.

top

Tekst til tale

Brug Out-Speech fra PSCX.

top

Få adgang til Windows’ udklipsholder

Brug PSCX-cmdlets Get-Clipboard og Out-Clipboard til at læse fra og skrive til udklipsholderen.

top

Indlæs en .NET-samling

Du kan kalde LoadWithPartialName. Hvis du f.eks. vil indlæse samlingen til Team Foundation Server API’et, skal du udføre

::LoadWithPartialName("Microsoft.TeamFoundation.Client")

Se også Resolve-Assembly fra PSCX.

top

Udfør kode oprettet på køretid

Kommandoen Invoke-Expression svarer til eval i Perl eller JavaScript. Invoke-Expression $str udfører den kode, der er indeholdt i strengen $str.

top

Udfør et program med et mellemrum i stien

Sæt anførselstegn omkring stien, og sæt et ampersand foran. F.eks.

& "C:\Program Files\WinEdt Team\WinEdt\WinEdt.exe"

vil starte det eksekverbare program WinEdt.exe, som har to mellemrum i sin fulde sti.

Bemærk, at du ikke kan udelade ampersandet. I modsætning til cmd.exe antager PowerShell ikke, at alle strenge er kommandoer. Uden ampersandet er en sti i anførselstegn bare en streng.

top

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.