it-swarm.com.de

Wie fange ich die Ausgabe von einem externen Prozess in PowerShell in einer Variablen auf?

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.

113
Adam Bertram

Hast du es versucht:

$OutputVariable = (Shell command) | Out-String

133
JNK

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
18
manojlds

Oder probiere es aus. Die Ausgabe wird in der Variablen $ scriptOutput erfasst:

& "netdom.exe" $params | Tee-Object -Variable scriptOutput | Out-Null

$scriptOutput
9
Finzzownt

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.

8
Davidiam

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)
2
sevenforce

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.

0
Kelly Davis