कमांड कमांड प्रॉम्प्ट चलाएं


605

क्या C # एप्लिकेशन के भीतर से कमांड प्रॉम्प्ट कमांड चलाने का कोई तरीका है? यदि ऐसा है तो मैं निम्नलिखित कैसे करूंगा:

copy /b Image1.jpg + Archive.rar Image2.jpg

यह मूल रूप से JPG छवि के भीतर एक RAR फ़ाइल एम्बेड करता है। मैं सोच रहा था कि क्या C # में अपने आप ऐसा करने का कोई तरीका था।


6
का डुप्लीकेट stackoverflow.com/questions/181719/... (एक जवाब आप क्या चाहते हैं वहाँ है कि वहाँ है)।
मैट हैमिल्टन

stackoverflow.com/a/5367686/492 का एक बेहतर उत्तर है
CAD '

जवाबों:


917

यह आपको C # से शेल कमांड चलाना है

string strCmdText;
strCmdText= "/C copy /b Image1.jpg + Archive.rar Image2.jpg";
System.Diagnostics.Process.Start("CMD.exe",strCmdText);

संपादित करें:

यह cmd विंडो को छिपाना है।

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C copy /b Image1.jpg + Archive.rar Image2.jpg";
process.StartInfo = startInfo;
process.Start();

संपादित करें: 2

महत्वपूर्ण यह है कि तर्क से शुरू होता है /Cअन्यथा यह काम नहीं करेगा। स्कॉट फर्ग्यूसन ने कैसे कहा: यह "स्ट्रिंग द्वारा निर्दिष्ट कमांड को बाहर निकालता है और फिर समाप्त करता है।"


166
/ C स्ट्रिंग द्वारा निर्दिष्ट आदेश को पूरा करता है और फिर समाप्त करता है
स्कॉट फर्ग्यूसन

16
चलाने के लिए और समाप्त करने के लिए cmd बताने के लिए अपने (खिड़की बंद करने के लिए किसी भी उपयोगकर्ता इनपुट के लिए इंतजार नहीं है)
RameshVel

3
धन्यवाद, एक और सवाल। क्या इस दौरान कमांड प्रॉम्प्ट को छिपाने का कोई तरीका है?
उपयोगकर्ता

9
मैं नहीं देखता कि मैं केवल एक ही व्यक्ति हूं जो यह सोचता है कि यह एक भयानक विचार है। हां, यह काम करेगा, लेकिन यह पूरी तरह से और पूरी तरह से गलत है। सरल IO संचालन करने के लिए CMD प्रक्रियाओं को करना गलत है, भले ही यह काम करता हो। System.IO नामस्थान पर प्रलेखन के माध्यम से पढ़ें। वहाँ अनावश्यक कार्यक्षमता प्रक्रियाओं को जन्म देने के बिना आपको क्या करने की आवश्यकता है, उसमें पर्याप्त कार्यक्षमता है।
इंस्टेंस हंटर

56
FYI करें: प्रक्रिया का उपयोग करें ।aitForExit () जारी रखने से पहले प्रक्रिया को पूरा करने के लिए प्रतीक्षा करें और प्रक्रिया से बाहर निकलें।
शिन्दिगो

122

@RameshVel समाधान की कोशिश की, लेकिन मैं अपने कंसोल एप्लिकेशन में तर्क पारित नहीं कर सका। अगर किसी को भी यहाँ एक ही समस्या का अनुभव है एक समाधान है:

using System.Diagnostics;

Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.CreateNoWindow = true;
cmd.StartInfo.UseShellExecute = false;
cmd.Start();

cmd.StandardInput.WriteLine("echo Oscar");
cmd.StandardInput.Flush();
cmd.StandardInput.Close();
cmd.WaitForExit();
Console.WriteLine(cmd.StandardOutput.ReadToEnd());

2
अच्छी तरह से मैंने यह सोचने का कोई मौका नहीं दिया कि मेरी मशीन पर कुछ एडमिन या एंटी वायरस प्रतिबंध हैं लेकिन ऊपर दिए गए कोड काम करते हैं! धन्यवाद ओग्लास
पीट कोज़ाक

6
यह पंक्ति: cmd.StartInfo.CreateNoWindow = true; मेरा दिन बचाया।
गणेश कामथ - 'कोड उन्माद'

वहाँ एक एकल में कई आदेशों को क्रियान्वित करने का एक तरीका हैcmd.StandardInput.WriteLine(@"cd C:\Test; pwd")
Zach Smith

36
var proc1 = new ProcessStartInfo();
string anyCommand; 
proc1.UseShellExecute = true;

proc1.WorkingDirectory = @"C:\Windows\System32";

proc1.FileName = @"C:\Windows\System32\cmd.exe";
proc1.Verb = "runas";
proc1.Arguments = "/c "+anyCommand;
proc1.WindowStyle = ProcessWindowStyle.Hidden;
Process.Start(proc1);

2
@C # में क्या संकेत है?
पचेरियर

6
@ स्पेसर यह संकलक को उन सभी पात्रों से बचने के लिए कहता है जो सामान्य रूप से स्ट्रिंग में बच सकते हैं, इस मामले में \ _। तो, \ proc1.FileName = "C:\\Windows\\System32\\cmd.exe";
जेम्स को-अप

1
एक को ध्यान देना चाहिए कि proc1.Verb = "runas";यह प्रक्रिया उन्नत विशेषाधिकारों के साथ चलती है ... यह हमेशा इरादा नहीं होता है।
दीनी

1
मैं इस cmd विंडो को समाप्त होने के बाद कैसे बंद नहीं कर सकता?
हृदयोज टी।

1
मैंने पाया कि लाइन में अन्य कमांड के साथ '&&' से जुड़कर 'cd पाथ' को कॉल करना हमेशा अंतिम चलता है, भले ही वह पहले चला गया हो। आपका: 'proc1.WorkingDirectory = @ "C: \ Windows \ System32";' बहुत मददगार था! धन्यवाद!
नोज़ीम तुरकुलोव

11

उपर्युक्त उत्तरों में से किसी ने भी किसी कारण से मदद नहीं की, ऐसा लगता है जैसे वे गलीचा के नीचे त्रुटियों को स्वीप करते हैं और किसी की समस्या का निवारण करते हैं। तो मैं इस तरह से कुछ के साथ जा रहा है, शायद यह किसी और की मदद करेगा:

var proc = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = @"C:\Program Files\Microsoft Visual Studio 14.0\Common7\IDE\tf.exe",
        Arguments = "checkout AndroidManifest.xml",
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true,
        WorkingDirectory = @"C:\MyAndroidApp\"
    }
};

proc.Start();

अगर मैं इसे स्टैंड-अलोन कंसोल एप्लिकेशन में संकलित करना चाहूंगा, तो इसे काम करने के लिए अन्य कोड को क्या जोड़ना होगा? (मैं यह सब प्रोग्रामिंग सामान के लिए एक noob हूँ, केवल कुछ स्क्रिप्टिंग किया है)। मैं csc.exe btw का उपयोग कर रहा हूँ।
script'n'code

@copyitright एक नाम स्थान और वर्ग। यदि आप सिर्फ एक नया प्रोजेक्ट बनाते हैं तो वे आपके लिए उत्पन्न होंगे।
संयोग

आह। कोई बात नहीं। यदि आप cmd.exeऐप का उपयोग करते हैं तो आप कमांड को तर्क के रूप में पास कर सकते हैं।
ज़ैच स्मिथ

पोस्टरिटी के लिए: मैं उस प्रक्रिया को echo Hello World!cmd विंडो में चलाना और प्रदर्शित करना चाहता था जो पॉप अप करती है। इसलिए मैं करने की कोशिश की: Filename = @"echo", Arguments = "Hello World!", UseShellExecute = false, RedirectStandardOuput = false, CreateNoWindow = false। इसने मूल एप्लिकेशन के cmd विंडो को "हैलो वर्ल्ड!" (जो समझ में आता है क्योंकि stdout को बाल प्रक्रिया में पुनर्निर्देशित नहीं किया गया था)।
मिन्ह ट्रैन

10

यद्यपि तकनीकी रूप से यह सीधे प्रश्न का उत्तर नहीं देता है, लेकिन यह इस सवाल का जवाब देता है कि मूल पोस्टर को क्या करना है: फ़ाइलों को संयोजित करना। अगर कुछ भी हो, तो यह एक पोस्ट है जिसमें newbies को यह समझने में मदद मिलेगी कि Instance Hunter और Konstantin किस बारे में बात कर रहे हैं।

यह वह विधि है जो मैं फ़ाइलों को संयोजित करने के लिए उपयोग करता हूं (इस मामले में एक jpg और एक ज़िप)। ध्यान दें कि मैं एक बफर बनाता हूं जो ज़िप फ़ाइल की सामग्री से भर जाता है (एक बड़े पढ़ने के ऑपरेशन की बजाए छोटी सी विखंडन में), और फिर बफर फ़ाइल के अंत तक बफर फ़ाइल के पीछे की ओर jpg फ़ाइल में लिखा जाता है। पहुंच गए:

private void CombineFiles(string jpgFileName, string zipFileName)
{
    using (Stream original = new FileStream(jpgFileName, FileMode.Append))
    {
        using (Stream extra = new FileStream(zipFileName, FileMode.Open, FileAccess.Read))
        {
            var buffer = new byte[32 * 1024];

            int blockSize;
            while ((blockSize = extra.Read(buffer, 0, buffer.Length)) > 0)
            {
                original.Write(buffer, 0, blockSize);
            }
        }
    }
}

9

यदि आप cmd विंडो को खुला रखना चाहते हैं या इसे winform / wpf में उपयोग करना चाहते हैं तो इसे इस तरह से उपयोग करें

    string strCmdText;
//For Testing
    strCmdText= "/K ipconfig";

 System.Diagnostics.Process.Start("CMD.exe",strCmdText);

/क

Cmd विंडो को ओपन रखेगा


अच्छा लगा। कमांड और इसके मापदंडों के लिए यह दस्तावेज मिला cmd
पायस

8

हां, मैट हैमिल्टन की टिप्पणी में लिंक देखें), लेकिन .NET के IO वर्गों का उपयोग करना आसान और बेहतर होगा। आप फ़ाइलों को पढ़ने के लिए File.ReadAllBytes का उपयोग कर सकते हैं और फिर "एम्बेडेड" संस्करण लिखने के लिए File.WriteAllBytes का उपयोग कर सकते हैं।


11
पूरी फाइलों को मेमोरी में लोड करना एक दूसरे को जोड़ने के लिए बहुत ही कुशल नहीं है, खासकर अगर फाइलें काफी बड़ी हैं।
कोन्सटेंटिन स्पिरिन

7
उत्तर की भावना को देखने की कोशिश करें। मुद्दा यह है कि .NET के पास आईओ शेल से कॉल किए बिना ऐसा करने के लिए पर्याप्त से अधिक IO कक्षाएं और फ़ंक्शन हैं। मैंने जिन विशेष कार्यों का उल्लेख किया है, वे शायद सबसे अच्छे न हों, लेकिन वे सबसे सरल थे। ऐसा करने के लिए शेल पर कॉल करने का कोई मतलब नहीं है।
इंस्टीट्यूट हंटर

7

आप CliWrap का उपयोग एक पंक्ति में कर सकते हैं :

var stdout = new Cli("cmd")
         .Execute("copy /b Image1.jpg + Archive.rar Image2.jpg")
         .StandardOutput;

मैंने इसे बढ़ा दिया ... लेकिन रेपो अब गायब लग रहा है:Unable to find package 'CliWrap' at source
Zach Smith

1
@ZachSmith निश्चित नहीं है कि आपका क्या मतलब है, nuget.org/packages/CliWrap ठीक काम करने लगता है। मूल लिंक भी।
टायरज

अह..सोर्री .. किसी कारण से जब मैं vpn पर अपने nuget रेपो से कनेक्ट नहीं कर सका तो मैं इस पैकेज को स्थापित करने में असमर्थ था। नगेट अभी भी ज्यादातर मेरे लिए एक रहस्य है। इसे गलत सेट किया जाना चाहिए
Zach Smith


5

यहाँ थोड़ा सरल और कम कोड संस्करण है। यह कंसोल विंडो को भी छिपा देगा-

System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.Arguments = "/C copy /b Image1.jpg + Archive.rar Image2.jpg";
process.Start();

5

यदि आप कमांड को async मोड में चलाना चाहते हैं - और परिणाम प्रिंट करें। आप इस वर्ग को देख सकते हैं:

    public static class ExecuteCmd
{
    /// <summary>
    /// Executes a shell command synchronously.
    /// </summary>
    /// <param name="command">string command</param>
    /// <returns>string, as output of the command.</returns>
    public static void ExecuteCommandSync(object command)
    {
        try
        {
            // create the ProcessStartInfo using "cmd" as the program to be run, and "/c " as the parameters.
            // Incidentally, /c tells cmd that we want it to execute the command that follows, and then exit.
            System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd", "/c " + command);
            // The following commands are needed to redirect the standard output. 
            //This means that it will be redirected to the Process.StandardOutput StreamReader.
            procStartInfo.RedirectStandardOutput =  true;
            procStartInfo.UseShellExecute = false;
            // Do not create the black window.
            procStartInfo.CreateNoWindow = true;
            // Now we create a process, assign its ProcessStartInfo and start it
            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.StartInfo = procStartInfo;
            proc.Start();

            // Get the output into a string
            string result = proc.StandardOutput.ReadToEnd();

            // Display the command output.
            Console.WriteLine(result);
        }
        catch (Exception objException)
        {
            // Log the exception
            Console.WriteLine("ExecuteCommandSync failed" + objException.Message);
        }
    }

    /// <summary>
    /// Execute the command Asynchronously.
    /// </summary>
    /// <param name="command">string command.</param>
    public static void ExecuteCommandAsync(string command)
    {
        try
        {
            //Asynchronously start the Thread to process the Execute command request.
            Thread objThread = new Thread(new ParameterizedThreadStart(ExecuteCommandSync));
            //Make the thread as background thread.
            objThread.IsBackground = true;
            //Set the Priority of the thread.
            objThread.Priority = ThreadPriority.AboveNormal;
            //Start the thread.
            objThread.Start(command);
        }
        catch (ThreadStartException )
        {
            // Log the exception
        }
        catch (ThreadAbortException )
        {
            // Log the exception
        }
        catch (Exception )
        {
            // Log the exception
        }
    }

}

2

आप निम्न विधि का उपयोग करके इसे प्राप्त कर सकते हैं (जैसा कि अन्य उत्तरों में बताया गया है):

strCmdText = "'/C some command";
Process.Start("CMD.exe", strCmdText);

जब मैंने ऊपर सूचीबद्ध तरीकों की कोशिश की, तो मैंने पाया कि मेरे कस्टम कमांड ने ऊपर दिए गए कुछ उत्तरों के सिंटैक्स का उपयोग करके काम नहीं किया है।

मुझे पता चला कि अधिक जटिल आदेशों को काम करने के लिए उद्धरण में समझाया जाना चाहिए:

string strCmdText;
strCmdText = "'/C cd " + path + " && composer update && composer install -o'";
Process.Start("CMD.exe", strCmdText);

1

आप कोड को एक .batप्रारूप एक्सटेंशन में, बैच फ़ाइल के कोड को लिखने के लिए उपयोग कर सकते हैं :

c:/ copy /b Image1.jpg + Archive.rar Image2.jpg

इस c # कोड का उपयोग करें:

Process.Start("file_name.bat")


यदि आप दौड़ते समय cmd को छुपाना चाहते हैं, तो आप .vbsप्रारूप विस्तार में एक साधारण दृश्य मूल स्क्रिप्ट कोड का उपयोग कर सकते हैं , कोड:CreateObject("Wscript.Shell").Run "filename.bat",0,True
XMMR12
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.