我一直试图打开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);
}
}
答案 0 :(得分:0)
您可以使用重定向输入和/或c#程序中的输出,将cmd.exe
的多个实例作为分离进程运行。但是,您不能直接为它们创建多个控制台窗口,并且仍然会将输入或输出重定向回自己。
默认情况下,只要Windows进程创建子进程,就会继承父进程的控制台窗口(如果有)。来自Process Creation Flags:
CREATE_NEW_CONSOLE 0x00000010
新进程有一个新的控制台,而不是继承其父控制台(默认)。有关更多信息,请参阅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);
}
}
}
}
}
唯一的问题是输出显示在控制台窗口中混合。也许你想将输出重定向回你自己的进程呢?