Saída do comando como string

Saída do comando como string

Quero obter a saída do comando C:\Program Files (x86)\Java\jre7\bin\java.exe" -versioncomo 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)

$outvariável parece vazia.

O que estou fazendo de errado?

Responder1

O java -versioncomando 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.batchamado 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.exediretamente 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.ErrorRecordpara System.String.

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

informação relacionada