Wichtige Cmdlets
| Aufgabe | Cmdlets (Aliase) |
|---|---|
| Hilfe | Get-Help, Get-Command, Get-Member, Get-Alias |
| Ausgabe | Write-Output, Write-Host, Write-Verbose, Write-Warning, Write-Error, Out-File, Out-String |
| Objekte | Select-Object (select), Where-Object (?, where), Sort-Object (sort), ForEach-Object (%), Group-Object, Measure-Object |
| System | Get-Process (ps), Stop-Process, Get-Service, Start-Service, Get-ComputerInfo |
| Dateien | Get-ChildItem (ls), Get-Content (cat), Set-Content, Copy-Item (cp), Remove-Item (rm), New-Item |
| Netzwerk | Invoke-WebRequest (curl), Invoke-RestMethod, Test-Connection, Test-NetConnection |
| Daten | ConvertTo-Json, ConvertFrom-Json, Import-Csv, Export-Csv, ConvertTo-Csv |
| Zeit | Get-Date, New-TimeSpan, Start-Sleep |
Operatoren auf einen Blick
Vergleich: -eq -ne -gt -ge -lt -le (Groß/Klein egal; -ceq -cne: unterscheidet)
Text: -like -notlike -match -notmatch -replace -split -join -f
Menge: -in -notin -contains -notcontains
Logik: -and -or -not -xor !
Typ: -is -isnot -as
Umleitung: > >> 2> 2>&1 *>
PS 7: ?: ?? ??= && || (Pipeline-Verkettung)Automatische Variablen
| Variable | Bedeutung |
|---|---|
$_ / $PSItem | aktuelles Objekt in der Pipeline |
$args | nicht benannte Argumente |
$? | war der letzte Befehl erfolgreich? |
$LASTEXITCODE | Exit-Code des letzten externen Programms |
$Error | Liste der letzten Fehler |
$PSScriptRoot | Ordner des laufenden Skripts |
$HOME, $PWD, $PID | Home, aktueller Ordner, Prozess-ID |
$env:NAME | Umgebungsvariable |
$IsWindows, $IsLinux, $IsMacOS | Plattform |
Muster
# Splatting, Pipeline mit berechneten Eigenschaften, formatierte Ausgabe
$daten = 1..5 | ForEach-Object { [pscustomobject]@{ Nr = $_; Quadrat = $_ * $_; Gerade = $_ % 2 -eq 0 } }
$daten | Where-Object Gerade | Select-Object Nr, Quadrat | ForEach-Object { "$($_.Nr) -> $($_.Quadrat)" }
$daten | Measure-Object Quadrat -Sum | Select-Object -ExpandProperty Sum
($daten | Sort-Object Quadrat -Descending | Select-Object -First 1).Nr
"{0:N1} MB" -f (1536000 / 1MB)
1KB, 1MB, 1GB
$null -eq $undefiniert
$PSVersionTable.PSEditionAusgabe
2 -> 4 4 -> 16 55 5 1.5 MB 1024 1048576 1073741824 True Core
Häufige Fehler
| Problem | Ursache / Lösung | |
|---|---|---|
> statt -gt | > leitet Ausgabe in eine Datei um, Vergleich ist -gt | |
try/catch fängt nichts | Fehler ist nicht abbrechend: -ErrorAction Stop | |
| Funktion gibt unerwartete Werte zurück | alle Ausgaben werden zurückgegeben: $null = ... oder ` | Out-Null` |
Format-Table in der Mitte der Pipeline | nur zum Anzeigen am Ende | |
| Array wird langsam | += kopiert; List[T] oder Ergebnis der Schleife sammeln | |
| Leerzeichen im Pfad | Pfad in Anführungszeichen, Join-Path nutzen | |
Skripte sind auf diesem System deaktiviert | Set-ExecutionPolicy RemoteSigned -Scope CurrentUser | |
| Alias in Skripten | Aliase wie ls, % nur interaktiv; in Skripten volle Namen | |
Write-Host für Ergebnisse | Rückgaben mit Write-Output; Write-Host nur für Anzeigen |
Weiterlernen
- learn.microsoft.com/powershell (Handbuch), PowerShell in a Month of Lunches, PowerShell.org
- Pester für Tests, PSScriptAnalyzer für Stil, VS Code mit PowerShell-Erweiterung
- Wiki dieser Seite: Artikel zu Windows-Administration und Automatisierung
Merke
- Alles ist ein Objekt: Pipeline,
Where-Object,Select-Object,Sort-Object - Cmdlets Verb-Nomen, Hilfe mit
Get-Help/Get-Member - Skripte robust machen:
Set-StrictMode,$ErrorActionPreference = "Stop",try/catch - PowerShell 7 läuft überall; Module aus der Gallery erweitern es