Was in einem Invoke-Command-Skriptblock nur angezeigt wird, ist für das aufrufende Skript verloren – Fehler inklusive. So geben Sie Ergebnisse und Fehler strukturiert zurück und schreiben sie ins Log.
Invoke-Command führt PowerShell-Befehle auf dem eigenen oder entfernten Computern aus – unverzichtbar für Automatisierung. Dabei stolpern viele über zwei Punkte: Ausgaben, die im Skriptblock nur angezeigt werden (Write-Host), stehen dem aufrufenden Skript nicht zur Verfügung, und Fehler werden zwar angezeigt, aber nicht als verarbeitbares Ergebnis zurückgegeben.
Der Ansatz aus der Community
Ein einfacher Weg: Fehler im Skriptblock mit try/catch abfangen und per Write-Output zurückgeben. Mit Tee-Object landet alles gleichzeitig in der Konsole und in einer Logdatei:
Invoke-Command -ScriptBlock {
$ErrorActionPreference = 'Stop'
try {
Get-Acl C:\Temp\nichtda.txt
Write-Output 'OK'
}
catch {
Write-Output "FEHLER: $($_.Exception.Message)"
}
} | Tee-Object -FilePath C:\Temp\log.txt -Append
Achtung
$ErrorActionPreference = 'Stop' muss innerhalb des Skriptblocks gesetzt werden. Bei Remote-Aufrufen (-ComputerName) läuft der Block in einer eigenen Sitzung – Einstellungen aus dem aufrufenden Skript gelten dort nicht.
Besser: strukturierte Ergebnisse
Noch robuster ist es, für jeden Aufruf ein Objekt zurückzugeben. Dann lässt sich das Ergebnis filtern, auswerten und als CSV oder JSON protokollieren:
$results = Invoke-Command -ComputerName SRV01, SRV02, SRV03 -ScriptBlock {
$ErrorActionPreference = 'Stop'
try {
$acl = Get-Acl 'C:\Daten'
[pscustomobject]@{ Computer = $env:COMPUTERNAME; Status = 'OK'; Detail = $acl.Owner }
}
catch {
[pscustomobject]@{ Computer = $env:COMPUTERNAME; Status = 'Fehler'; Detail = $_.Exception.Message }
}
} -ErrorAction SilentlyContinue -ErrorVariable remoteErrors
# Verbindungsfehler (Server nicht erreichbar) separat erfassen
$results += $remoteErrors | ForEach-Object {
[pscustomobject]@{ Computer = $_.TargetObject; Status = 'Nicht erreichbar'; Detail = $_.Exception.Message }
}
$results | Select-Object Computer, Status, Detail |
Export-Csv C:\Temp\ergebnis.csv -NoTypeInformation -Delimiter ';' -Encoding UTF8
Die wichtigsten Regeln
Write-OutputstattWrite-Hostfür alles, was weiterverarbeitet werden soll.- Fehler im Block abfangen, damit pro Computer ein klares Ergebnis entsteht.
- Verbindungsfehler außerhalb des Blocks über
-ErrorVariableerfassen – sie entstehen, bevor der Block überhaupt läuft. - Objekte statt Text zurückgeben; formatieren erst am Ende.
Heute
Die Hinweise gelten für Windows PowerShell 5.1 ebenso wie für PowerShell 7. In PowerShell 7 lohnt zusätzlich ein Blick auf ForEach-Object -Parallel für lokale Parallelisierung.