c#打开2个CMD窗口
我一直试图打开2个CMD窗口,但一旦我打开第2个CMD窗口,它就只使用第1个CMD窗口 我试着复制下面的代码,并使用p2和info2,这样就可以创建一个全新的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
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())
是否可能重复?