Как получить версию Java в PowerShell

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

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

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, где это не должно быть необходимо.

2 ответов


один из способов-использование WMI:

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

еще один перенаправление в файл с start-process:

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()

Я использую Get-Command чтобы получить версию Java в PowerShell 5.1.

Get-Command java | Select-Object Version

возвращает объект. Если вам нужна строка, используйте:

(Get-Command java | Select-Object -ExpandProperty Version).toString()

выходы выглядят следующим образом:

PS > Get-Command java | Select-Object Version

Version
-------
8.0.1710.11



PS > Get-Command java | Select-Object -ExpandProperty Version

Major  Minor  Build  Revision
-----  -----  -----  --------
8      0      1710   11



PS > (Get-Command java | Select-Object -ExpandProperty Version).tostring()
8.0.1710.11

он работал довольно хорошо под PowerShell 5.1. У меня нет возможности проверить это на PowerShell версии 2.0.