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