6

Я хочу получить вывод команды 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 кажется пустой.

Что я делаю неправильно?

2 ответа2

8

Команда 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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .