
Ich möchte die Ausgabe vom Befehl C:\Program Files (x86)\Java\jre7\bin\java.exe" -version
als 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)
$out
Variable scheint leer.
Was mache ich falsch?
Antwort1
Der java -version
Befehl 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.bat
die 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.exe
direkt 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.ErrorRecord
in System.String
.
Dies funktioniert mit anderen Befehlszeilen-Anwendungen, die in stderr schreiben.