
Quiero obtener el resultado del comando C:\Program Files (x86)\Java\jre7\bin\java.exe" -version
como 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)
$out
La variable parece vacía.
¿Qué estoy haciendo mal?
Respuesta1
El java -version
comando 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.bat
similar 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.exe
directamente 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.ErrorRecord
a System.String
.
Esto funciona con otras aplicaciones de línea de comandos que escriben en stderr.