Вывод команды в виде строки

Вывод команды в виде строки

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

Связанный контент