2011-08-18 29 views
8

CẬP NHẬT ** vẫn đang tìm kiếm một câu trả lời ĐÚNG ** Tôi có đoạn code sau trong dịch vụ cửa sổ của tôi và tôi muốn chạy một tập tin thực thi. Tôi muốn các cửa sổ command prompt lên vì vậy tôi có thể nhìn thấy sự tiến bộchạy một tập tin thực thi từ C#

đây là mã của tôi nhưng batch file đang doesnt làm việc của tôi

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Diagnostics; 
using System.Linq; 
using System.ServiceProcess; 
using System.Text; 
using System.IO; 

    namespace Watcher 
    { 
     public partial class Watcher : ServiceBase 
     { 
      public Watcher() 
      { 
       InitializeComponent(); 
      FolderWatcher.Created += FolderWatcher_Created; 
      FolderWatcher.Deleted += FolderWatcher_Deleted; 
      FolderWatcher.Renamed += FolderWatcher_Renamed; 
      } 

      protected override void OnStart(string[] args) 
      { 

          // Start the child process. 
      Process p = new Process(); 
      // Redirect the output stream of the child process. 
      p.StartInfo.UseShellExecute = false; 
      p.StartInfo.RedirectStandardOutput = true; 
      p.StartInfo.FileName = "C:\\myFile.bat"; 
      p.Start(); 
      // Do not wait for the child process to exit before 
      // reading to the end of its redirected stream. 
      // p.WaitForExit(); 
      // Read the output stream first and then wait. 
      string output = p.StandardOutput.ReadToEnd(); 
      p.WaitForExit(); 


      } 

      protected override void OnStop() 
      { 
      } 

      private void FolderWatcher_Created(object sender, System.IO.FileSystemEventArgs e) 
      { 
       TextWriter writer = new StreamWriter("C:\\folder\\FolderLog.txt", true); 
       writer.WriteLine(DateTime.Now + " A new folder/file with name " + e.Name + " has been created. "); 
       writer.Close(); 
      } 

      private void FolderWatcher_Deleted(object sender, System.IO.FileSystemEventArgs e) 
      { 
       TextWriter writer = new StreamWriter("C:\\folder\\FolderLog.txt", true); 
       writer.WriteLine(DateTime.Now + " A new folder/file with name " + e.Name + " has been deleted. "); 
       writer.Close(); 
      } 

      private void FolderWatcher_Renamed(object sender, System.IO.RenamedEventArgs e) 
      { 
       TextWriter writer = new StreamWriter("C:\\folder\\log.txt", true); 
       writer.WriteLine(DateTime.Now + " A new folder/file with name " + e.Name + " has been renamed. "); 
       writer.Close(); 
      } 


     } 
    } 

Nó không chạy file batch. Tôi là một newbie trong .net và C# và tôi không chắc chắn phải làm gì từ đây. nhờ

+0

Bạn có thể xác nhận rằng dịch vụ đang chạy không? Dịch vụ –

+0

đang chạy tốt. Tôi có thể bắt đầu nó từ dòng lệnh. Tôi có thể đổi tên/xóa/thêm thư mục và ghi nhật ký thông tin. Vì vậy, tôi chắc chắn 100% rằng các dịch vụ đang chạy tốt – Autolycus

+3

Cũng giống như một lưu ý phụ: Bạn nên quấn 'StreamWriter' của bạn trong 'bằng cách sử dụng' nếu không bạn có thể để mở xử lý tập tin xung quanh. – ChrisWue

Trả lời

4

How to run console application from Windows Service?

Bạn sẽ muốn các thiết lập p.StartInfo với FileName = "cmd.exe" và Arguments = "c: \\ thebatfile.bat" tôi tin

+0

đã thử..không hoạt động hoặc – Autolycus

+3

@Autolycus Có, nhưng bạn cần thay đổi đối số thành '/ C 'c: \ myFile.bat" '(thiếu'/C'). – Justin

0

Dường như nó chạy tập lệnh batch khi dịch vụ được chạy đầu tiên và sau đó nó thoát (p.WaitForExit();) trước khi các chức năng khác nhận được khả năng được gọi. Đó có phải là hành vi dự định không? Điều đó sẽ giải thích lý do tại sao bạn có thể thấy nó làm các hoạt động thư mục và không thấy kịch bản đang chạy.

Hãy thử mã này để hiển thị cửa sổ bảng điều khiển. Nó sẽ cung cấp cho bạn một ý tưởng về thời điểm kịch bản lệnh batch đang chạy.

protected override void OnStart(string[] args) 
{ 
     // Start the child process. 
     Process p = new Process(); 
     // Redirect the output stream of the child process. 
     p.StartInfo.UseShellExecute = false; 

     /* 
     This is commented out so we can see what the script is doing 
     inside the cmd console. 
     */ 
     //p.StartInfo.RedirectStandardOutput = true; 

     p.StartInfo.FileName = "C:\\myFile.bat"; 
     p.Start(); 
     // Do not wait for the child process to exit before 
     // reading to the end of its redirected stream. 
     // p.WaitForExit(); 
     // Read the output stream first and then wait. 

     /* 
     Since we aren't redirecting the output, we have to comment out 
     this line or we get an error 
     */ 
     //string output = p.StandardOutput.ReadToEnd(); 

     p.WaitForExit(); 
} 
0

tôi đang nghi ngờ dịch vụ của bạn hoặc tệp dơi. sửa đổi mã nguồn để mở một notepad! kiểm tra xem notepad xuất hiện !! nếu có thì chúng ta có thể điều tra thêm!

+2

Tôi không nghĩ rằng bạn có thể bắt đầu notepad trong cửa sổ dịch vụ. – Autolycus

+0

tôi giả định rằng nó sẽ hoạt động, không biết nó cần thêm công việc để có được notepad trên một cửa sổ dịch vụ. không bao giờ có lý do để thử nó trước đó! http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/c8c9d2c6-f2bb-4fa4-ba99-51a42f9bc6f4 – ioWint

0

Tệp hàng loạt của bạn đang làm gì? Giả sử bạn đã xác nhận rằng IS này đang chạy OK.

+0

Là một lưu ý phụ - tại sao bạn lại cố gắng chạy GUI từ một dịch vụ windows? Có vẻ kỳ quặc. Tuy nhiên, bạn có thể tìm thấy câu trả lời và bài viết này về một số cách sử dụng: http://stackoverflow.com/questions/677874/starting-a-process-with-credentials-from-a-windows-service – glendon

2

Vấn đề là bạn có UseShellExecute là sai, nhưng bạn không chuyển tên của tệp thi hành.

Khi ShellExecute đang được sử dụng tương tự như nhấp đúp vào tệp trong trình khám phá - nó biết rằng các tệp .doc cần phải được mở bằng Word và tệp .bat cần phải được mở bằng cmd.exe. Tuy nhiên, khi bạn đã vô hiệu hóa tính năng này, bạn sẽ không biết phải thực hiện điều gì trong số này và bạn cần phải thực thi thực thi để mọi thứ có thể chạy thành công.

Như bạn đang thiết RedirectStandardOutput true bạn cần phải thay vì chạy các tập tin thực thi qua cmd.exe bằng cách thiết lập FileName để cmd.exe và những lập luận để /C "c:\myFile.bat":

p.StartInfo.FileName = "cmd.exe"; 
p.StartInfo.Arguments = "/C \"c:\\myFile.bat\""; 
+0

Giải thích tuyệt vời! Cảm ơn! – Tyler

0

Windows và dịch vụ chạy dưới một tài khoản người dùng desktopless. Để xem cửa sổ cmd, bạn phải mạo danh người dùng đã đăng nhập hiện tại và bắt đầu cửa sổ cmd trên màn hình của người dùng này. Xem phần này:

Windows Impersonation from C#

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