Befehlsausgabe als String

Befehlsausgabe als String

Ich möchte die Ausgabe vom Befehl C:\Program Files (x86)\Java\jre7\bin\java.exe" -versionals Zeichenfolgenvariable erhalten.

Ich habe es folgendermaßen versucht: $out = &"C:\Program Files (x86)\Java\jre7\bin\java.exe" -version

aber es gibt eine Fehlermeldung:

java.exe : java version "1.7.0_05"
At line:1 char:9
+ $out = & <<<< "C:\Program Files (x86)\Java\jre7\bin\java.exe" -version
    + CategoryInfo          : NotSpecified: (java version "1.7.0_05":String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

Java(TM) SE Runtime Environment (build 1.7.0_05-b05)


Java HotSpot(TM) Client VM (build 23.1-b03, mixed mode, sharing)

$outVariable scheint leer.

Was mache ich falsch?

Antwort1

Der java -versionBefehl schreibt seine Ausgabe in den Standardfehlerstrom statt in den Standardausgabestrom (weshalb Sie diesen Fehler sehen). In Powershell wird der Fehlerstrom nicht durch die Pipeline geleitet. Eine funktionierende Problemumgehung besteht darin, eine einfache Windows-Batchdatei zu erstellen, die den Fehlerstrom in den Ausgabestrom umleitet. Erstellen Sie beispielsweise eine Datei namens „caled“, getJavaVersion.batdie wie folgt aussieht:

@echo off
"C:\Program Files (x86)\Java\jre7\bin\java.exe" -version 2>&1

Anschließend können Sie es wie erwartet direkt aus Powershell aufrufen:

PS C:\Temp> $out = .\getJavaVersion.bat
PS C:\Temp> $out
java version "1.7.0_05"
Java(TM) SE Runtime Environment (build 1.7.0_05-b05)
Java HotSpot(TM) Client VM (build 23.1-b03, mixed mode, sharing)


Wenn Sie diese zusätzliche Datei nicht erstellen möchten, können Sie cmd.exedirekt aufrufen, um dieselben Ergebnisse zu erhalten:

$out = cmd.exe /c '"C:\Program Files (x86)\Java\jre7\bin\java.exe" -version  2>&1'


Oder Sie können die StdERR-Ausgabe direkt in $out umleiten, wodurch jedes der Fehlerobjekte (in diesem Fall 2) in $out eingefügt wird (umgewandelt in ein Array). Sie können dann jedes oder das für Sie beste Objekt zur Verwendung zurücklesen:

$out = &"C:\Program Files (x86)\Java\jre7\bin\java.exe" -version 2>&1
$out.Count   // Show number of errors returned
$out[1]      // Show second error in array.

Ausgabe:

2
Java(TM) SE Runtime Environment (build 1.7.0_05-b05) Java HotSpot(TM)
Client VM (build 23.1-b03, mixed mode, sharing)

Verwandt:Rufen Sie mit Powershell die native Befehlszeilen-App auf und erfassen Sie STDERR

Antwort2

java -version  2>&1 | foreach-object {$_.tostring()}

leitet stderr auf stdout um und konvertiert System.Management.Automation.ErrorRecordin System.String.

Dies funktioniert mit anderen Befehlszeilen-Anwendungen, die in stderr schreiben.

verwandte Informationen