2010-10-27 20 views
5

Tôi cần có danh sách tất cả tác vụ được lập lịch đang chạy trên một máy chủ nhất định vào danh sách hoặc mảng trong C#.Cách đọc đầu ra tiêu chuẩn từ một lệnh chạy qua Process.Start() dưới dạng danh sách hoặc mảng

Truy vấn

schtasks /query /S CHESTNUT105B /FO List 

trả về một danh sách như thế này:

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 

Tôi có đoạn code sau đây để thực hiện lệnh tôi đã nêu ở trên:

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

Làm thế nào tôi có thể đọc danh sách được tạo thành danh sách trong C#?

+0

Tôi chắc chắn có cách tốt hơn để truy xuất danh sách - thông qua các lớp WMI, nhưng tôi không biết đủ về không gian tên đó để đưa ra câu trả lời. – Oded

Trả lời

3

Điều gì đó như thế này sẽ hoạt động (chưa được kiểm tra). Điều này sẽ có mỗi dòng đầu ra trong một phần tử của Danh sách.

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

} 

Bây giờ, bạn có thể giải thích danh sách các đối tượng đại diện cho từng Tác vụ theo lịch hoặc không tùy thuộc vào trường hợp sử dụng thực tế. Bạn cũng có thể xây dựng danh sách các đối tượng ScheduledTask s trong chính trình xử lý p_OutputDataReceived, chỉ cần so sánh từng dòng với các lần khởi động dự kiến, ví dụ: if (e.Data.StartsWith("HostName:")) { //parse the line and grab the host name }

+0

Có cách nào để thực hiện điều này nếu không có trình xử lý sự kiện không? – xbonez

+0

Có, đính kèm p.StandardOutput vào StreamReader, xem câu hỏi @davisoa được liên kết (http://stackoverflow.com/questions/902116/c-how-to-read-console-output-with-parameters) –

+0

làm cho nó hoạt động . Cảm ơn – xbonez

1

Một phần của câu hỏi này có thể được trả lời bằng cách này trước question - "C# Làm thế nào để đọc điều khiển đầu ra với các thông số"

Sau khi lấy giao diện điều khiển đầu ra vào một StreamReader như đề xuất trong câu hỏi đó, sau đó bạn chỉ cần phải phân tích cú pháp đầu ra của giao diện điều khiển thành các tác vụ được lập biểu riêng lẻ và sau đó vào một đối tượng lưu trữ từng phần dữ liệu mà bạn quan tâm.

Để thực hiện các tác vụ riêng lẻ, có vẻ như bạn chỉ có thể sử dụng: str.split("\n\n") như một chuỗi riêng biệt, do đó, lặp qua mảng này và tạo một lớp đọc chuỗi và điền vào các giá trị của nó bằng cách phân tích cú pháp dữ liệu.

Các vấn đề liên quan