Keine eigenen Cookies · Kein Tracking auf dieser Seite

PowerShell Tutorials

Cmdlets, Pipelines und Skripte — PowerShell von den Grundlagen bis zur Automatisierung.

12 Tutorials in dieser Kategorie

Startseite Büro Windows PowerShell Linux Raspberry Pi Mac iPhone Android Tools Troubleshooting KI Netzwerk Robotik Sicherheit

PowerShell

Vom ersten Cmdlet bis zur Enterprise-Automatisierung

Grundlagen
Einsteiger

PowerShell Grundlagen

Was ist PowerShell, wie unterscheidet sie sich von CMD, und wie startest du durch?

Mehr lesen

Was ist PowerShell?

PowerShell ist eine moderne Kommandozeile von Microsoft, die Objekte statt reinen Text verarbeitet. Während CMD nur Zeichenketten ausgibt, liefert PowerShell strukturierte Daten — du kannst Ergebnisse filtern, sortieren und direkt weiterverarbeiten.

CMD vs. PowerShell

MerkmalCMDPowerShell
AusgabeReiner TextObjekte mit Eigenschaften
Befehledir, copy, delGet-ChildItem, Copy-Item, Remove-Item
ScriptingBatchdateien (.bat)PowerShell-Skripte (.ps1)
PipelineText durchreichenObjekte durchreichen
RemoteNicht eingebautWinRM / PSSession

PowerShell öffnen

  • Win + XTerminal (Windows 11) oder Windows PowerShell
  • Win + Rpowershell eingeben
  • Startmenü → "PowerShell" suchen → Als Administrator ausführen

Die drei wichtigsten Hilfe-Befehle

BefehlFunktion
Get-Help Get-ProcessHilfe zu einem Cmdlet anzeigen
Get-Command *service*Cmdlets nach Name suchen
Get-Alias lsHerausfinden, welches Cmdlet hinter einem Alias steckt

Hilfe beim ersten Mal aktualisieren: Update-Help -Force (als Admin)

Das Pipeline-Konzept ( | )

Die Pipeline leitet Objekte von einem Cmdlet zum nächsten:

Get-Process | Sort-Object CPU -Descending | Select-Object -First 5

Ergebnis: Die 5 Prozesse mit dem höchsten CPU-Verbrauch, sauber sortiert.

Ausführungsrichtlinie (ExecutionPolicy)

Standardmäßig blockiert Windows das Ausführen von Skripten. Prüfen und ändern:

# Aktuelle Richtlinie anzeigen
Get-ExecutionPolicy

# Lokale Skripte erlauben (empfohlen)
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

Tipp: RemoteSigned erlaubt lokale Skripte, blockiert aber heruntergeladene ohne Signatur — ein guter Kompromiss zwischen Sicherheit und Nutzbarkeit.

Dateisystem
Einsteiger

Dateien & Ordner verwalten

Dateien auflisten, erstellen, kopieren, verschieben und löschen mit PowerShell.

Mehr lesen

Grundlegende Datei-Cmdlets

AktionBefehl
Inhalt auflistenGet-ChildItem C:\Users
Auch versteckte DateienGet-ChildItem -Force
Rekursiv suchenGet-ChildItem -Recurse -Filter *.log
Datei-Info anzeigenGet-Item C:\Windows\notepad.exe
Prüfen ob Pfad existiertTest-Path C:\Temp
Ordner erstellenNew-Item -Path C:\Temp\Backup -ItemType Directory
Datei erstellenNew-Item -Path C:\Temp\log.txt -ItemType File
Datei kopierenCopy-Item C:\Quelle\datei.txt C:\Ziel\
Datei verschiebenMove-Item C:\alt\datei.txt C:\neu\
Datei umbenennenRename-Item C:\Temp\alt.txt -NewName neu.txt
Datei löschenRemove-Item C:\Temp\datei.txt
Ordner rekursiv löschenRemove-Item C:\Temp\Alt -Recurse -Force

Dateiinhalt lesen und schreiben

# Datei lesen
Get-Content C:\Temp\log.txt

# Letzte 10 Zeilen
Get-Content C:\Temp\log.txt -Tail 10

# Text in Datei schreiben (ueberschreibt)
Set-Content C:\Temp\log.txt -Value "Neuer Inhalt"

# Text anhaengen
Add-Content C:\Temp\log.txt -Value "Neue Zeile"

Praxis: Alle .tmp-Dateien finden und löschen

Get-ChildItem C:\Temp -Recurse -Filter *.tmp | Remove-Item -Force

Tipp: Get-ChildItem hat die Aliase ls, dir und gci. Du kannst also auch ls C:\Users verwenden.

System
Einsteiger

Dienste & Systeminformationen

Windows-Dienste steuern und Systeminformationen abfragen per PowerShell.

Mehr lesen

Dienste verwalten

AktionBefehl
Alle Dienste anzeigenGet-Service
Laufende DiensteGet-Service | Where-Object Status -eq Running
Bestimmten Dienst prüfenGet-Service -Name Spooler
Dienst startenStart-Service -Name Spooler
Dienst stoppenStop-Service -Name Spooler
Dienst neu startenRestart-Service -Name Spooler
Starttyp ändernSet-Service -Name Spooler -StartupType Automatic

Systeminformationen abfragen

# Allgemeine Computerinfos
Get-ComputerInfo | Select-Object CsName, OsName, OsVersion, OsArchitecture

# Betriebssystem-Details
Get-CimInstance Win32_OperatingSystem | Select-Object Caption, Version, LastBootUpTime

# Betriebszeit berechnen
(Get-Date) - (Get-CimInstance Win32_OperatingSystem).LastBootUpTime

# Installierte Updates anzeigen
Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 10

Tipp: Get-Service benötigt für Start/Stop Administrator-Rechte. Starte PowerShell als Admin, wenn Dienste gesteuert werden sollen.

Referenz
Fortgeschritten

Get-Process

Prozesse auflisten, filtern, sortieren und exportieren.

Mehr lesen
AktionBefehl
Alle Prozesse auflistenGet-Process
Hilfe mit BeispielenGet-Help Get-Process -Examples
Bestimmte Prozesse anzeigenGet-Process winword, explorer | Format-Table
Prozesse mit "W" filternGet-Process -Name W*
Eigenschaften anzeigenGet-Process | Get-Member -MemberType Property
Nach Speicher sortierenGet-Process | Sort-Object -Property WS
Nach Priorität sortierenGet-Process | Sort-Object -Property Priority
Prozesse > 10 MB RAMGet-Process | Where-Object {$_.WS -gt 10MB}
Interaktive AnsichtGet-Process | Out-GridView
Als CSV exportierenGet-Process | Export-Csv d:\processes.csv -NoTypeInformation
Als Textdatei speichernGet-Process | Out-File d:\processes.txt
Prozess beendenStop-Process -Name excel
Referenz
Fortgeschritten

Get-PSDrive

Laufwerke abfragen und Informationen exportieren.

Mehr lesen
AktionBefehl
Alle PS-Laufwerke auflistenGet-PSDrive
Nur Dateisystem-LaufwerkeGet-PSDrive -PSProvider Filesystem
Formatierte AusgabeGet-PSDrive -PSProvider Filesystem | Format-Table -AutoSize
Bestimmtes Laufwerk (C:)Get-PSDrive -PSProvider Filesystem -Name C
In Datei speichernGet-PSDrive -PSProvider Filesystem | FT -AutoSize | Out-File d:\laufwerke.txt
Datei öffnenStart d:\laufwerke.txt
Scripting
Fortgeschritten

PowerShell Scripting

Variablen, Schleifen, Funktionen und Fehlerbehandlung — Skripte schreiben wie ein Profi.

Mehr lesen

Variablen und Datentypen

# Variablen beginnen mit $
$name = "Server01"
$anzahl = 42
$aktiv = $true

# Arrays
$server = @("DC01", "DC02", "FS01")
$server[0]  # "DC01"

# Hashtables (Schluessel-Wert-Paare)
$config = @{
    Host = "192.168.1.1"
    Port = 443
    SSL  = $true
}

Kontrollstrukturen

# If / ElseIf / Else
$freierPlatz = (Get-PSDrive C).Free / 1GB
if ($freierPlatz -lt 5) {
    Write-Warning "Weniger als 5 GB frei!"
} elseif ($freierPlatz -lt 20) {
    Write-Host "Platz wird knapp: $([math]::Round($freierPlatz,1)) GB"
} else {
    Write-Host "Genug Platz: $([math]::Round($freierPlatz,1)) GB"
}

# Switch
$tag = (Get-Date).DayOfWeek
switch ($tag) {
    "Monday"    { "Wochenstart - Backup pruefen" }
    "Friday"    { "Wochenende - Logs archivieren" }
    default     { "Normaler Tag" }
}

# ForEach-Schleife
$dienste = @("Spooler", "W32Time", "WinRM")
foreach ($dienst in $dienste) {
    Get-Service -Name $dienst | Select-Object Name, Status
}

# For-Schleife
for ($i = 1; $i -le 5; $i++) {
    Write-Host "Durchlauf $i"
}

Funktionen mit Parametern

function Get-DiskReport {
    param(
        [string]$ComputerName = $env:COMPUTERNAME,
        [int]$WarningSchwelle = 10
    )
    $laufwerke = Get-CimInstance Win32_LogicalDisk -Filter "DriveType=3"
    foreach ($lw in $laufwerke) {
        $freiGB = [math]::Round($lw.FreeSpace / 1GB, 1)
        $status = if ($freiGB -lt $WarningSchwelle) { "WARNUNG" } else { "OK" }
        [PSCustomObject]@{
            Laufwerk = $lw.DeviceID
            FreiGB   = $freiGB
            Status   = $status
        }
    }
}
Get-DiskReport -WarningSchwelle 20

Fehlerbehandlung: Try/Catch/Finally

try {
    $inhalt = Get-Content "C:\wichtig\config.txt" -ErrorAction Stop
    Write-Host "Datei gelesen: $($inhalt.Count) Zeilen"
} catch [System.IO.FileNotFoundException] {
    Write-Warning "Datei nicht gefunden!"
} catch {
    Write-Error "Unbekannter Fehler: $_"
} finally {
    Write-Host "Vorgang abgeschlossen."
}

Praxis: Einfaches Backup-Skript

$quelle = "C:\Projekte"
$ziel = "D:\Backup\Projekte_$(Get-Date -Format 'yyyy-MM-dd')"

if (!(Test-Path $ziel)) { New-Item $ziel -ItemType Directory | Out-Null }
Copy-Item "$quelle\*" $ziel -Recurse -Force
Write-Host "Backup nach $ziel abgeschlossen." -ForegroundColor Green

Tipp: Speichere Skripte als .ps1-Datei. Starte mit .\MeinSkript.ps1 oder Rechtsklick → "Mit PowerShell ausführen".

Netzwerk
Fortgeschritten

Netzwerk-Cmdlets

Netzwerkverbindungen testen, Adapter verwalten und Webinhalte abrufen.

Mehr lesen

Verbindungen testen

AktionBefehl
Ping (modern)Test-Connection google.de -Count 4
Port prüfen (telnet-Ersatz)Test-NetConnection google.de -Port 443
TracerouteTest-NetConnection google.de -TraceRoute
DNS-AuflösungResolve-DnsName google.de
DNS-Typ abfragenResolve-DnsName google.de -Type MX
DNS-Cache anzeigenGet-DnsClientCache

Netzwerkadapter und IP

# Alle Netzwerkadapter
Get-NetAdapter | Format-Table Name, Status, LinkSpeed

# IP-Adressen anzeigen
Get-NetIPAddress -AddressFamily IPv4 | Format-Table InterfaceAlias, IPAddress

# Aktive Adapter mit IP
Get-NetAdapter | Where-Object Status -eq Up |
    Get-NetIPAddress -AddressFamily IPv4 |
    Select-Object InterfaceAlias, IPAddress

Webanfragen

# Webseite abrufen
$response = Invoke-WebRequest "https://example.com"
$response.StatusCode  # 200

# REST-API abfragen (JSON automatisch parsen)
$ip = Invoke-RestMethod "https://ipinfo.io/json"
Write-Host "Deine IP: $($ip.ip) ($($ip.city))"

# Datei herunterladen
Invoke-WebRequest "https://example.com/datei.zip" -OutFile "C:\Temp\datei.zip"

Tipp: Test-NetConnection ersetzt telnet für Port-Tests. Kein extra Tool nötig — PowerShell hat alles an Bord.

Diagnose
Fortgeschritten

EventLog & Fehleranalyse

Windows-Ereignisprotokolle auswerten — Fehler finden, Bluescreens analysieren, Logins prüfen.

Mehr lesen

Get-EventLog vs. Get-WinEvent

MerkmalGet-EventLogGet-WinEvent
VerfügbarkeitÄltere Logs (System, Application)Alle Logs inkl. moderner
PerformanceLangsamerSchneller, filterbar am Provider
EmpfehlungEinfache AbfragenStandard für alles

Grundlegende Abfragen

# Letzte 20 Fehler im System-Log
Get-WinEvent -LogName System -MaxEvents 20 |
    Where-Object Level -eq 2 |
    Format-Table TimeCreated, Id, Message -Wrap

# Fehler der letzten 24 Stunden
$seit = (Get-Date).AddHours(-24)
Get-WinEvent -FilterHashtable @{
    LogName   = 'System'
    Level     = 2  # Error
    StartTime = $seit
}

# Kritische Ereignisse (Level 1)
Get-WinEvent -FilterHashtable @{
    LogName = 'System'
    Level   = 1
} -MaxEvents 10

Praxis: Letzte Bluescreens finden

Get-WinEvent -FilterHashtable @{
    LogName   = 'System'
    ProviderName = 'Microsoft-Windows-WER-SystemErrorReporting'
} -MaxEvents 5 | Format-List TimeCreated, Message

Praxis: Fehlgeschlagene Anmeldeversuche

# Event-ID 4625 = fehlgeschlagene Anmeldung
Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    Id      = 4625
} -MaxEvents 20 | Select-Object TimeCreated,
    @{N='Benutzer';E={$_.Properties[5].Value}},
    @{N='Quelle';E={$_.Properties[19].Value}}

Ergebnisse exportieren

# Als CSV exportieren
Get-WinEvent -LogName System -MaxEvents 100 |
    Where-Object Level -le 2 |
    Export-Csv C:\Temp\fehler.csv -NoTypeInformation -Encoding UTF8

Tipp: Level-Werte: 1 = Kritisch, 2 = Fehler, 3 = Warnung, 4 = Information. -FilterHashtable ist deutlich schneller als Where-Object, weil der Filter direkt am Provider greift.

Remote
Fortgeschritten

Remote-Verwaltung

Andere PCs per PowerShell fernsteuern — einzeln oder viele gleichzeitig.

Mehr lesen

WinRM aktivieren (auf dem Ziel-PC)

# Als Administrator ausfuehren
Enable-PSRemoting -Force

# Pruefen ob WinRM laeuft
Get-Service WinRM
Test-WSMan -ComputerName localhost

Interaktive Remote-Sitzung

# Remote-Shell oeffnen (wie SSH)
Enter-PSSession -ComputerName Server01

# Auf dem Remote-PC arbeiten...
Get-Service | Where-Object Status -eq Running
hostname

# Sitzung beenden
Exit-PSSession

Befehle auf Remote-PCs ausführen

# Einzelner PC
Invoke-Command -ComputerName Server01 -ScriptBlock {
    Get-Process | Sort-Object CPU -Descending | Select-Object -First 5
}

# Mehrere PCs gleichzeitig
$pcs = @("PC01", "PC02", "PC03")
Invoke-Command -ComputerName $pcs -ScriptBlock {
    Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 1
}

Credentials sicher übergeben

# Anmeldedaten abfragen (sicheres Popup)
$cred = Get-Credential

# Mit Credentials verbinden
Enter-PSSession -ComputerName Server01 -Credential $cred
Invoke-Command -ComputerName Server01 -Credential $cred -ScriptBlock { hostname }

Tipp: Im Domänennetzwerk funktioniert WinRM meist direkt. In Arbeitsgruppen muss der Ziel-PC in die TrustedHosts-Liste: Set-Item WSMan:\localhost\Client\TrustedHosts -Value "PC01"

System
Profi

Registry & WMI/CIM

Registry-Werte lesen und setzen, Hardware und System über WMI/CIM abfragen.

Mehr lesen

Registry lesen und schreiben

PowerShell behandelt die Registry wie ein Dateisystem mit den Laufwerken HKLM: und HKCU:.

# Registry-Schluessel auflisten
Get-ChildItem HKCU:\Software\Microsoft\Windows\CurrentVersion\Run

# Bestimmten Wert lesen
Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name ProgramFilesDir

# Neuen Wert erstellen
New-ItemProperty -Path "HKCU:\Software\MeineTool" -Name "Einstellung" -Value "Aktiv" -PropertyType String

# Wert aendern
Set-ItemProperty -Path "HKCU:\Software\MeineTool" -Name "Einstellung" -Value "Inaktiv"

# Wert loeschen
Remove-ItemProperty -Path "HKCU:\Software\MeineTool" -Name "Einstellung"

# Ganzen Schluessel loeschen
Remove-Item -Path "HKCU:\Software\MeineTool" -Recurse

WMI/CIM-Abfragen

Get-CimInstance ersetzt das ältere Get-WmiObject und ist schneller und sicherer.

InformationBefehl
BetriebssystemGet-CimInstance Win32_OperatingSystem
BIOS-InformationenGet-CimInstance Win32_BIOS
FestplattenGet-CimInstance Win32_DiskDrive
RAM-ModuleGet-CimInstance Win32_PhysicalMemory
NetzwerkadapterGet-CimInstance Win32_NetworkAdapter -Filter "NetEnabled=True"
Installierte SoftwareGet-CimInstance Win32_Product

Erweiterte CIM-Abfragen

# Mit Filter (schneller als Where-Object)
Get-CimInstance Win32_Service -Filter "StartMode='Auto' AND State='Stopped'"

# WQL-Query (SQL-aehnlich)
Get-CimInstance -Query "SELECT * FROM Win32_LogicalDisk WHERE DriveType=3 AND FreeSpace < 10737418240"

# Festplattenstatus mit Formatierung
Get-CimInstance Win32_LogicalDisk -Filter "DriveType=3" | ForEach-Object {
    [PSCustomObject]@{
        Laufwerk = $_.DeviceID
        GesamtGB = [math]::Round($_.Size / 1GB, 1)
        FreiGB   = [math]::Round($_.FreeSpace / 1GB, 1)
        FreiProzent = [math]::Round(($_.FreeSpace / $_.Size) * 100, 1)
    }
} | Format-Table -AutoSize

Tipp: Get-CimInstance funktioniert auch remote mit -ComputerName. Für eine Liste aller WMI-Klassen: Get-CimClass -Namespace root/cimv2 | Where-Object CimClassName -like "Win32_*"

Automatisierung
Profi

Aufgabenplanung per PowerShell

Geplante Aufgaben erstellen, verwalten und automatisieren — ohne GUI.

Mehr lesen

Geplante Aufgaben anzeigen

# Alle Aufgaben auflisten
Get-ScheduledTask | Format-Table TaskName, State, TaskPath

# Bestimmte Aufgabe suchen
Get-ScheduledTask -TaskName "*backup*"

# Details einer Aufgabe
Get-ScheduledTask -TaskName "MeinBackup" | Get-ScheduledTaskInfo

Neue Aufgabe erstellen

# 1. Trigger definieren (wann?)
$trigger = New-ScheduledTaskTrigger -Daily -At "06:00"

# 2. Aktion definieren (was?)
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
    -Argument "-File C:\Scripts\Backup.ps1 -NoProfile -ExecutionPolicy Bypass"

# 3. Aufgabe registrieren
Register-ScheduledTask -TaskName "TaeglichesBackup" `
    -Trigger $trigger -Action $action `
    -Description "Fuehrt das Backup-Skript taeglich um 6 Uhr aus" `
    -RunLevel Highest

Weitere Trigger-Beispiele

# Beim Systemstart
$trigger = New-ScheduledTaskTrigger -AtStartup

# Woechentlich (Mo, Mi, Fr)
$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday,Wednesday,Friday -At "08:00"

# Bei Anmeldung
$trigger = New-ScheduledTaskTrigger -AtLogOn

Aufgaben steuern

# Aufgabe manuell starten
Start-ScheduledTask -TaskName "TaeglichesBackup"

# Aufgabe deaktivieren / aktivieren
Disable-ScheduledTask -TaskName "TaeglichesBackup"
Enable-ScheduledTask -TaskName "TaeglichesBackup"

# Aufgabe loeschen
Unregister-ScheduledTask -TaskName "TaeglichesBackup" -Confirm:$false

Praxis: Tägliches Temp-Cleanup

$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument @"
-NoProfile -Command "Get-ChildItem $env:TEMP -Recurse -File |
    Where-Object LastWriteTime -lt (Get-Date).AddDays(-7) |
    Remove-Item -Force -ErrorAction SilentlyContinue"
"@
$trigger = New-ScheduledTaskTrigger -Daily -At "03:00"
Register-ScheduledTask -TaskName "TempCleanup" -Action $action -Trigger $trigger -RunLevel Highest

Tipp: Mit -RunLevel Highest läuft die Aufgabe mit erhöhten Rechten. Teste Skripte immer erst manuell, bevor du sie automatisierst.

Erweitert
Profi

Module & Profile

PowerShell dauerhaft anpassen, Module installieren und eigene erstellen.

Mehr lesen

Das PowerShell-Profil ($PROFILE)

Das Profil ist ein Skript, das bei jedem Start automatisch ausgeführt wird.

# Profil-Pfad anzeigen
$PROFILE

# Profil erstellen (falls nicht vorhanden)
if (!(Test-Path $PROFILE)) { New-Item $PROFILE -Force }

# Profil bearbeiten
notepad $PROFILE

Nützliche Profil-Einträge

# Aliase setzen
Set-Alias -Name ll -Value Get-ChildItem
Set-Alias -Name np -Value notepad.exe

# Eigene Funktionen
function which ($command) { Get-Command $command | Select-Object Source }
function touch ($file) { if (!(Test-Path $file)) { New-Item $file } else { (Get-Item $file).LastWriteTime = Get-Date } }

# Begruessung
Write-Host "PowerShell bereit - $(Get-Date -Format 'dd.MM.yyyy HH:mm')" -ForegroundColor Cyan

Module verwalten

AktionBefehl
Geladene ModuleGet-Module
Verfügbare ModuleGet-Module -ListAvailable
Modul suchen (Gallery)Find-Module -Name *Active*
Modul installierenInstall-Module -Name PSReadLine -Scope CurrentUser
Modul ladenImport-Module ActiveDirectory
Modul aktualisierenUpdate-Module -Name PSReadLine

Eigenes Modul erstellen

# 1. Modulordner erstellen
$modulPfad = "$env:USERPROFILE\Documents\PowerShell\Modules\MeinModul"
New-Item $modulPfad -ItemType Directory -Force

# 2. Moduldatei (MeinModul.psm1)
@'
function Get-SystemReport {
    [PSCustomObject]@{
        Computer  = $env:COMPUTERNAME
        OS        = (Get-CimInstance Win32_OperatingSystem).Caption
        Uptime    = (Get-Date) - (Get-CimInstance Win32_OperatingSystem).LastBootUpTime
        FreiGB    = [math]::Round((Get-PSDrive C).Free / 1GB, 1)
    }
}
Export-ModuleMember -Function Get-SystemReport
'@ | Set-Content "$modulPfad\MeinModul.psm1"

# 3. Modul laden und nutzen
Import-Module MeinModul
Get-SystemReport

Tipp: Die PowerShell Gallery (powershellgallery.com) enthält tausende Community-Module. Beliebte Module: PSReadLine (bessere Eingabe), Terminal-Icons (Datei-Icons), Pester (Testing).