PowerShell Cookbook

Dit is een lijst van zaken die mijn collega’s en ik nuttig hebben gevonden in ons werk. Het is niet bedoeld als encyclopedische lijst, maar eerder als een plaats om dingen op te slaan die een beginner nuttig zou vinden, vooral dingen die veel tijd kosten om uit te zoeken.

Deze pagina is gestart voordat O’Reilly Windows PowerShell Cookbook van Lee Holmes publiceerde. Ik raad het boek van O’Reilly aan, maar deze pagina staat er los van.

Zie ook PowerShell gotchas.

Outline

  • Aan de slag/installatie
    • Installeer PowerShell
    • Installeer Community Extensions library
    • Verwijder de melding “execution of scripts is disabled”
    • Stel uw “scripts:” PowerShell-schijflocatie
    • Uw opdrachtprompt configureren
  • Diverse taken
    • Schrijven naar het scherm
    • Prompt gebruiker om invoer
    • Data manipuleren
    • E-mail verzenden
    • Slapen
    • Lijst van een directory (recursief)
    • Test of een bestand bestaat
    • Leest bestandsregels in een array
    • Schrijven naar een bestand
    • Een bestand hernoemen
    • Een bestand verwijderen
    • Werken met reguliere expressies
    • Tekenreeksen splitsen en samenvoegen
    • Een web pagina
    • Lezen en schrijven in register
    • Begrijpen van aanhalingstekens
    • Tijd een commando
    • Tekst naar spraak
    • Toegang tot het Windows klembord
    • Laden van een .NET assembly
    • Uitvoeren van code die tijdens runtime is gemaakt
    • Uitvoeren van een programma met een spatie in het pad

Aan de slag/installatie

U installeert PowerShell

U kunt PowerShell verkrijgen bij:
https://www.microsoft.com/windowsserver2003/technologies/management/powershell/download.mspx

top

Community Extensions-bibliotheek installeren

De PowerShell Community Extensions (PSCX)-bibliotheek is hier beschikbaar:
https://www.codeplex.com/Wiki/View.aspx?ProjectName=PowerShellCX

Dit is een handige verzameling cmdlets en functies. Het installeert een “PowerShell Here”-contextmenu in WindowsExplorer waarmee een PowerShell-opdrachtvenster wordt geopend in de map waarop u met de rechtermuisknop klikt. PSCX biedt ook een voorbeeld Profile.ps1-bestand.

Nadat PSCX is geïnstalleerd, typt u man about_pscx om een overzicht te zien van de cmdlets, providers, enzovoort die bij PSCX worden geleverd.

top

Weg met de melding “uitvoering van scripts is uitgeschakeld”

Het eerste probleem dat u waarschijnlijk zult tegenkomen bij het uitvoeren van PowerShell-scripts is zoiets als dit:

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

Dit komt door de standaard beveiligingsinstelling in PowerShell die het uitvoeren van kwaadaardige scripts verbiedt.

U kunt dit gedrag veranderen door het volgende te doen:

PSH> set-executionPolicy RemoteSigned

Nu zullen alleen scripts afkomstig van externe bronnen digitaal ondertekend moeten worden.

top

Stel uw “scripts:” PowerShell-schijflocatie

Als u een aantal PowerShell-scripts hebt geschreven, vindt u het misschien handig om ze op één plaats te verzamelen en een PSDrive met de naam scripts: te maken om ze snel te vinden. U kunt het volgende aan uw PSCX-profiel toevoegen om een dergelijke PSDrive te maken.

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

top

Uw opdrachtprompt configureren

Om uw opdrachtprompt te configureren, maakt u eenvoudig een functie met de naam prompt en plaatst u deze in uw profiel. Het volgende zorgt er bijvoorbeeld voor dat de werkdirectory wordt weergegeven.

function prompt { "$pwd> " }

Merk op dat u elke code die u maar wilt in de prompt functie kunt zetten en dat die code wordt uitgevoerd elke keer dat u op return drukt.

top

Diverse taken

Naar het scherm schrijven

Gebruik Write-Host om uitvoer te schrijven. U kunt optioneel -foregroundcolor opgeven om de uitvoer te kleuren. Fouten en waarschuwingen kunnen bijvoorbeeld rood worden gemarkeerd.

Voorbeeld:

Write-Host "Hello world" -foregroundcolor red

top

De gebruiker om invoer vragen

Gebruik Read-Host.

Voorbeeld:

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

top

Datums manipuleren

Het cmdlet get-date retourneert een DateTime object. Zonder argument, geeft het de huidige tijd en datum. Met een string argument, geen noodzaak om te citeren, het parses de string in een datum.

Voorbeeld: Zoek het aantal dagen en uren sinds de tweehonderdste verjaardag van de Verenigde Staten.

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

U kunt ook tekenreeksen casten naar DateTime-objecten met behulp van de cast .

top

Send email

Gebruik het Send-SmtpMail cmdlet van PowerShell Community Extensions.

Example:

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

top

Sleep

Gebruik het Start-Sleep cmdlet. Duurt standaard seconden, maar heeft een -milliseconds optie.

Voorbeeld:

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

top

Lijst een directory (recursief)

U kunt het dir commando gebruiken, wat eigenlijk een alias is voor Get-ChildItem. Om een directory recursief op te sommen, voegt u de -recurse optie toe.

Voorbeeld:

dir f:\bin -recurse

top

Test of een bestand bestaat

Gebruik test-path.

top

Leest bestandsregels in een array

Gebruik get-content.

Voorbeeld:

$a = (get-content foo.txt)

top

Schrijft naar een bestand

Gebruik Out-File. Tenzij u uitvoer in Unicode wilt, specificeert u -encoding ASCII

Voorbeeld:

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

top

Hernoem een bestand

Gebruik Rename-Item of zijn alias ren.

top

Wis een bestand

Gebruik Delete-Item of zijn alias del.

top

Werken met reguliere expressies

Zie Reguliere expressies in PowerShell en Perl.

top

Splits en voeg strings

Strings hebben een split methode. Het argument voor split() is een string met tekens om op te splitsen. De functie ::split is algemener. Het eerste argument is de string die moet worden gesplitst, en het tweede argument is een reguliere expressie waarop moet worden gesplitst.

Voorbeeld:

$a.split("`t ")

zal de string $a in een array van strings splitsen, waarbij wordt gesplitst overal waar een tab of een spatie staat.

Voorbeeld:

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

zal $a splitsen op komma’s die niet door cijfers worden gevolgd. Dus de splitsing zou “123,456” en “apple” opleveren.

Als de tekenreeks die u wilt splitsen een Windows-pad is, kunt u het gespecialiseerde commando Split-Path gebruiken.

Om een array in een enkele tekenreeks samen te voegen, gebruikt u de methode ::join. Het eerste argument is het scheidingsteken en het tweede is de array.

Voorbeeld:

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

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

top

Grijp een webpagina

Gebruik ofwel Get-Url van PSCX of het net.webclient object van .NET. De eerste is beknopter, maar de laatste biedt meer mogelijkheden.

Voorbeeld:

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

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

De code (new-object net.webclient) creëert een .NET WebClient object met veel nuttige methoden. U zou bijvoorbeeld DownladFile kunnen oproepen om direct op schijf op te slaan in plaats van in een string. Er zijn ook UploadData en UploadFile methoden.

top

Lezen en schrijven in het register

U kunt door het register navigeren zoals u door het bestandssysteem zou navigeren, hoewel er enkele details zijn die u moet weten.

Elke hive van het register is als een schijf. Dus, bijvoorbeeld, om HKEY_CURRENT_USER te verkennen, kunt u cd HKCU: en dan cd gebruiken om uw weg naar beneden te werken. Gebruik Get-ItemProperty om te lezen en Set-ItemProperty om te schrijven. U kunt ook Remove-ItemProperty gebruiken om te verwijderen.

Voorbeeld:

De onderstaande commando’s geven een lijst van de inhoud van de register node die de cmd.exe shell configureert. Door CompletionChar op 9 te zetten, zetten we tab completion aan.

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

Dit TechNet artikel gaat in meer details.

top

Aanhalingstekens

PowerShell heeft vier soorten aanhalingstekens: enkele en dubbele gewone aanhalingstekens, en enkele en dubbele hier-strings. Binnen dubbele aanhalingstekens en dubbele here-strings worden namen van variabelen vervangen door hun waarden en worden PowerShell escape-sequenties geïnterpreteerd. Binnen enkele aanhalingstekens en enkele hier-teksten worden variabelennamen niet uitgebreid en worden escape-sequenties niet geïnterpreteerd. Bijvoorbeeld, de code snippet

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

zal de output

 foo`t$a foo bar

produceren omdat binnen de dubbele aanhalingstekens, `t uitzet naar een tab en $a uitzet naar “bar”.

PowerShell here-strings zijn als here-documenten in Perl. Binnen een here-string, dubbele en enkele aanhalingstekens zijn niet speciaal, maar letterlijk geciteerd. Ook regelafbrekingen worden behouden.

Een here-string begint met @" of @' en eindigt met dezelfde symbolen in de omgekeerde volgorde. Er moet een nieuwe regel staan na de open-marker en voor de sluit-marker.

Voorbeeld

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

produceert

 foo "baz" 'qux' bar

en

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

produceert

 foo "baz" 'qux' $a

Merk op dat er geen witruimte mag staan na het aanhalingsteken waarmee een hier-string wordt geopend. Anders krijgt u de melding “Unrecognized token in source text.”

Hoewel ze op elkaar lijken, zijn PowerShell here-strings en C# verbatim strings tamelijk verschillend. De volgende tabel geeft een overzicht van de verschillen.

C# verbatim strings PowerShell here-strings
Mag regeleindes bevatten Moet regeleindes bevatten
Alleen dubbele aanhalingstekens Enkele en dubbele aanhalingstekens
Begint met @” Begint met @” (of @’) plus een regeleinde
Eindigt met “ Eindigt met een regeleinde gevolgd door “@ (of ‘@)
Kan geen on-dubbele aanhalingstekens bevatten Mag aanhalingstekens bevatten
Uitschakelen van C# escape-sequences ‘@ schakelt PowerShell escape-sequences uit, maar ‘@ niet

top

Time a command

Gebruik Measure-Command om te timen hoe lang het duurt voordat een taak is voltooid.

top

Tekst naar spraak

Gebruik Out-Speech van PSCX.

top

Toegang tot het klembord van Windows

Gebruik de PSCX cmdlets Get-Clipboard en Out-Clipboard om te lezen van en te schrijven naar het klembord.

top

Laad een .NET assembly

U kunt LoadWithPartialName aanroepen. Om bijvoorbeeld de assembly voor de Team Foundation Server API te laden, zou u

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

Zie ook Resolve-Assembly van PSCX.

top

Code uitvoeren die tijdens runtime is gemaakt

Het commando Invoke-Expression is analoog aan eval in Perl of JavaScript. Invoke-Expression $str voert de code uit die in de string $str staat.

top

Uitvoeren van een programma met een spatie in het pad

Plaats aanhalingstekens rond het pad en zet er een ampersand voor. Bijvoorbeeld,

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

start het uitvoerbare programma WinEdt.exe dat twee spaties in het volledige pad heeft.

Merk op dat u de ampersand niet kunt weglaten. In tegenstelling tot cmd.exe, gaat PowerShell er niet van uit dat alle strings commando’s zijn. Zonder de ampersand is een geciteerd pad gewoon een tekenreeks.

top

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.