2009-11-30 12 views
5

से एक शेल कमांड निष्पादित करें मुझे Lua में os.execute (उस पृष्ठ पर थोड़ा सा रास्ता) के विपरीत नहीं, मेरे .NET एप्लिकेशन से एक शेल कमांड निष्पादित करने की आवश्यकता है। हालांकि एक सरसरी खोज के साथ मुझे कुछ भी नहीं मिला। मैं यह कैसे करुं?एक .NET अनुप्रयोग

[DllImport("shell32.dll")] 
static extern IntPtr ShellExecute(
    IntPtr hwnd, 
    string lpOperation, 
    string lpFile, 
    string lpParameters, 
    string lpDirectory, 
    ShowCommands nShowCmd); 

उत्तर

9
System.Diagnostics.Process p = new System.Diagnostics.Process(); 
p.StartInfo.FileName = "blah.lua arg1 arg2 arg3"; 
p.StartInfo.UseShellExecute = true; 
p.Start(); 

एक और तरीका है P/Invoke का उपयोग करें और सीधे ShellExecute उपयोग करने के लिए किया जाएगा। सिस्टम का उपयोग करना। डायग्नोस्टिक नामस्थान, स्पॉन्गिंग प्रक्रियाओं को संभालने के लिए एक कक्षा है।

System.Diagnostics.Process process = new System.Diagnostics.Process(); 
process.StartInfo.FileName = "App.exe"; 
process.StartInfo.Arguments = "arg1 arg2 arg3"; 
process.Start(); 

Console.WriteLine(process.StandardOutput.ReadToEnd(); 

इस तरह के एक कंसोल विंडो बनाने नहीं, इनपुट या आउटपुट, और सबसे कुछ भी आप आवश्यकता होगी पुनः निर्देशित के रूप में चीजों को संभालने के लिए अतिरिक्त पैरामीटर शामिल हैं।

+0

मैं एक lua स्क्रिप्ट कार्यकारी करने की जरूरत है ... – RCIX

+0

@RCIX: कैसे क्या तुमने अभी किया मैनुअल तरीका मेरा मतलब है। –

+0

यानी कंसोल कमांड में 'blah.lua somearg anotherarg thirdarg' डाल रहा है। पृष्ठभूमि कार्यकर्ता का सही उपयोग करने के लिए – RCIX

2

सी # में इस संभाल करने के लिए एक आसान तरीका है:

6

यदि स्क्रिप्ट थोड़ी देर लेती है तो आप एक असीमित दृष्टिकोण पर विचार करना चाहेंगे।

यहां कुछ कोड है जो एक प्लस पर प्रदर्शित होने के लिए मानक आउटपुट को रीडायरेक्ट करता है (WPF, Windows Forms, जो भी हो)। ध्यान दें कि मैं तुम्हें, उपयोगकर्ता के इनपुट की जरूरत नहीं है तो यह कंसोल विंडो है, जो बेहतर लग रहा है का निर्माण नहीं करता संभालने हूँ:

BackgroundWorker worker = new BackgroundWorker(); 
... 
// Wire up event in the constructor or wherever is appropriate 
worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); 
... 
// Then to execute your script 
worker.RunWorkerAsync("somearg anotherarg thirdarg"); 

void worker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    StringBuilder result = new StringBuilder(); 
    Process process = new Process(); 
    process.StartInfo.FileName = "blah.lua"; 
    process.StartInfo.Arguments = (string)e.Argument; 
    process.StartInfo.UseShellExecute = false; 
    process.StartInfo.RedirectStandardOutput = true; 
    process.StartInfo.CreateNoWindow = true; 
    process.Start(); 
    result.Append(process.StandardOutput.ReadToEnd()); 
    process.WaitForExit(); 
    e.Result = result.AppendLine().ToString(); 
} 

void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Result != null) console.Text = e.Result.ToString(); 
    else if (e.Error != null) console.Text = e.Error.ToString(); 
    else if (e.Cancelled) console.Text = "User cancelled process"; 
} 
+0

+1 और पूरे धागे को अवरुद्ध नहीं कर रहा है। बहुत बेहतर उपयोगकर्ता अनुभव! – ppumkin