El Blog de Gualtrysoft

Windows 2000/2003/2008, Active Directory, VBScript, Hyper-V, PowerShell y todo aquello interesante a la hora de usar, configurar y administrar Windows Server. También tenemos longanizas…

Powershell Tip: Lanzar ejecutables y recuperar la salida de los mismos

Posted by urpiano en Miércoles 28 \28\UTC mayo \28\UTC 2014

Cuando se lanza un ejecutable desde una consola de Powershell o desde un script de Powershell nos puede interesar recuperar la salida estandar y la de errores para llevarla a una variable. Esto se puede hacer simplemente redirigiendo ambas salidas a un fichero, cargando el fichero y eliminádolo una vez cargado o terminado de operar con él ¿No sería mejor poder obtener ambas salidas de forma directa, sin necesidad de usar ese fichero “de paso”? La respuesta está en dos clases del espacio de nombres .NET System.Diagnostics: ProcessStartInfo y Process.
ProcessStartInfo nos permite establecer cómo queremos que sea lanzado un proceso y la clase Process nos permite lanzarlo. Con ProcessStartInfo vamos a poder estabecer:

  • Si queremos que se ejecute de forma que se puedan redirigir la entrada, la salida y los errores.
  • Establecer la redirección de entrada, salida y errores.

Veremos un ejemplo que obtendrá el resultado de hacer DIR sobre C:\.

Lo primero es crear el objeto ProcessStartInfo que lanzará CMD.EXE y como parámetros /C (hace que se cierre CMD.EXE una vez ejecutado) y DIR C:\:

$Ejecutable = New-Object System.Diagnostics.ProcessStartInfo("cmd.exe","/C DIR c:\")

Al constructor de ProcessStartInfo se le pasan dos parámetros, el primero el ejecutable y el segundo los parámetros que se pasan al ejecutable. Como DIR no es un ejecutable externo si no un comando de CMD.EXE, es necesario pasar CMD.EXE como ejecutable y el resto como parámetros.

Una vez creado ProcessStartInfo debemos establecer que no se use Shell para ejecutar el comando, lo que permite hacer redirección de entrada, salida y errores. Para ello se establece la propiedad useShellExecute como falso:

$Ejecutable.useShellExecute = $false

Ahora ya se puede establecer que se redirigirán la salida y los errores:

$Ejecutable.RedirectStandardOutput = $true
$Ejecutable.RedirectStandardError=$true

Es hora de ejecutar el proceso. Para ello usamos el método estático Start de la clase System.Diagnostics.Process, al que se pasa como parámetro el objeto ProcessStartInfo:

$Proceso = [System.Diagnostics.Process]::Start($Ejecutable)

Ahora esperarmos a que termine el proceso:

$Proceso.WaitForExit()

Toca obtener la salida y los errores que se hubieran producido mediante los métodos StandardOutput.ReadToEnd y StandardError.ReadToEnd:

$Salida = $Proceso.StandardOutput.ReadToEnd()
$Errores = $Proceso.StandardError.ReadToEnd()

Sólo queda mostrar los resultados:

"Salida   : $Salida"
"Errores  : $Errores"

Poniendo todo junto:

# Creamos un objeto ProcessStartInfo que lanzará CMD de manera que se cierre al
# terminar (modificador /C) y que hará un listado de C:\ (DIR C:\)
$Ejecutable = New-Object System.Diagnostics.ProcessStartInfo("cmd.exe","/C DIR c:\")

# Evitamos que se use Shell para lanzar el proceso, lo cual nos permitirá que
# la entrada, salida y errores puedan ser redirigidos
$Ejecutable.useShellExecute = $false

# Habilitamos la redirección de la salida y los errores
$Ejecutable.RedirectStandardOutput = $true
$Ejecutable.RedirectStandardError = $true

# Lanzamos el proceso
$Proceso = [System.Diagnostics.Process]::Start($Ejecutable)

# Esperamos que termine
$Proceso.WaitForExit()

# Obtenemos la salida y los erroress que se pudieran haber producido
$Salida=$Proceso.StandardOutput.ReadToEnd()
$Errores=$Proceso.StandardError.ReadToEnd()

# Mostramos salida y errores
"Salida   : $Salida"
"Errores  : $Errores

Este tip lo he basado en esta entrada de CampusMVP, y viene a ser una traducción a Powershell de la misma.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: