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