2010-10-27 13 views
5

Necesito obtener una lista de todas las tareas programadas que se ejecutan en un determinado host en una lista o matriz en C#.Cómo leer la salida estándar de un comando ejecutado a través de Process.Start() como una lista o matriz

La consulta

schtasks /query /S CHESTNUT105B /FO List 

devuelve una lista como esta:

HostName:  CHESTNUT105B 
TaskName:  Calculator 
Next Run Time: 12:00:00, 10/28/2010 
Status:  Running 

HostName:  CHESTNUT105B 
TaskName:  GoogleUpdateTaskMachineCore 
Next Run Time: At logon time 
Status: 

HostName:  CHESTNUT105B 
TaskName:  GoogleUpdateTaskMachineCore 
Next Run Time: 13:02:00, 10/28/2010 

tengo el siguiente código para ejecutar el comando que se especifica más arriba:

static void Main(string[] args) 
{ 
    Process p = new Process(); 
    p.StartInfo.UseShellExecute = false; 
    p.StartInfo.FileName = "SCHTASKS.exe"; 
    p.StartInfo.RedirectStandardError = true; 
    p.StartInfo.RedirectStandardOutput = true; 
    p.StartInfo.CreateNoWindow = true; 
    p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 


    string MachineName = "CHESTNUT105b"; 
    string ScheduledTaskName = "Calculator"; 
    string activeDirectoryDomainName = "xxx"; 
    string userName = "xxx"; 
    string password = "xxxxx"; 

    p.StartInfo.Arguments = String.Format("/Query /S {0} /FO LIST", MachineName); 

    p.Start(); 
} 

¿Cómo puedo leer la lista generada en una lista en C#?

+0

Estoy seguro de que hay una mejor manera de recuperar la lista - a través de las clases WMI, pero no sé lo suficiente de ese espacio de nombres para ofrecer una respuesta. – Oded

Respuesta

3

Algo como esto debería funcionar (no probado). Esto tendrá cada línea de salida en un elemento de la Lista.

class GetSchTasks { 

    List<string> output = new List<string>(); 

    public void Run() 
    { 
     Process p = new Process(); 
     p.StartInfo.UseShellExecute = false; 
     p.StartInfo.FileName = "SCHTASKS.exe"; 
     p.StartInfo.RedirectStandardError = true; 
     p.StartInfo.RedirectStandardOutput = true; 
     p.StartInfo.CreateNoWindow = true; 
     p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 


     string MachineName = "CHESTNUT105b"; 
     string ScheduledTaskName = "Calculator"; 
     string activeDirectoryDomainName = "xxx"; 
     string userName = "xxx"; 
     string password = "xxxxx"; 

     p.StartInfo.Arguments = String.Format("/Query /S {0} /FO LIST", MachineName); 

     p.Start(); 
     p.BeginOutputReadLine(); 
     p.BeginErrorReadLine(); 
     p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived); 
     p.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived); 
     p.WaitForExit(); 
     p.Close(); 
     p.Dispose(); 

    } 

    void p_ErrorDataReceived(object sender, DataReceivedEventArgs e) 
    { 
     //Handle errors here 
    } 

    void p_OutputDataReceived(object sender, DataReceivedEventArgs e) 
    { 
     output.Add(e.Data); 
    } 

} 

Ahora, se puede interpretar que la lista después de construir un conjunto adecuado de los objetos que representan cada uno una tarea programada, o no, según el caso de uso real. También puede crear una lista de ScheduledTask s objetos en el controlador p_OutputDataReceived en sí, sólo la comparación de cada línea en contra de los principios previstos, por ejemplo, if (e.Data.StartsWith("HostName:")) { //parse the line and grab the host name }

+0

¿Habría alguna forma de hacerlo sin el controlador de eventos? – xbonez

+0

Sí, adjuntando p.StandardOutput a StreamReader, consulte la pregunta @davisoa linked (http://stackoverflow.com/questions/902116/c-how-to-read-console-output-with-parameters) –

+0

. Gracias – xbonez

1

parte de esta pregunta puede ser respondida por este anterior question - "C# Cómo leer salida de la consola con parámetros"

Después de recuperar la salida de la consola en un StreamReader como se sugiere en esa pregunta, entonces sólo hay que analizar la salida de la consola en tareas individuales programadas, y luego en un objeto que almacena cada dato que le interesa.

Para irrumpir en tareas individuales, parece que puede usar: str.split("\n\n") - esto le dará cada tarea como una cadena separada, haga un ciclo sobre esta matriz y cree una clase que lea la cadena y llene sus valores analizando los datos.

Cuestiones relacionadas