2010-10-27 6 views
5

J'ai besoin d'obtenir une liste de toutes les tâches planifiées s'exécutant sur un hôte donné dans une liste ou un tableau en C#.Comment lire la sortie standard d'une commande exécutée via Process.Start() en tant que liste ou tableau

La requête

schtasks /query /S CHESTNUT105B /FO List 

retourne une liste comme ceci:

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 

je le code suivant pour exécuter la commande I spécifiée ci-dessus:

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(); 
} 

Comment puis-je lire la liste générée dans une liste en C#?

+0

Je suis sûr qu'il existe une meilleure façon de récupérer la liste - via les classes WMI, mais je ne sais pas assez de cet espace de noms pour offrir une réponse. – Oded

Répondre

3

Quelque chose comme ceci devrait fonctionner (non testé). Cela aura chaque ligne de sortie dans un élément de la liste.

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); 
    } 

} 

Maintenant, vous pouvez interpréter cette liste par la suite de construire un ensemble approprié d'objets représentant chacun une tâche, ou non planifiée, selon le cas d'utilisation réelle. Vous pouvez également créer une liste d'objets dans le gestionnaire p_OutputDataReceived lui-même, en comparant chaque ligne aux débuts attendus, par exemple, if (e.Data.StartsWith("HostName:")) { //parse the line and grab the host name }

+0

Serait-il possible de le faire sans le gestionnaire d'événements? – xbonez

+0

Oui, en associant p.StandardOutput à un StreamReader, voir la question @davisoa linked (http://stackoverflow.com/questions/902116/c-how-to-read-console-output-with-parameters) –

+0

. Merci – xbonez

1

Une partie de cette question peut répondre à cette précédente question - « C# Comment lire la sortie de la console avec des paramètres »

Après avoir récupéré la sortie de la console dans un StreamReader comme suggéré dans cette question, alors il vous suffit d'analyser la sortie de la console dans des tâches planifiées individuelles, puis dans un objet qui stocke chaque élément de données qui vous intéresse.

Pour faire une pause dans des tâches individuelles, il semble que vous pouvez simplement utiliser: str.split("\n\n") - cela vous donnera chaque tâche En tant que chaîne distincte, passez en boucle sur ce tableau et créez une classe qui lit la chaîne et remplit ses valeurs en analysant les données.

Questions connexes