c#中调用cmd来运行命令
普通的命令都可以运行成功,但是这个命令总是不行,请给出一个详细的代码,可以运行成功的给分 展开
原文地址:
翻译:漫步到宇宙尽头
这篇文章将会告诉你如何像用微软的 命令提示符(cmd) 那样,在C#程序中执行命令。
介绍
使用Windows的命令提示符执行命令是一件很平常的事。当命令被执行后,命令提示符会将结果显示在屏幕上。我们常用的命令有很多,诸如:dir,find……
有时候,你可能也会想在C#程序中执行(外壳)命令。
不用担心!!!下面的代码可以实现你的想法…
示例代码
下面给出的代码创建了一个程序,即一个命令行程序来执行我们的目标命令。命令执行的结果被存储在一个 字符串变量 中,这个 字符串变量 中的信息可以给我们更多参考。我们可以使用 顺序执行(同步) 和 并列执行(异步) 两种方式来执行命令。在并列执行是,我们使用一个独立的线程来执行命令。你可以通过阅读程序中的注释来学习这个方法。
下面的这个代码使用 顺序执行 的方法来运行。
1. /// <span class="code-SummaryComment"><summary></span>
2. /// Executes a shell command synchronously.
3. ///顺序执行 一个 外壳命令
4. /// <span class="code-SummaryComment"></summary></span>
5. /// <span class="code-SummaryComment"><param name="command">string command</param></span>
6. /// <span class="code-SummaryComment"><returns>string, as output of the command.</returns></span>
7. public void ExecuteCommandSync(object command)
8. {
9. try
10. {
11. // create the ProcessStartInfo using "cmd" as the program to be run,
12. // and "/c " as the parameters.
13. // Incidentally, /c tells cmd that we want it to execute the command that follows,
14. // and then exit.
15. // 创建一个 ProcessStartInfo类型的变量,将 “命令”作为程序来运行。
16. //将 “/c”作为一个参数。
17. //顺便说下, /c 告诉 命令提示符:我们想要它执行 /c 后面的命令,然后退出。
18. System.Diagnostics.ProcessStartInfo procStartInfo =
19. new System.Diagnostics.ProcessStartInfo("cmd", "/c " + command);
20.
21. // The following commands are needed to redirect the standard output.
22. // This means that it will be redirected to the Process.StandardOutput StreamReader.
23. // 我们需要重定向 命令提示符 的标准输出。
24. // 这意味着 命令提示符 将会 重定向到 Process.StandardOutput.StrezamReader 。
25. procStartInfo.RedirectStandardOutput = true;
26. procStartInfo.UseShellExecute = false;
27. // Do not create the black window.
28. //不创建 黑色的窗口。
29. procStartInfo.CreateNoWindow = true;
30. // Now we create a process, assign its ProcessStartInfo and start it
31. //现在我们创建一个 process,并将 ProcessStartInfo 赋值给它后,开始执行它。
32. System.Diagnostics.Process proc = new System.Diagnostics.Process();
33. proc.StartInfo = procStartInfo;
34. proc.Start();
35. // Get the output into a string //将输出存入一个字符串变量中。
36. string result = proc.StandardOutput.ReadToEnd();
37. // Display the command output.
38. //显示执行命令后的结果
39. Console.WriteLine(result);
40. }
41. catch (Exception objException)
42. {
43. // Log the exception
44. //记录异常
45. }
}
上面的代码调用 命令提示符 来处理等待执行的命令。因为我们想要将输出重定向到 StreamReader,所以procStartInfo.RedirectStandardOutput 的值被置为 true。procStartInfo.CreateNoWindow 变量被赋值true,这样就可以隐藏那个黑色的窗口。因此,程序将会静默执行命令。
下面的代码使用 并行 方式执行命令。
1. /// <span class="code-SummaryComment"><summary></span>
2. /// Execute the command Asynchronously.
3. /// <span class="code-SummaryComment"></summary></span>
4. /// <span class="code-SummaryComment"><param name="command">string command.</param></span>
5. public void ExecuteCommandAsync(string command)
6. {
7. try
8. {
9. //Asynchronously start the Thread to process the Execute command request.
10. Thread objThread = new Thread(new ParameterizedThreadStart(ExecuteCommandSync));
11. //Make the thread as background thread.
12. objThread.IsBackground = true;
13. //Set the Priority of the thread.
14. objThread.Priority = ThreadPriority.AboveNormal;
15. //Start the thread.
16. objThread.Start(command);
17. }
18. catch (ThreadStartException objException)
19. {
20. // Log the exception
21. }
22. catch (ThreadAbortException objException)
23. {
24. // Log the exception
25. }
26. catch (Exception objException)
27. {
28. // Log the exception
29. }
}
如果我们仔细观察,并行的程序实际上是开辟了一个线程来调用顺序执行的程序。线程在后台运行,使得命令本质上是并行执行的。
通过以上的示例代码,我们可以发现,“dir”命令有两种输出结果。第一个示例代码在命令执行完成后立即显示结果,而后一个示例代码,则是在输出“Done!”后才输出结果。原因是,第一个示例是顺序执行,也就是结果会立即出现。而第二个则是并行执行“dir”命令。