
Quero obter a saída do comando C:\Program Files (x86)\Java\jre7\bin\java.exe" -version
como variável de string.
Eu tentei desta forma:
$out = &"C:\Program Files (x86)\Java\jre7\bin\java.exe" -version
mas dá 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)
$out
variável parece vazia.
O que estou fazendo de errado?
Responder1
O java -version
comando grava sua saída no fluxo de erro padrão em vez do fluxo de saída padrão (é por isso que você vê esse erro). No PowerShell, o fluxo de erros não é transmitido ao longo do pipeline. Uma solução alternativa que funciona é criar um arquivo em lote simples do Windows que redirecione o fluxo de erros para o fluxo de saída. Por exemplo, crie um arquivo getJavaVersion.bat
chamado assim:
@echo off
"C:\Program Files (x86)\Java\jre7\bin\java.exe" -version 2>&1
Então, você pode chamar isso diretamente do PowerShell conforme 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 não quiser criar esse arquivo extra, você pode ligar 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 então ler cada um, ou o melhor para você, antes de usar:
$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)
Relacionado:Usando o PowerShell, chame o aplicativo de linha de comando nativo e capture STDERR
Responder2
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 em stderr.