
Я хочу получить вывод команды C:\Program Files (x86)\Java\jre7\bin\java.exe" -version
в виде строковой переменной.
Я попробовал так:
$out = &"C:\Program Files (x86)\Java\jre7\bin\java.exe" -version
но выдает сообщение об ошибке:
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
переменная кажется пустой.
Что я делаю не так?
решение1
Команда java -version
записывает свой вывод в стандартный поток ошибок вместо потока вывода std (именно поэтому вы видите эту ошибку). В PowerShell поток ошибок не передается по конвейеру. Обходной путь, который работает, — создать простой пакетный файл Windows, который перенаправляет поток ошибок в поток вывода. Например, создайте файл с именем, getJavaVersion.bat
который выглядит так:
@echo off
"C:\Program Files (x86)\Java\jre7\bin\java.exe" -version 2>&1
Затем вы можете вызвать его напрямую из PowerShell, как и ожидалось:
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)
Если вы не хотите создавать этот дополнительный файл, то вы можете вызвать его cmd.exe
напрямую, чтобы получить тот же результат:
$out = cmd.exe /c '"C:\Program Files (x86)\Java\jre7\bin\java.exe" -version 2>&1'
Или вы можете перенаправить вывод StdERR напрямую в $out, что поместит каждый из объектов ошибок (2 в данном случае) в $out (преобразовав его в массив). Затем вы можете прочитать каждый из них или наиболее подходящий для вас, обратно для использования:
$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.
Выход:
2
Java(TM) SE Runtime Environment (build 1.7.0_05-b05) Java HotSpot(TM)
Client VM (build 23.1-b03, mixed mode, sharing)
Связанный:Использование PowerShell для вызова собственного приложения командной строки и захвата STDERR
решение2
java -version 2>&1 | foreach-object {$_.tostring()}
перенаправляет stderr в stdout и преобразует System.Management.Automation.ErrorRecord
в System.String
.
Это работает и с другими приложениями командной строки, которые записывают данные в stderr.