Salida del comando como cadena

Salida del comando como cadena

Quiero obtener el resultado del comando C:\Program Files (x86)\Java\jre7\bin\java.exe" -versioncomo variable de cadena.

Lo intenté de esta manera: $out = &"C:\Program Files (x86)\Java\jre7\bin\java.exe" -version

pero da mensaje de error:

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)

$outLa variable parece vacía.

¿Qué estoy haciendo mal?

Respuesta1

El java -versioncomando escribe su salida en el flujo de error estándar en lugar del flujo de salida estándar (razón por la cual ve ese error). En PowerShell, el flujo de errores no se pasa a lo largo de la canalización. Una solución alternativa que funciona es crear un archivo por lotes de Windows simple que redirija el flujo de error al flujo de salida. Por ejemplo, cree un archivo llamado getJavaVersion.batsimilar a este:

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

Luego, puedes llamarlo directamente desde PowerShell como esperas:

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)


Si no desea crear ese archivo adicional, puede llamar cmd.exedirectamente para obtener los mismos resultados:

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


O puede redirigir la salida StdERR directamente a $out, lo que colocará cada uno de los objetos de error (2 en este caso) en $out (reformulado como una matriz). Luego puede volver a leer cada uno, o el mejor para usted, para usarlos:

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

Producción:

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 PowerShell, llame a la aplicación de línea de comandos nativa y capture STDERR

Respuesta2

java -version  2>&1 | foreach-object {$_.tostring()}

redirige stderr a stdout y lo convierte System.Management.Automation.ErrorRecorda System.String.

Esto funciona con otras aplicaciones de línea de comandos que escriben en stderr.

información relacionada