如何与Cmd持续沟通?

时间:2013-10-11 04:21:19

标签: c# cmd

我找到了如何在C#中打开cmd。

但我只能使用一次Inputstream。

创建Cmd进程

ProcessStartInfo CmdInfo = new ProcessStartInfo();
Process cmd = new Process();


CmdInfo.FileName = @"cmd";
CmdInfo.WindowStyle = ProcessWindowStyle.Hidden;
CmdInfo.CreateNoWindow = true;
CmdInfo.UseShellExecute = false;

CmdInfo.RedirectStandardInput = true;
CmdInfo.RedirectStandardOutput = true;
CmdInfo.RedirectStandardError = true;

cmd.EnableRaisingEvents = false;
cmd.StartInfo = CmdInfo;

cmd.Start();

现在我们可以使用cmd.StandardInput和cmd.StandardOutput。

使用Cmd

// Use cmd 1
cmd.StandardInput.WriteLine("cd");
cmd.StandardInput.Close(); // if don't close, I can't get output

Console.WriteLine( cmd.StandardOutput.ReadToEnd() ); // Done!

// Use cmd 2
cmd.StandardInput.WriteLine("cd C:\"); // It will occure ObjectDisposedException

我想解决这个问题。

2 个答案:

答案 0 :(得分:2)

我认为你不会对这种方法有所了解。代码是一个提示ProcessStart!这是一个新的过程!在您启动该过程后,它完全独立于您的代码所在的过程,您能够与此新过程进行通信的唯一方法是通过COM或远程处理或其他一些应用程序间通信... MSMQ等。

据我所知,cmd(命令提示符)不提供这些。

我想你会想要研究一下powershell ......

Calling PowerShell From C#

http://www.codeproject.com/Articles/18229/How-to-run-PowerShell-scripts-from-C

等等

答案 1 :(得分:1)

在输入关闭之前,命令shell可执行文件不会处理来自重定向标准输入的命令。

您有三种选择:

  1. 为每个命令创建一个新进程。
  2. 管道您要执行的所有命令,然后关闭标准输入句柄。
  3. 创建一个包含所有命令的批处理文件,然后执行该命令。
  4. 如果您选择为每个命令创建一个新进程,请使用cmd.exe的“/ C”命令行开关执行命令,而不是通过标准输入传递它。