Nachdem die grundlegenden PowerShell Cmdlets in PowerSell Top 25 Befehle vorgestellt wurden, geht es jetzt auf das nächste Level. Diese 25 fortgeschrittenen Cmdlets erweitern Ihre PowerShell-Toolbox erheblich und ermöglichen komplexere Automatisierungs- und Verwaltungsaufgaben.
Erweiterte PowerShell Cmdlets
26. Invoke-Command
Führt Befehle auf lokalen oder entfernten Computern aus.
Invoke-Command -ComputerName "Server01" -ScriptBlock {Get-Process}
Invoke-Command -ComputerName "Server01", "Server02" -ScriptBlock {Get-Service -Name "Spooler"}
icm -ComputerName $servers -FilePath "C:\Scripts\maintenance.ps1"
Console Output:
ProcessName Id MachineName
----------- -- -----------
ApplicationHost 1234 Server01
chrome 5678 Server01
27. Enter-PSSession / Exit-PSSession
Startet/beendet eine interaktive Sitzung mit einem entfernten Computer.
Enter-PSSession -ComputerName "Server01"
Enter-PSSession -ComputerName "Server01" -Credential $cred
Exit-PSSession
Console Output:
[Server01]: PS C:\Users\Administrator\Documents>
# Interaktive Sitzung auf dem entfernten Computer
[Server01]: PS C:\Users\Administrator\Documents> Exit-PSSession
PS C:\>
28. New-PSSession / Remove-PSSession
Erstellt/entfernt persistente PowerShell-Sitzungen.
$session = New-PSSession -ComputerName "Server01"
Invoke-Command -Session $session -ScriptBlock {Get-Date}
Remove-PSSession -Session $session
Console Output:
Id Name ComputerName ComputerType State ConfigurationName Availability
-- ---- ------------ ------------ ----- ----------------- ------------
1 WinRM1 Server01 RemoteMachine Opened Microsoft.PowerShell Available
29. Test-Connection
Testet die Netzwerkverbindung zu Computern (PowerShell-Ping).
Test-Connection -ComputerName "google.com"
Test-Connection -ComputerName "Server01" -Count 2 -Quiet
Test-Connection -ComputerName @("Server01", "Server02", "Server03")
Console Output:
Source Destination IPV4Address IPV6Address Bytes Time(ms)
------ ----------- ----------- ----------- ----- --------
DESKTOP-ABC google.com 172.217.16.142 32 15
DESKTOP-ABC google.com 172.217.16.142 32 12
30. Get-NetAdapter / Get-NetIPAddress
Zeigt Netzwerkadapter und IP-Konfiguration an.
Get-NetAdapter
Get-NetAdapter | Where-Object {$_.Status -eq "Up"}
Get-NetIPAddress -AddressFamily IPv4
Console Output:
Name InterfaceDescription ifIndex Status MacAddress
---- -------------------- ------- ------ ----------
Ethernet Intel(R) Ethernet Connection 12 Up AA-BB-CC-DD-EE-FF
Wi-Fi Intel(R) Wireless-AC 9560 18 Disconnected BB-CC-DD-EE-FF-AA
31. Get-EventLog / Get-WinEvent
Erweiterte Ereignisprotokoll-Abfragen.
Get-WinEvent -LogName "Application" -MaxEvents 10
Get-WinEvent -FilterHashtable @{LogName="System"; Level=2; StartTime=(Get-Date).AddDays(-1)}
Get-EventLog -LogName Security -InstanceId 4624 -Newest 5
Console Output:
ProviderName: Microsoft-Windows-Kernel-General
TimeCreated Id LevelDisplayName Message
----------- -- ---------------- -------
30.05.2025 10:35:42 1 Information The system time has changed...
32. Get-Credential
Fordert Benutzeranmeldeinformationen sicher an.
$cred = Get-Credential
$cred = Get-Credential -UserName "Domain\Administrator"
Invoke-Command -ComputerName "Server01" -Credential $cred -ScriptBlock {Get-Service}
Console Output:
# Öffnet ein Dialog-Fenster zur Eingabe von Benutzername und Passwort
33. ConvertTo-Html / ConvertTo-Json / ConvertTo-Xml
Konvertiert Objekte in verschiedene Formate.
Get-Process | ConvertTo-Html | Out-File "processes.html"
Get-Service | ConvertTo-Json | Out-File "services.json"
Get-Process | ConvertTo-Xml -As Document | Out-File "processes.xml"
Console Output:
# HTML Output (Auszug):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>HTML TABLE</title>
34. ConvertFrom-Json / ConvertFrom-Csv
Konvertiert strukturierte Daten zurück in PowerShell-Objekte.
$json = Get-Content "data.json" | ConvertFrom-Json
$csv = Get-Content "data.csv" | ConvertFrom-Csv
'{"Name":"John","Age":30}' | ConvertFrom-Json
Console Output:
Name Age
---- ---
John 30
35. Compare-Object
Vergleicht zwei Objektsätze und zeigt Unterschiede an.
$processes1 = Get-Process
Start-Sleep 5
$processes2 = Get-Process
Compare-Object $processes1 $processes2 -Property Name
Console Output:
Name SideIndicator
---- -------------
notepad =>
chrome <=
36. Tee-Object
Sendet Eingabe an eine Datei und an die Pipeline.
Get-Process | Tee-Object -FilePath "processes.txt" | Where-Object {$_.CPU -gt 10}
ls | Tee-Object -Variable fileList | Measure-Object
Console Output:
# Zeigt gefilterte Prozesse UND speichert alle Prozesse in der Datei
37. Out-File / Out-String / Out-Null
Verschiedene Ausgabeziele für Daten.
Get-Process | Out-File "processes.txt"
Get-Date | Out-String
Get-Process | Out-Null # Unterdrückt Ausgabe
38. Write-Host / Write-Output / Write-Warning
Verschiedene Arten der Textausgabe.
Write-Host "Dies ist eine Meldung" -ForegroundColor Green
Write-Output "Dies geht in die Pipeline"
Write-Warning "Dies ist eine Warnung"
Write-Error "Dies ist ein Fehler"
Console Output:
Dies ist eine Meldung
Dies geht in die Pipeline
WARNING: Dies ist eine Warnung
Write-Error: Dies ist ein Fehler
39. Start-Job / Get-Job / Receive-Job
Background-Jobs für asynchrone Ausführung.
Start-Job -ScriptBlock {Get-Process | Sort-Object CPU -Descending}
Get-Job
Receive-Job -Id 1 -Keep
Console Output:
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Completed True localhost Get-Process | Sort-Object CPU -Descending
40. Start-Process
Startet neue Prozesse mit erweiterten Optionen.
Start-Process "notepad.exe"
Start-Process "cmd.exe" -ArgumentList "/c dir" -Wait
Start-Process "powershell.exe" -Verb RunAs # Als Administrator
41. Stop-Process
Beendet Prozesse mit verschiedenen Kriterien.
Stop-Process -Name "notepad"
Stop-Process -Id 1234 -Force
Get-Process "*chrome*" | Stop-Process -Confirm
42. Register-ScheduledTask / Get-ScheduledTask
Verwaltet geplante Aufgaben.
Get-ScheduledTask | Where-Object {$_.State -eq "Running"}
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File C:\Scripts\backup.ps1"
$trigger = New-ScheduledTaskTrigger -Daily -At 2AM
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "DailyBackup"
Console Output:
TaskPath TaskName State
-------- -------- -----
\ Adobe Acrobat Update Task Ready
\ GoogleUpdateTaskMachineCore Ready
43. Get-Module / Import-Module
Verwaltet PowerShell-Module.
Get-Module -ListAvailable
Import-Module ActiveDirectory
Get-Module | Where-Object {$_.Name -like "*Azure*"}
Console Output:
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Manifest 1.0.0.0 ActiveDirectory {Add-ADCentralAccessPolicyMember, Add-ADComputerServiceAccount...}
44. Test-Path
Testet, ob Pfade existieren.
Test-Path "C:\Windows"
Test-Path "C:\NonExistent" -PathType Container
Test-Path "HKLM:\SOFTWARE\Microsoft" -PathType Container
Console Output:
True
False
True
45. Resolve-Path / Split-Path / Join-Path
Pfad-Manipulation und -Auflösung.
Resolve-Path ".\*"
Split-Path "C:\Windows\System32\notepad.exe" -Parent
Join-Path "C:\Windows" "System32"
Console Output:
Path
----
C:\Users\Username\Documents\file1.txt
C:\Users\Username\Documents\folder1
46. Get-Date / Set-Date
Datum- und Zeitverwaltung.
Get-Date
Get-Date -Format "yyyy-MM-dd HH:mm:ss"
(Get-Date).AddDays(-7)
Set-Date "30.05.2025 15:30:00"
Console Output:
Freitag, 30. Mai 2025 10:35:42
2025-05-30 10:35:42
Freitag, 23. Mai 2025 10:35:42
47. New-Object
Erstellt neue .NET-Objekte.
$object = New-Object PSObject -Property @{Name="John"; Age=30}
$date = New-Object System.DateTime 2025,5,30
$webClient = New-Object System.Net.WebClient
Console Output:
Age Name
--- ----
30 John
48. Add-Member
Fügt Eigenschaften und Methoden zu Objekten hinzu.
$object = New-Object PSObject
$object | Add-Member -MemberType NoteProperty -Name "Name" -Value "John"
$object | Add-Member -MemberType ScriptMethod -Name "SayHello" -Value {Write-Host "Hello, $($this.Name)!"}
49. Get-Random
Generiert Zufallszahlen und -werte.
Get-Random
Get-Random -Minimum 1 -Maximum 100
Get-Random -InputObject @("Red", "Green", "Blue")
1..10 | Get-Random -Count 3
Console Output:
1804289383
42
Blue
7
3
9
50. Measure-Command
Misst die Ausführungszeit von Befehlen.
Measure-Command {Get-Process}
Measure-Command {1..1000 | ForEach-Object {$_ * 2}}
Console Output:
Days : 0
Hours : 0
Minutes : 0
Seconds : 0
Milliseconds : 234
TotalMilliseconds : 234.5678
Erweiterte Techniken
Splatting für Parameter
Verwenden Sie Hash-Tables für übersichtlichere Parameter:
$params = @{
ComputerName = "Server01"
ScriptBlock = {Get-Service}
Credential = $cred
}
Invoke-Command @params
Advanced Functions
Erstellen Sie eigene Cmdlets:
function Get-SystemInfo {
[CmdletBinding()]
param(
[string[]]$ComputerName = $env:COMPUTERNAME
)
foreach ($computer in $ComputerName) {
$os = Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName $computer
[PSCustomObject]@{
ComputerName = $computer
OS = $os.Caption
Memory = [math]::Round($os.TotalVisibleMemorySize/1MB, 2)
LastBoot = $os.LastBootUpTime
}
}
}
Pipeline-Optimierung
Nutzen Sie Begin, Process, End-Blöcke:
filter Skip-Empty {
if ($_ -and $_.Trim() -ne "") {
$_
}
}
Get-Content "file.txt" | Skip-Empty | Measure-Object -Line
Error Handling
Robuste Fehlerbehandlung:
try {
Get-Process -Name "NonExistent" -ErrorAction Stop
} catch {
Write-Warning "Prozess nicht gefunden: $($_.Exception.Message)"
} finally {
Write-Host "Aufräumarbeiten abgeschlossen"
}
Praktische Anwendungsbeispiele
Systemüberwachung
# Umfassende Systemprüfung
$computers = @("Server01", "Server02", "Workstation01")
$results = Invoke-Command -ComputerName $computers -ScriptBlock {
[PSCustomObject]@{
ComputerName = $env:COMPUTERNAME
CPUUsage = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue
MemoryFree = [math]::Round((Get-Counter "\Memory\Available MBytes").CounterSamples.CookedValue/1024, 2)
DiskFree = (Get-CimInstance Win32_LogicalDisk -Filter "DriveType=3" |
Select-Object @{N="FreeGB";E={[math]::Round($_.FreeSpace/1GB,2)}}).FreeGB
LastBoot = (Get-CimInstance Win32_OperatingSystem).LastBootUpTime
}
}
$results | ConvertTo-Html | Out-File "SystemReport.html"
Automatisierte Berichte
# Täglicher Service-Status-Bericht
$date = Get-Date -Format "yyyy-MM-dd"
$services = Get-Service | Where-Object {$_.Status -eq "Stopped" -and $_.StartType -eq "Automatic"}
if ($services) {
$report = $services | ConvertTo-Html -Title "Gestoppte Services - $date"
$report | Out-File "ServiceReport_$date.html"
Write-Warning "$($services.Count) automatische Services sind gestoppt!"
}
Fazit
Diese 25 erweiterten Cmdlets eröffnen völlig neue Möglichkeiten für PowerShell-Automatisierung:
- Remote-Verwaltung: Invoke-Command, Enter-PSSession, New-PSSession
- Datenkonvertierung: ConvertTo-/ConvertFrom-Cmdlets
- Asynchrone Verarbeitung: Start-Job, Get-Job, Receive-Job
- Erweiterte Systemverwaltung: Get-ScheduledTask, Get-NetAdapter
- Robuste Skripterstellung: Test-Path, Measure-Command, Get-Random
Mit diesen Cmdlets können Sie komplexe Automatisierungsszenarien umsetzen und PowerShell zu einem mächtigen Werkzeug für Enterprise-Umgebungen machen!