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!