Ich möchte einen externen Prozess ausführen und dessen Befehlsausgabe in einer Variablen in PowerShell erfassen. Ich verwende das derzeit:
$params = "/verify $pc /domain:hosp.uhhg.org"
start-process "netdom.exe" $params -WindowStyle Hidden -Wait
Ich habe bestätigt, dass der Befehl ausgeführt wird, aber ich muss die Ausgabe in einer Variablen erfassen. Das heißt, ich kann den -RedirectOutput nicht verwenden, da dieser nur zu einer Datei umleitet.
Hast du es versucht:
$OutputVariable = (Shell command) | Out-String
Wenn Sie auch die Fehlerausgabe umleiten möchten, müssen Sie Folgendes tun:
$cmdOutput = command 2>&1
Oder, wenn der Programmname Leerzeichen enthält:
$cmdOutput = & "command with spaces" 2>&1
Oder probiere es aus. Die Ausgabe wird in der Variablen $ scriptOutput erfasst:
& "netdom.exe" $params | Tee-Object -Variable scriptOutput | Out-Null
$scriptOutput
Ein weiteres Beispiel aus der Praxis:
$result = & "$env:cust_tls_store\Tools\WDK\x64\devcon.exe" enable $strHwid 2>&1 | Out-String
Beachten Sie, dass dieses Beispiel einen Pfad enthält (der mit einer Umgebungsvariablen beginnt). Beachten Sie, dass die Anführungszeichen den Pfad und die EXE-Datei umschließen müssen, nicht jedoch die Parameter!
Hinweis: Vergessen Sie nicht das &
-Zeichen vor dem Befehl, aber außerhalb der Anführungszeichen.
Die Fehlerausgabe wird ebenfalls erfasst.
Es hat eine Weile gedauert, bis diese Kombination funktioniert hat, also dachte ich, ich würde sie teilen.
Ich habe die Antworten ausprobiert, aber in meinem Fall habe ich die Rohausgabe nicht erhalten. Stattdessen wurde es in eine PowerShell-Ausnahme konvertiert.
Das rohe Ergebnis bekam ich mit:
$rawOutput = (cmd /c <command> 2`>`&1)
Wenn Sie nur die Ausgabe eines Befehls erfassen möchten, funktioniert dies gut.
Ich verwende es zum Ändern der Systemzeit, da [timezoneinfo]::local
immer die gleichen Informationen erzeugt, sogar nachdem Sie Änderungen am System vorgenommen haben. Nur so kann ich die Änderung der Zeitzone überprüfen und protokollieren:
$NewTime = (powershell.exe -command [timezoneinfo]::local)
$NewTime | Tee-Object -FilePath $strLFpath\$strLFName -Append
Das bedeutet, dass ich eine neue PowerShell - Sitzung öffnen muss, um die Systemvariablen neu zu laden.