# PowerShell — objektbasierte Shell und Skriptsprache von Microsoft

> Praxis-Guide zu PowerShell: Cmdlets, objektbasierte Pipeline, Prozesse, Dienste und Skripte plattformübergreifend mit pwsh 7 steuern.

Source: https://www.jpkc.com/db/cheatsheets/shell-system/powershell/

<!-- PROSE:intro -->
PowerShell ist mehr als eine Shell: Ihre Pipeline reicht echte .NET-Objekte weiter statt bloßer Textzeilen – der zentrale Unterschied zu bash. Kommandos folgen dem klaren `Verb-Noun`-Schema wie `Get-Process` oder `Get-ChildItem`, und mit `Get-Help` sowie `Get-Command` erschließt du dir den Rest selbst. Seit PowerShell 7 (`pwsh`) läuft sie plattformübergreifend auf Windows, Linux und macOS. Dieser Guide zeigt dir die Cmdlets für Navigation, Prozesse, Pipeline und Skripte, die du täglich brauchst.
<!-- PROSE:intro:end -->

## Grundlagen & Navigation

`Get-Location` — Zeigt das aktuelle Verzeichnis (Alias: pwd).

```bash
Get-Location
```

`Set-Location <path>` — Wechselt das Verzeichnis (Alias: cd).

```bash
Set-Location C:\Users
```

`Get-ChildItem` — Listet Dateien und Verzeichnisse auf (Alias: ls, dir).

```bash
Get-ChildItem -Recurse -Filter *.log
```

`Get-Content <file>` — Zeigt den Inhalt einer Datei (Alias: cat, type).

```bash
Get-Content C:\logs\app.log -Tail 20
```

`Get-Command <name>` — Findet Kommandos nach Name oder Muster.

```bash
Get-Command *-Service
```

`Get-Help <cmdlet>` — Zeigt die Hilfe zu einem Cmdlet.

```bash
Get-Help Get-Process -Examples
```

`Get-Alias <alias>` — Zeigt, worauf ein Alias verweist.

```bash
Get-Alias ls
```

## Prozesse & Dienste

`Get-Process` — Listet alle laufenden Prozesse auf.

```bash
Get-Process | Sort-Object CPU -Descending | Select -First 10
```

`Stop-Process -Name <name>` — Beendet einen Prozess anhand des Namens.

```bash
Stop-Process -Name notepad
```

`Stop-Process -Id <pid>` — Beendet einen Prozess anhand der PID.

```bash
Stop-Process -Id 1234 -Force
```

`Get-Service` — Listet alle Dienste auf.

```bash
Get-Service | Where-Object Status -eq Running
```

`Start-Service <name>` — Startet einen Dienst.

```bash
Start-Service -Name wuauserv
```

`Stop-Service <name>` — Stoppt einen Dienst.

```bash
Stop-Service -Name Spooler
```

`Restart-Service <name>` — Startet einen Dienst neu.

```bash
Restart-Service -Name nginx
```

## Dateien & Text

`Copy-Item <src> <dest>` — Kopiert Dateien oder Verzeichnisse (Alias: cp, copy).

```bash
Copy-Item -Path .\config -Destination .\backup -Recurse
```

`Move-Item <src> <dest>` — Verschiebt oder benennt Dateien um (Alias: mv, move).

```bash
Move-Item old.txt new.txt
```

`Remove-Item <path>` — Löscht Dateien oder Verzeichnisse (Alias: rm, del).

```bash
Remove-Item -Path .\temp -Recurse -Force
```

`New-Item -ItemType File <name>` — Erstellt eine neue Datei.

```bash
New-Item -ItemType File -Name config.json
```

`New-Item -ItemType Directory <name>` — Erstellt ein neues Verzeichnis (Alias: mkdir).

```bash
New-Item -ItemType Directory -Name logs
```

`Select-String -Pattern '<regex>' -Path <files>` — Sucht Text in Dateien (wie grep).

```bash
Select-String -Pattern 'error' -Path *.log -CaseSensitive
```

## Pipeline & Filtern

`| Where-Object { <condition> }` — Filtert Objekte in der Pipeline.

```bash
Get-Process | Where-Object { $_.CPU -gt 100 }
```

`| Select-Object <properties>` — Wählt bestimmte Eigenschaften aus Objekten aus.

```bash
Get-Process | Select-Object Name, CPU, WorkingSet | Sort-Object CPU -Descending
```

`| Sort-Object <property>` — Sortiert Objekte nach einer Eigenschaft.

```bash
Get-ChildItem | Sort-Object Length -Descending
```

`| Format-Table` — Gibt die Ausgabe als Tabelle aus.

```bash
Get-Service | Format-Table Name, Status, StartType
```

`| Format-List` — Gibt die Ausgabe als detaillierte Liste aus.

```bash
Get-Process explorer | Format-List *
```

`| Measure-Object` — Zählt, summiert, mittelt, Min/Max von Objekten.

```bash
Get-ChildItem *.log | Measure-Object -Property Length -Sum
```

`| Export-Csv <file>` — Exportiert die Pipeline-Ausgabe als CSV.

```bash
Get-Process | Export-Csv processes.csv -NoTypeInformation
```

`| ConvertTo-Json` — Wandelt die Ausgabe in JSON um.

```bash
Get-Service | ConvertTo-Json | Out-File services.json
```

## System & Netzwerk

`Get-ComputerInfo` — Zeigt detaillierte Systeminformationen.

```bash
Get-ComputerInfo | Select OsName, OsVersion, CsTotalPhysicalMemory
```

`Get-NetIPAddress` — Zeigt die IP-Adressen aller Netzwerkschnittstellen.

```bash
Get-NetIPAddress -AddressFamily IPv4
```

`Test-NetConnection <host> -Port <port>` — Testet die Netzwerkverbindung (wie telnet/ping).

```bash
Test-NetConnection google.com -Port 443
```

`Invoke-WebRequest <url>` — Lädt eine Webseite oder Datei herunter (Alias: curl, wget).

```bash
Invoke-WebRequest -Uri https://example.com -OutFile page.html
```

`Invoke-RestMethod <url>` — Ruft eine REST-API auf und parst die JSON-Antwort.

```bash
Invoke-RestMethod -Uri https://api.github.com/repos/microsoft/terminal
```

`Get-WinEvent -LogName System -MaxEvents 20` — Zeigt die neuesten Einträge eines Ereignisprotokolls (Windows).

```bash
Get-WinEvent -LogName System -MaxEvents 20
```

## Variablen & Skripte

`$variable = <value>` — Setzt eine Variable.

```bash
$name = 'World'; Write-Host "Hello $name"
```

`$env:<VAR>` — Greift auf Umgebungsvariablen zu.

```bash
$env:PATH; $env:COMPUTERNAME
```

`if (<condition>) { } else { }` — Bedingte Ausführung.

```bash
if (Test-Path .\config.json) { 'Found' } else { 'Missing' }
```

`foreach ($item in $collection) { }` — Iteriert über eine Auflistung.

```bash
foreach ($f in Get-ChildItem *.txt) { Write-Host $f.Name }
```

`Set-ExecutionPolicy RemoteSigned` — Erlaubt das Ausführen lokaler Skripte (einmalig nötig).

```bash
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
```

`.\<script>.ps1` — Führt ein PowerShell-Skript aus.

```bash
.\deploy.ps1
```

<!-- PROSE:outro -->
## Fazit

PowerShell verbindet interaktive Shell und vollwertige Skriptsprache – wer das objektbasierte Pipeline-Modell verinnerlicht, filtert und formatiert Daten mit `Where-Object`, `Select-Object` und `Format-Table` weit präziser als mit reiner Textverarbeitung. Für plattformübergreifende Arbeit greifst du zu PowerShell 7 (`pwsh`); das ältere Windows PowerShell 5.1 bleibt Windows-only und enthält Altlasten wie `Get-EventLog`. Achte auf die Execution Policy: `RemoteSigned` ist ein sinnvoller Standard, der lokale Skripte erlaubt, heruntergeladene aber signiert verlangt – setze nicht leichtfertig `Bypass` oder `Unrestricted` und prüfe fremde Skripte, bevor du sie ausführst.

## Weiterführende Links

- [Microsoft Learn: PowerShell-Dokumentation](https://learn.microsoft.com/de-de/powershell/) – offizielle deutschsprachige Dokumentation zu PowerShell und allen Cmdlets
- [Microsoft Learn: about_Execution_Policies](https://learn.microsoft.com/de-de/powershell/module/microsoft.powershell.core/about/about_execution_policies) – Ausführungsrichtlinien verstehen und sicher konfigurieren
<!-- PROSE:outro:end -->

## Verwandte Kommandos

- [bash](https://www.jpkc.com/db/cheatsheets/shell-system/bash/) – die GNU-Bourne-Again-Shell, Standard-Shell unter Linux
- [zsh](https://www.jpkc.com/db/cheatsheets/shell-system/zsh/) – die Z shell mit erweiterter Completion und Plugins
- [wsl](https://www.jpkc.com/db/cheatsheets/shell-system/wsl/) – Windows-Subsystem für Linux, brückt PowerShell und Linux-Shells

