2011-08-18 8 views
8

अद्यतन एक बैच फ़ाइल चल ** अभी भी एक सही जवाब ** मैं अपने विंडोज़ सेवा में निम्न कोड है की तलाश और मैं एक बैच फ़ाइल चलाना चाहते हैं। मैं कमांड प्रॉम्प्ट विंडो ऊपर चाहते हैं तो मैं प्रगतिसे सी #

यहाँ

मेरी कोड है, लेकिन मेरे बैच फ़ाइल कोड does not काम

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


     } 
    } 

यह बैच फ़ाइल निष्पादित नहीं करता है देख सकते हैं। मैं .NET और C# में नौसिखिया हूं और मुझे यकीन नहीं है कि यहां से क्या करना है। धन्यवाद

+0

किसी भी तरह से आपको लगता है कि सेवा चल रही है इस बात की पुष्टि कर सकते हैं? –

+0

सेवा ठीक चल रही है। मैं इसे कमांड लाइन से शुरू कर सकता हूं। मैं फ़ोल्डर का नाम बदल/हटा/जोड़ सकता हूं और यह जानकारी लॉग करता है। तो मुझे 100% यकीन है कि सेवा ठीक चल रही है – Autolycus

+3

बस एक साइड नोट के रूप में: आपको अपने 'स्ट्रीमवाइटर' का उपयोग करके 'लपेटना' चाहिए अन्यथा आप खुले फ़ाइल हैंडल को छोड़ सकते हैं। – ChrisWue

उत्तर

4

How to run console application from Windows Service?

आपको फ़ाइल नाम = "cmd.exe" और तर्क = साथ p.StartInfo सेट करना चाहते हैं जाएगा "C: \\ thebatfile.bat" मुझे विश्वास है

+0

ने कोशिश की ... या तो – Autolycus

+3

@Autolycus हाँ यह करता है, लेकिन आपको तर्कों को '/ C" में बदलना होगा c: \ myFile.bat "' ('/ C' गायब था)। – Justin

0

ऐसा लग रहा है जब सेवा पहली बार चलती है तो यह बैच स्क्रिप्ट चला रहा है और फिर यह अन्य कार्यों को कॉल करने की क्षमता प्राप्त करने से पहले (p.WaitForExit();) छोड़ देता है। क्या यह इरादा व्यवहार है? यह समझाएगा कि आप इसे फ़ोल्डर संचालन क्यों कर सकते हैं और स्क्रिप्ट को चलाने के लिए नहीं देख सकते हैं।

कंसोल विंडो लाने के लिए इस कोड को आज़माएं। यह आपको एक विचार देना चाहिए कि बैच स्क्रिप्ट कब चल रही है।

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

मैं आपकी सेवा या बैट फ़ाइल पर संदेह कर रहा हूं। नोटपैड खोलने के लिए स्रोत कोड को संशोधित करें! जांचें कि नोटपैड दिखाता है !! यदि हां तो हम आगे की जांच कर सकते हैं!

+2

मुझे नहीं लगता कि आप विंडोज सेवा में नोटपैड शुरू कर सकते हैं। – Autolycus

+0

मुझे लगता है कि इसे काम करना चाहिए, यह नहीं पता था कि इसे विंडोज़ सेवा पर नोटपैड प्राप्त करने के लिए अतिरिक्त काम की ज़रूरत है। पहले इसे आजमाने का कोई कारण नहीं था! http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/c8c9d2c6-f2bb-4fa4-ba99-51a42f9bc6f4 – ioWint

0

आपकी बैच फ़ाइल क्या कर रही है? मान लें कि आपने पुष्टि की है कि यह ठीक चल रहा है।

+0

एक साइड नोट के रूप में - आप विंडोज़ सेवा से जीयूआई चलाने की कोशिश क्यों कर रहे हैं? अजीब लगता है। हालांकि, आपको यह उत्तर और कुछ उपयोग के आलेख मिल सकते हैं: http://stackoverflow.com/questions/677874/starting-a-process-with-credentials-from-a-windows- सेवा – glendon

2

समस्या यह है कि आपके पास UseShellExecute गलत है, लेकिन आप निष्पादन योग्य नाम नहीं दे रहे हैं।

जब ShellExecute किया जा रहा है इसके एक्सप्लोरर में एक फ़ाइल पर डबल क्लिक करने के लिए इसी तरह की है - यह जानता है कि .doc फ़ाइलों वर्ड के साथ खोला जाना आवश्यक है, और उस .bat फ़ाइलों cmd.exe साथ खोले जाने के लिए की जरूरत है। जब आप इसे अक्षम कर देते हैं, हालांकि यह इन चीजों में से कोई भी नहीं जानता है और आपको सफलतापूर्वक चलाने के लिए निष्पादन योग्य पास करने की आवश्यकता है।

आप सत्य पर RedirectStandardOutput सेट कर रहे हैं के रूप में आप के बजाय /C "c:\myFile.bat" को cmd.exe को FileName स्थापित करने और तर्क से cmd.exe के माध्यम से बैच फ़ाइल को चलाने के लिए की जरूरत है:

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

ग्रेट स्पष्टीकरण! धन्यवाद! – Tyler

0

विंडोज एक desktopless उपयोगकर्ता खाते के अंतर्गत चलाने सेवाओं। Cmd विंडो देखने के लिए आपको वर्तमान लॉग इन उपयोगकर्ता का प्रतिरूपण करना होगा और इस उपयोगकर्ता के डेस्कटॉप पर cmd विंडो शुरू करना होगा। देखें:

Windows Impersonation from C#

संबंधित मुद्दे