1

我找到了如何在 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。

使用命令

// 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

我想解决这个问题。

4

2 回答 2

2

我不认为你会用这种方法走得太远。该代码是一个提示 ProcessStart !这是一个新的过程!在您启动进程后,它与您的代码所在的进程完全分开,您能够与这个新进程通信的唯一方法是通过 COM 或远程处理或其他一些应用程序间通信通道...... MSMQ 等。

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

我想你会想学习powershell ...

从 C# 调用 PowerShell

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

等等等等

于 2013-10-11T04:50:18.363 回答
1

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

你有三个选择:

  1. 为每个命令创建一个新进程。
  2. 将您要执行的所有命令流水线化,然后关闭标准输入句柄。
  3. 创建一个包含所有命令的批处理文件,然后执行它。

如果您选择为每个命令创建一个新进程,请使用 cmd.exe 的“/C”命令行开关来执行命令,而不是通过标准输入传递它。

于 2013-10-11T05:14:58.737 回答