c#打开2个CMD窗口

时间:2014-08-19 10:45:09

标签: c# cmd

我一直试图打开2个CMD窗口,但是一旦打开第2个CMD窗口,它就会使用第1个CMD窗口。

我尝试复制下面的代码并使用p2和info2,因此它会创建一个全新的cmd窗口,但它没有帮助。

Console.BackgroundColor = ConsoleColor.DarkGreen;
Console.Title = "PCRF";

Process p = new Process();
ProcessStartInfo info = new ProcessStartInfo();
info.FileName = "cmd.exe";
info.RedirectStandardInput = true;
info.UseShellExecute = false;

p.StartInfo = info;
p.Start();

using (StreamWriter sw = p.StandardInput)
{
    if (sw.BaseStream.CanWrite)
    {
        sw.WriteLine("cd " + tbFilePath.Text + "\\SW\\bin\\Apps\\PCRFServer_new ");
        sw.WriteLine("runServer.bat " + ip_res  + userSelectedPcrfFilePath);       
    }
}

1 个答案:

答案 0 :(得分:0)

您可以使用重定向输入和/或c#程序中的输出,将cmd.exe的多个实例作为分离进程运行。但是,您不能直接为它们创建多个控制台窗口,并且仍然会将输入或输出重定向回自己。

默认情况下,只要Windows进程创建子进程,就会继承父进程的控制台窗口(如果有)。来自Process Creation Flags

  

CREATE_NEW_CONSOLE   0x00000010

     

新进程有一个新的控制台,而不是继承其父控制台(默认)。有关更多信息,请参阅Creation of a Console

来自Creation of a Console

  

系统在启动控制台进程时创建一个新控制台,这是一个字符模式进程,其入口点是主要功能。例如,系统在启动命令处理器时会创建一个新控制台。当命令处理器启动新的控制台进程时,用户可以指定系统是否为新进程创建新控制台,或者是否继承了命令处理器的控制台。

     

进程可以使用以下方法之一创建控制台:

     
      
  • GUI或控制台进程可以使用带有CREATE_NEW_CONSOLE的CreateProcess函数来创建具有新控制台的控制台进程。 (默认情况下,控制台进程会继承其父级控制台,并且无法保证其所针对的进程收到输入。)
  •   
  • 当前未附加到控制台的图形用户界面(GUI)或控制台进程可以使用AllocConsole功能创建新控制台。 (GUI进程在创建时不会附加到控制台。如果使用带有DETACHED_PROCESS的CreateProcess创建控制台进程,则控制台进程不会附加到控制台。)
  •   

不幸的是,Process类没有公开CREATE_NEW_CONSOLE功能,如reference source所示。

我将注意到您的代码成功创建了两个cmd.exe进程,这些进程在共享同一控制台窗口时具有不同的输入流,并且可以用于并行执行批处理文件。我使用以下代码对此进行了测试,并且能够看到在Windows任务管理器中运行的cmd.exe的多个实例,每个实例都执行其指定的任务:

    private static void TestMultipleCmdLaunches()
    {
        TestCmdLaunch("cmd.exe", GetNextColorCommand(), "title PCRF", "echo window 1", "sleep 60");
        TestCmdLaunch("cmd.exe", GetNextColorCommand(), "title PCRF", "echo window 2", "sleep 60");
        TestCmdLaunch("cmd.exe", GetNextColorCommand(), "title PCRF", "yes 1");
        TestCmdLaunch("cmd.exe", GetNextColorCommand(), "title PCRF", "yes 2");
    }

    static string[] backgroundColors = 
        { "0F","1F","2F","3F","4F", "5F", "60", "70", "8F", "90", "A0", "B0", "C0", "D0", "E0"};
    static int lastBackgroundColor = 0;
    private static string GetNextColorCommand()
    {
        int nextColor = unchecked(Interlocked.Increment(ref lastBackgroundColor) % backgroundColors.Length);
        return "color " + backgroundColors[nextColor];
    }

    private static void TestCmdLaunch(string filename, params string [] commands)
    {
        using (Process p = new Process())
        {
            ProcessStartInfo info = new ProcessStartInfo();
            info.FileName = filename;
            info.RedirectStandardInput = true;
            info.UseShellExecute = false;

            p.StartInfo = info;
            p.Start();

            using (StreamWriter sw = p.StandardInput)
            {
                if (sw.BaseStream.CanWrite)
                {
                    foreach (var cmd in commands)
                    {
                        sw.WriteLine(cmd);
                    }
                }
            }
        }
    }

唯一的问题是输出显示在控制台窗口中混合。也许你想将输出重定向回你自己的进程呢?