2008-10-22 17 views
5

Necesito poder iniciar un proceso y leer el resultado en una variable. Luego, según el retorno del comando, puedo elegir mostrar la salida completa o solo un subconjunto seleccionado.Does powershell tiene un equivalente a popen?

Para que quede claro, quiero iniciar un proceso basado en texto (psexec en realidad) y leer el resultado de ese comando (stdout, stderr, etc.) en una variable en lugar de hacerlo directamente a la consola.

Respuesta

5

Olvidó algunos detalles sobre qué tipo de proceso, pero creo que this article del Powershell Team Blog tiene todo lo que le gustaría hacer, ya sea conectar la salida del ejecutable en algún lugar o utilizar System.Diagnostics.Process.

Ahora que la segunda opción suena como lo que quiere hacer, puede utilizar la clase ProcessStartInfo para alimentarse en true como la propiedad RedirectStandardOutput, y luego leer de la propiedad StandardOutput del objeto Process para hacer lo que quiera con el salida. StandardError funciona de manera idéntica.

+0

No estoy seguro de cómo mucho más clara que lo desee. Quiero capturar la salida de un comando lanzado por powershell ... como popen. Esa página parece solo enumerar formas de iniciar processse. – vfilby

+0

Derecha, ese ejemplo cubre el lanzamiento de archivos ejecutables. Utilice la clase ProcessStartInfo, específicamente la propiedad RedirectStandardOutput para capturar lo que desea. –

+0

Sí, lo descubrí al mismo tiempo. ¿Algún consejo sobre la lectura de datos de una transmisión en PowerShell? – vfilby

1

En lo que se refiere a la materia de lectura en variables, sólo debe ser capaz de hacer algo como

$output = ps 

Esta salida estándar sólo se capturará, sin embargo, no la verbosa, de advertencia o error corrientes. Puede obtener el código de salida del comando anterior probando la variable especial $?.

Creo que un poco más de información sería útil para proporcionar una respuesta más completa, pero espero que esto sea de alguna manera hacia lo que estás buscando.

1

El PowerShell Community Extensions incluye Start-Process. Esto realmente devuelve un System.Diagnostics.Process.

> $proc = Start-Process pslist -NoShellExecute 

Sin embargo, aunque este proceso devuelve el objetar que no le permite redirigir la salida antes de la ejecución. Para hacer que uno puede crear su propio proceso y ejecutarlo mediante la modificación de los primeros miembros ProcessStartInfo:

> $proc = New-Object System.Diagnostics.Process 
> $proc.StartInfo = New-Object System.Diagnostics.ProcessStartInfo("pslist.exe") 
> $proc.StartInfo.CreateNoWindow = $true 
> $proc.StartInfo.UseShellExecute = $false 
> $proc.StartInfo.RedirectStandardOutput = $true 
> $proc.Start() 
> $proc.StandardOutput.ReadToEnd() 
Cuestiones relacionadas