c#打开2个CMD窗口

c#打开2个CMD窗口,c#,cmd,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.Fi

我一直试图打开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);       
    }
}

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

默认情况下,每当windows进程创建子进程时,它都会继承父进程的控制台窗口(如果有)。发件人:

创建新控制台 0x00000010

新进程有一个新控制台,而不是继承其父进程的控制台(默认)。有关详细信息,请参阅

和来自:

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

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

  • GUI或控制台进程可以使用CREATE_NEW_console的CreateProcess函数来创建具有新控制台的控制台进程。(默认情况下,控制台进程继承其父进程的控制台,并且不保证输入由其预期的进程接收。)
  • 当前未连接到控制台的图形用户界面(GUI)或控制台进程可以使用该功能创建新控制台。(GUI进程在创建时不会连接到控制台。如果控制台进程是使用CreateProcess和分离的_进程创建的,则不会连接到控制台。)
不幸的是,该类没有公开
CREATE\u NEW\u控制台
功能,从中可以看出

我将注意到,您的代码确实成功创建了两个
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);
                    }
                }
            }
        }
    }

唯一的问题是,输出在控制台窗口中混合出现。也许您还是想将输出重定向回您自己的进程?

最好能看到p2代码,这样我们就可以看到您是否完整地复制了它。尝试打开两个控制台的代码在哪里?完成后不要忘了处理进程:
使用(System.Diagnostics.process process=new System.Diagnostics.process())
是否可能重复?