2011-01-25 13 views
9

हमारे पास हमारे नेटवर्क पथ पर कुछ आदेश (बैच फ़ाइलें/निष्पादन योग्य) हैं जिन्हें हमें उस कमांड विंडो के लिए हमारे 'विकास पर्यावरण' को प्रारंभ करने के लिए कॉल करना है। यह कुछ पर्यावरणीय चर सेट करता है, पथ आदि में सामान जोड़ता है (फिर केवल जो भी काम करने वाले कमांड हम टाइप करते हैं उन्हें & पता चलेगा कि उन प्रारंभिक आदेशों के अंदर क्या होता है)कमांड विंडो प्रक्रिया में कमांड की श्रृंखला कैसे भेजें?

अब मेरी समस्या है, मैं कॉल करना चाहता हूं एक सी # प्रोग्राम का उपयोग करके उन 'काम करने वाले आदेशों' की एक श्रृंखला, और निश्चित रूप से, वे केवल तभी काम करेंगे जब प्रारंभिक सेटअप किया जाता है। मैं उसे कैसे कर सकता हूँ? वर्तमान में, मैं उदाहरण के लिए इस तरह इस कार्यक्रम से खरोंच से एक बैच फ़ाइल बना रहा हूं:

file.Writeline("InitializationStep1.bat") 
file.Writeline("InitializeStep2.exe") 
file.Writeline("InitializeStep3.exe") 

तब वास्तविक आदेशों

file.Writeline("Dowork -arguments -flags -blah -blah") 
file.Writeline("DoMoreWork -arguments -flags -blah -blah") 

फिर अंत में फ़ाइल लेखक बंद करो, और इस बैच फ़ाइल चलाते हैं।

अब अगर मैं सीधे Process.<strike>Run</strike>Start("cmd.exe","Dowork -arguments"); का उपयोग करके इसे निष्पादित करता हूं तो यह नहीं चलेगा।

मैं इसे क्लीनर तरीके से कैसे प्राप्त कर सकता हूं, ताकि मुझे केवल एक बार प्रारंभिक आदेश चलाएं? (मैं प्रत्येक तीन प्रारंभकर्ताओं के साथ हर बार cmd.exe चला सकता हूं, लेकिन उन्हें बहुत समय लगता है इसलिए मैं इसे केवल एक बार करना चाहता हूं)

+0

हाय दोस्तों, भ्रम के लिए खेद है, मेरा मतलब प्रक्रिया है। केवल प्रारंभ करें और प्रक्रिया नहीं। रुन। साथ ही, मुझे लगता है कि मैं अपनी समस्या को समझाने में पर्याप्त स्पष्ट नहीं था। मुझे पता है कि Process.Start और ProcessStartInfo का उपयोग कर इस तरह के बुनियादी आदेशों को कैसे निष्पादित करना है। मेरी समस्या यह है कि, एक बार जब मैं इसे निष्पादित करता हूं, तो यह सब खत्म हो जाता है - जबकि मैं उस प्रक्रिया के साथ 'प्रारंभिक' बैच फ़ाइल को कॉल करना चाहता हूं, और फिर उसी प्रक्रिया में वास्तविक कार्य आदेशों को केवल उसी के रूप में सही वातावरण चर और उचित पथ सेट । –

+0

भी, "यह नहीं चलेगा" मेरा मतलब था कि यह नहीं चलेंगे क्योंकि कमांड चलाने के लिए पूर्वापेक्षाएँ केवल प्रारंभकर्ता बैच और exe फ़ाइलों को कॉल करके कमांड प्रॉम्प्ट में सेट की गई हैं। तो अगर मैं सीधे प्रक्रिया के साथ चलाता हूं तो यह आदेश डॉवर्क को भी पहचाना नहीं जाता है। –

+0

क्या यह नियंत्रण प्रवाह है: 1. बैच फ़ाइल बनाएं (तर्क के बिना), 2. किसी अन्य प्रक्रिया में निर्दिष्ट तर्क के साथ बैच फ़ाइल में आदेश निष्पादित करें। यदि मैं गलत हूं, तो सटीक नियंत्रण प्रवाह क्या है? आप टिप्पणियों के ऊपर बहुत सटीक नहीं हैं। –

उत्तर

14

जैसा कि @ हैकेम ने इंगित किया है, System.Diagnostic.Process में स्थिर Run विधि नहीं है। मुझे लगता है कि आप विधि प्रारंभ का जिक्र कर रहे हैं।
एक बार जब आप बैच फ़ाइल का निर्माण पूरा कर लिया है, तो बस इसे निम्नलिखित कोड का उपयोग कर निष्पादित,

Process p = new Process(); 
p.StartInfo.FileName = batchFilePath; 
p.StartInfo.Arguments = @"-a arg1 -b arg2"; 
p.Start(); 

ध्यान दें कि @ प्रतीक तर्क स्ट्रिंग के लिए पहले से जुड़ा हुआ होना आवश्यक है ताकि एस्केप अनुक्रम वर्ण की तरह \ को शाब्दिक माना जाता है।

वैकल्पिक कोड

Process.Start(batchFilePath, @"-a arg1 -b arg2");

या

ProcessStartInfo processStartInfo = new ProcessStartInfo(); 
processStartInfo.FileName = batchFilePath; 
processStartInfo.Arguments = @"-a arg1 -b arg2"; 
Process.Start(processStartInfo);


अधिक जानकारी

बहु आदेश बैच फ़ाइल

dir /O 
pause 
dir 
pause 
इस फ़ाइल .bat रूप

सहेजें और फिर प्रारंभ पद्धति का उपयोग करके अमल का उदाहरण।इस मामले में आप बैच फ़ाइल में कमांड के साथ तर्क निर्दिष्ट कर सकते हैं (उपर्युक्त उदाहरण में, /O विकल्प dir कमांड के लिए निर्दिष्ट है।
मुझे लगता है कि आपने बैच फ़ाइल निर्माण भाग पहले से ही किया है, अब बस संलग्न करें बैच फ़ाइल में आदेश करने के लिए तर्क।

एक प्रक्रिया
के बाद से आप एक ही cmd प्रक्रिया करने के लिए कई आदेश भेजने के लिए चाहते हैं के लिए इनपुट रीडायरेक्ट कर रहा है, तो आप करने के लिए प्रक्रिया के मानक इनपुट अनुप्रेषित कर सकते हैं से इनपुट लेने कीबोर्ड के बजाए आपका प्रोग्राम।

कोड में एक समान प्रश्न से प्रेरित है: Execute multiple command lines with the same process using C#

private string ProcessRunner() 
{ 
    ProcessStartInfo processStartInfo = new ProcessStartInfo("cmd.exe"); 
    processStartInfo.RedirectStandardInput = true; 
    processStartInfo.RedirectStandardOutput = true; 
    processStartInfo.UseShellExecute = false; 

    Process process = Process.Start(processStartInfo); 

    if (process != null) 
    { 
     process.StandardInput.WriteLine("dir"); 
     process.StandardInput.WriteLine("mkdir testDir"); 
     process.StandardInput.WriteLine("echo hello"); 
     //process.StandardInput.WriteLine("yourCommand.exe arg1 arg2"); 

     process.StandardInput.Close(); // line added to stop process from hanging on ReadToEnd() 

     string outputString = process.StandardOutput.ReadToEnd(); 
     return outputString; 
    } 

    return string.Empty; 
} 

विधि आदेश निष्पादन के उत्पादन देता है। इसी तरह, आप प्रक्रिया की मानकऑपूट स्ट्रीम को रीडायरेक्ट और पढ़ सकते हैं।

+0

हाय देवेंद्र, साथ ही प्रश्न में संपादित, प्रक्रिया.रुन एक टाइपो था, यह प्रक्रिया थी। स्टार्ट। मेरी समस्या सिर्फ नहीं चल रही है एक कमांड या बैच फ़ाइल। यह एक ही cmd विंडो में एक बार बनाई गई कमांड की श्रृंखला को चलाने का तरीका है। क्या आप जानते हैं कि यह कैसे करें? –

+0

@Piyush, आप प्रोग्राम को एक अलग लाइन पर प्रत्येक कमांड के साथ बैच फ़ाइल बना सकते हैं मैंने एक उदाहरण जोड़ने के लिए जवाब संपादित किया है। –

+0

हाय देवेंद्र, यही वह मूल रूप से कर रहा था (जो भी काम कर रहा था), लेकिन मैं एक ही कमांड विंडो प्रक्रिया में चरणों की एक श्रृंखला को निष्पादित करने का क्लीनर दृष्टिकोण चाहता था। –

0

प्रक्रिया। रून विधि जिसका आपने उल्लेख किया है, वह सिस्टम में प्रक्रिया वर्ग से है। डायग्नोस्टिक्स नेमस्पेस? AFAIK, प्रक्रिया प्रकार में या तो रन नामक स्थिर या आवृत्ति विधि नहीं है। यदि आप पहले से ही प्रक्रिया पर स्टार्ट विधि के साथ प्रयास नहीं करते हैं, तो उदाहरण या स्थिर

+0

हाय हैकीम, जैसा कि मैंने इस सवाल में भी संपादित किया था, मैं वास्तव में प्रक्रिया के बारे में बात कर रहा था। रुन और यह मेरी समस्या का समाधान नहीं करता है। –

+0

आह! एक बार फिर टाइप करें। मैं वास्तव में 'Process.Start' के बारे में बात कर रहा था और यह मेरी समस्या का समाधान नहीं करता है :( –

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