Saída do comando como string

6

Eu quero obter a saída do comando C:\Program Files (x86)\Java\jre7\bin\java.exe" -version como variável de string.

Eu tentei assim: $out = &"C:\Program Files (x86)\Java\jre7\bin\java.exe" -version

mas apresenta uma mensagem de erro:

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)
A variável

$out parece vazia.

O que estou fazendo de errado?

    
por rik 29.06.2012 / 23:01

2 respostas

8

O comando java -version grava sua saída no fluxo de erro padrão em vez do fluxo de saída std (e é por isso que você vê esse erro). No powershell, o fluxo de erros não é transmitido ao longo do pipeline. Uma solução que funcione é criar um arquivo de lote simples do Windows que redireciona o fluxo de erro para o fluxo de saída. Por exemplo, crie um arquivo chamado getJavaVersion.bat que se pareça com isto:

@echo off
"C:\Program Files (x86)\Java\jre7\bin\java.exe" -version 2>&1

Então, você pode chamar isso diretamente do powershell como esperado:

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)


Se você não quiser criar esse arquivo extra, poderá chamar cmd.exe diretamente para obter os mesmos resultados:

$out = cmd.exe /c '"C:\Program Files (x86)\Java\jre7\bin\java.exe" -version  2>&1'


Ou você pode redirecionar a saída StdERR diretamente para $ out, o que colocará cada um dos objetos de erro (2 neste caso) em $ out (reformulado como um array). Você pode ler cada um deles, ou o melhor para você, de volta para uso:

$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.

Saída:

2
Java(TM) SE Runtime Environment (build 1.7.0_05-b05) Java HotSpot(TM)
Client VM (build 23.1-b03, mixed mode, sharing)

Relacionados: Usando a linha de comando nativa do powershell app e captura STDERR

    
por 30.06.2012 / 00:25
2
java -version  2>&1 | foreach-object {$_.tostring()}

redireciona stderr para stdout e converte System.Management.Automation.ErrorRecord para System.String .

Isso funciona com outros aplicativos de linha de comando que gravam no stderr.

    
por 21.01.2013 / 16:19

Tags