2010-10-27 11 views
5

Belirli bir ana bilgisayarda çalıştırılan tüm zamanlanan görevlerin bir listesini C# içindeki bir liste veya diziye almam gerekir.Process.Start() yoluyla bir komuttan çalıştırılan bir komuttan standart çıktı nasıl okunur?

sorgu

schtasks /query /S CHESTNUT105B /FO List 

böyle bir liste döndürür:

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 

ben yukarıda belirtilen komutu çalıştırmak için aşağıdaki kodu vardır: Okuduğum nasıl

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

liste C# 'da bir liste haline getirildi mi?

Bu sorunun
+0

Ben listesini almak için daha iyi bir yol yoktur eminim ama cevap vermek için bu isim alanının yeteri kadarını bilmiyorum. – Oded

cevap

3

Böyle bir şey işe yaramalı (denenmemiş). Bu, her bir çıktı satırını Listenin bir öğesinde olacaktır.

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

} 

Şimdi, gerçek kullanım durumunda bağlı olarak her zamanlanmış bir görev temsil eden veya olmasın nesneleri uygun bir set inşa etmek sonradan o listeyi yorumlayabilir. WMI sınıfları aracılığıyla - Ayrıca, sadece beklenen başlangıçlar karşı her satırı karşılaştırarak, p_OutputDataReceived işleyicisi kendisinde ScheduledTask s nesnelerin listesini inşa edebileceğini, örneğin, if (e.Data.StartsWith("HostName:")) { //parse the line and grab the host name }

+0

Etkinlik işleyicisi olmadan bunu yapmanın herhangi bir yolu var mı? – xbonez

+0

Evet, bir StreamReader'a pSTStandardOutput ekleyerek, @davisoa bağlantısına bakın (http://stackoverflow.com/questions/902116/c-how-to-read-console-output-with-parameters) –

+0

işe yaradı . Teşekkürler – xbonez

1

Bölüm bu önceki question tarafından yanıtlanabilir - Bu sorunun önerildiği üzere o zaman sadece ayrıştırmak zorunda bir StreamReader içine konsol çıktısını aldıktan sonra

"Parametreler ile Konsol Çıktı Oku Nasıl C#" konsol zamanlanmış görevler içine ve daha sonra ilgilendiğiniz her bir veri parçasını saklayan bir nesneye dönüştürün.

Tek tek görevlere ayırmak için, aşağıdakileri kullanabilirsiniz: str.split("\n\n") - bu size her görevi verecektir Ayrı bir dize olarak, bu dizinin üzerine gelin ve dizeyi okuyan ve verileri ayrıştırarak değerlerini dolduran bir sınıf oluşturun.

İlgili konular