2013-09-19 3 views
6

Я пытаюсь получить версию Java в PowerShell. Строка версии печатается на stderr, поэтому я пытаюсь перенаправить ее на stdout и назначить ее строковой переменной.Как получить версию Java в PowerShell

я получаю следующую странную ошибку:

PS P:\> & java -version 2>&1 
java.exe : java version "1.7.0_25" 
At line:1 char:2 
+ & <<<< java -version 2>&1 
    + CategoryInfo   : NotSpecified: (java version "1.7.0_25":String) [], RemoteException 
    + FullyQualifiedErrorId : NativeCommandError 

Java(TM) SE Runtime Environment (build 1.7.0_25-b17) 
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode) 

вызов без перенаправления (2> & 1) дает следующее:

PS P:\> & java -version 
java version "1.7.0_25" 
Java(TM) SE Runtime Environment (build 1.7.0_25-b17) 
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode) 

Я думаю, что Java здесь не имеет никакого значения, и то же самое будет происходить для любой другой программы, печатающей строки в stderr.

Версия PowerShell, которую я использую, - 2.0.

Вопросы:

  • Как можно перенаправить STDERR в переменную?
  • Или, альтернативно, как я могу проверить установленную версию Java?

Обход

Я могу запустить его так:

$output = & cmd /c "java -version 2>&1" 

Но я ненавижу работает cmd.exe, где оно не должно быть необходимым.

ответ

5

Одним из способов является использование WMI:

$javaver = Get-WmiObject -Class Win32_Product -Filter "Name like 'Java(TM)%'" | Select -Expand Version 

Еще один является перенаправление в файл с запуском процесса:

start-process java -ArgumentList "-version" -NoNewWindow -RedirectStandardError .\javaver.txt 

$javaver = gc .\javaver.txt 

del .\javaver.txt 

И мой последний является:

dir "HKLM:\SOFTWARE\JavaSoft\Java Runtime Environment" | select -expa pschildname -Last 1 

Что касается как перенаправление stderr в этом случае вы можете сделать:

$out = &"java.exe" -version 2>&1 
$out[0].tostring() 
+0

Хороший подход! Не работал для меня именно так (что-то связанное с -Filter), но работал как: Get-WmiObject -Class Win32_Product | Where-Object {$ _. Name.StartsWith ('Java')} | Select -Expand Version – Ivan

+0

@Ivan Вы можете попробовать с '' Name like 'Java%' "' и дайте мне знать ... –

+0

Спасибо. Да, я знал о опции -RedirectStandardError для Start-Process, но ненавижу создание файла только по этой простой причине ... – Ivan

Смежные вопросы