PowerShell Cookbook

Detta är en lista över saker som jag och mina kollegor har funnit användbara i vårt arbete. Den är inte avsedd att vara encyklopedisk, utan snarare en plats för att registrera saker som en nybörjare skulle finna användbara, särskilt saker som kan ta lång tid att räkna ut.

Denna sida startades innan O’Reilly publicerade Windows PowerShell Cookbook av Lee Holmes. Jag rekommenderar O’Reillys bok, men den här sidan har inget samband med den.

Se även PowerShell gotchas.

Outline

  • Kom igång/installation
    • Installera PowerShell
    • Installera Community Extensions-biblioteket
    • Bortse från meddelandet ”Exekvering av skript är inaktiverat”
    • Inställ dina ”skript:”. PowerShell-enhetens plats
    • Konfigurera kommandoprompten
  • Övriga uppgifter
    • Skriva till skärmen
    • Bedraga användaren om inmatning
    • Manipulera datum
    • Sänd e-post
    • Sova
    • Lista en katalog (rekursivt)
    • Testar om en fil existerar
    • Läs filrader till en array
    • Skriv till en fil
    • Namnge en fil
    • Ta bort en fil
    • Arbeta med reguljära uttryck
    • Splita och sammanfoga strängar
    • Hämta en webb sida
    • Läs och skriv i registret
    • Förstå citationstecken
    • Tidsbestäm ett kommando
    • Text till tal
    • Access till Windows klippbräda
    • Ladda en .NET assembly
    • Exekvera kod som skapats vid körning
    • Exekvera ett program med ett mellanslag i sökvägen

Komma igång/installation

Installera PowerShell

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

top

Installera biblioteket Community Extensions

Biblioteket PowerShell Community Extensions (PSCX) finns här:
https://www.codeplex.com/Wiki/View.aspx?ProjectName=PowerShellCX

Detta är en användbar samling cmdlets och funktioner. Det installerar en ”PowerShell Here”-kontextmeny i WindowsExplorer som öppnar ett PowerShell-kommandofönster i den mapp som du högerklickar på. Dessutom tillhandahåller PSCX en exempelfil Profile.ps1.

När PSCX är installerad skriver du man about_pscx för att se en översikt över de cmdlets, providers etc. som ingår i PSCX.

top

Bli av med meddelandet ”Exekvering av skript är inaktiverat”

Det första problemet som du sannolikt stöter på när du kör PowerShell-skript är något som liknar det här:

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 <<<<

Det här beror på den standardiserade säkerhetsinställningen i PowerShell som förbjuder skadliga skript att köras.

Du kan ändra detta beteende genom att göra så här:

PSH> set-executionPolicy RemoteSigned

Nu kommer endast skript som kommer från fjärrkällor att kräva digital signering.

top

Ställ in dina ”skript:”. PowerShell-enhetsplats

När du har skrivit ett antal PowerShell-skript kan det vara användbart att samla dem på ett ställe och skapa en PSDrive med namnet scripts: för att snabbt hitta dem. Du kan lägga till följande i din PSCX-profil för att skapa en sådan PSDrive.

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

top

Konfigurera din kommandoprompt

För att konfigurera din kommandoprompt skapar du helt enkelt en funktion som heter prompt och lägger den i din profil. Följande kommer till exempel att leda till att arbetskatalogen visas.

function prompt { "$pwd> " }

Notera att du kan lägga in vilken kod som helst i prompt-funktionen och den koden kommer att köras varje gång du trycker på return.

top

Diverse uppgifter

Skriva till skärmen

Använd Write-Host för att skriva utdata. Du kan valfritt ange -foregroundcolor för att färga utmatningen. Exempelvis kan fel och varningar markeras med rött.

Exempel:

Write-Host "Hello world" -foregroundcolor red

top

Fråga användaren om inmatning

Använd Read-Host.

Exempel:

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

top

Manipulera datum

Cmdlet get-date returnerar ett DateTime-objekt. Utan argument returneras aktuell tid och datum. Med ett strängargument, inget behov av citationstecken, analyseras strängen till ett datum.

Exempel: Du kan också kasta strängar till DateTime-objekt genom att använda cast .

top

Skicka e-post

Använd cmdlet Send-SmtpMail från PowerShell Community Extensions.

Exempel:

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

top

Sleep

Använd cmdlet Start-Sleep. Tar sekunder som standard, men har ett -milliseconds-alternativ.

Exempel:

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

top

Lista en katalog (rekursivt)

Du kan använda kommandot dir, som egentligen är ett alias till Get-ChildItem. För att lista en katalog rekursivt lägger du bara till alternativet -recurse.

Exempel:

dir f:\bin -recurse

top

Testar om en fil finns

Använd test-path.

top

Läs fillinjer i en array

Använd get-content.

Exempel:

$a = (get-content foo.txt)

top

Skriv till en fil

Använd Out-File. Om du inte vill ha Unicode-utdata anger du -encoding ASCII

Exempel:

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

top

Byt namn på en fil

Använd Rename-Item eller dess alias ren.

top

Ta bort en fil

Använd Delete-Item eller dess alias del.

top

Arbeta med reguljära uttryck

Se Reguljära uttryck i PowerShell och Perl.

top

Dela upp och sammanfoga strängar

Strängar har en split metod. Argumentet till split() är en sträng som innehåller tecken som ska delas upp på. Funktionen ::split är mer generell. Dess första argument är strängen som ska delas och dess andra argument är ett reguljärt uttryck på vilket den ska delas.

Exempel:

$a.split("`t ")

kommer att dela strängen $a i en array av strängar, och dela där det finns en tabb eller ett mellanslag.

Exempel:

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

kommer att dela $a på kommatecken som inte följs av siffror. Så uppdelningen skulle ge ”123,456” och ”apple”.

Om strängen du delar upp är en Windows-sökväg kan du använda det specialiserade kommandot Split-Path.

Om du vill sammanfoga en array till en enda sträng använder du ::join-metoden. Det första argumentet är separationstecknet och det andra är arrayen.

Exempel:

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

Nu innehåller $b ”1*2*3”.

top

Ta en webbsida

Använd antingen Get-Url från PSCX eller net.webclient objektet från .NET. Det förstnämnda är mer kortfattat men det senare ger fler alternativ.

Exempel:

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

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

Koden (new-object net.webclient) skapar ett .NET WebClient objekt med många användbara metoder. Du kan till exempel anropa DownladFile för att spara direkt till disken i stället för till en sträng. Det finns också UploadData och UploadFile metoder.

top

Läsa och skriva till registret

Du kan navigera i registret på samma sätt som i filsystemet, även om det finns en del detaljer att känna till.

Varje hive i registret är som en enhet. Så för att utforska HKEY_CURRENT_USER kan du till exempel cd HKCU: och sedan använda cd för att arbeta dig nedåt i trädet. Använd Get-ItemProperty för att läsa och Set-ItemProperty för att skriva. Du kan också använda Remove-ItemProperty för att ta bort.

Exempel:

Kommandona nedan listar innehållet i den registernod som konfigurerar skalet cmd.exe. Genom att ställa in CompletionChar till 9 aktiverar vi tabkomplettering.

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

Denna TechNet-artikel går in på mer detaljer.

top

Förstå citationstecken

PowerShell har fyra typer av citationstecken: enkla och dubbla vanliga citationstecken samt enkla och dubbla här-strängar. Inom dubbla citationstecken och dubbla here-strings ersätts variabelnamn med deras värden och PowerShells escape-sekvenser tolkas. Inom enkla citattecken och enkla here-strings expanderas inte variabelnamn och escape-sekvenser tolkas inte. Kodutdraget

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

ger till exempel utdata

 foo`t$a foo bar

eftersom `t inom dubbla citationstecken expanderas till en tabb och $a expanderas till ”bar”.

PowerShell here-strings är som here-dokument i Perl. Inom en here-string är dubbla och enkla citattecken inte speciella utan citeras bokstavligen. Dessutom bevaras radbrytningar.

En here-string börjar med antingen @" eller @' och slutar med samma symboler i motsatt ordning. Det måste finnas en ny rad efter den inledande markeringen och före den avslutande markeringen.

Exempel

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

producerar

 foo "baz" 'qux' bar

och

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

producerar

 foo "baz" 'qux' $a

Bemärk att det inte får finnas något vitrymder efter citationstecken som inleder en here-string. Annars får du meddelandet ”Unrecognized token in source text.”

Trots att de ser likadana ut är PowerShell here-strings och C# verbatimstrings ganska olika. Följande tabell sammanfattar skillnaderna.

C# verbatim strings PowerShell here-strings
Kan innehålla radbrytningar Måste innehålla radbrytningar
Enbart varianter med dubbla citationstecken Enkla och dubbla citationstecken
Börjar med @” Börjar med @” (eller @’) plus ett radbrytning
Finns med ” Finns med ett radbrytning följt av ”@ (eller ’@’-)
Kan inte innehålla o-escaped double quotes Måste innehålla citationstecken
Släcker C#-utryckningssekvenser ’@ släcker PowerShell-utryckningssekvenser, men ”@” gör det inte

top

Tidsbestäm ett kommando

Använd Measure-Command för att tidsbestämma hur lång tid det tar att slutföra en uppgift.

top

Text till tal

Använd Out-Speech från PSCX.

top

Åtkomst till Windows klippbräda

Använd PSCX-cmdlets Get-Clipboard och Out-Clipboard för att läsa från och skriva till klippbordet.

top

Ladda en .NET-grupp

Du kan anropa LoadWithPartialName. Om du till exempel vill läsa in samlingen för Team Foundation Server API skulle du exekvera

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

Se även Resolve-Assembly från PSCX.

top

Exekvera kod som skapats vid körning

Kommandot Invoke-Expression är analogt med eval i Perl eller JavaScript. Invoke-Expression $str exekverar koden som finns i strängen $str.

top

Exekvera ett program med ett mellanslag i sökvägen

Sätt citationstecken runt sökvägen och sätt ett ampersand framför. Till exempel,

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

startar det körbara programmet WinEdt.exe som har två mellanslag i sin fullständiga sökväg.

Notera att du inte kan utelämna ampersand. Till skillnad från cmd.exe antar PowerShell inte att alla strängar är kommandon. Utan ampersand är en angiven sökväg bara en sträng.

top

Lämna ett svar

Din e-postadress kommer inte publiceras.