如何从Windows窗体执行控制台应用程序?

16

我希望在Windows窗体的加载事件中运行一个命令行应用程序(例如app.exe)。

我已经尝试使用System.Diagnostics.Process.Start(),但是它打开app.exe后立即将其关闭了。

有没有办法可以运行app.exe并让它保持打开状态?


1
你想让 all.exe 保持打开状态吗?它是否等待用户输入?如果它正在关闭,那是因为 app.exe 已经完成了它需要做的事情并且正在关闭。 - Neil Barnwell
为了调试目的,尝试在 app.exe 中放置一个睡眠命令,大约持续 10 秒钟。应用程序是否保持打开状态 10 秒钟,还是立即关闭?如果有崩溃日志,其中是否报告了任何信息? - FrustratedWithFormsDesigner
当您从命令行运行app.exe时,它是否有任何不同的操作?您需要传递参数吗? - J.Hendrix
9个回答

13

如果你只想让控制台窗口保持打开状态,可以使用以下命令来运行它:

System.Diagnostics.Process.Start( @"cmd.exe", @"/k c:\path\my.exe" );

有效,但我的路径来自一个文本框,因此如果我的路径中有空格,它将无法工作。 - Or Betzalel
1
@Or Betzalel:我没有在这种特定情况下尝试过,但我认为你可以用双引号括起来路径。或者使用ProcessStartInfo对象作为Process.Start的参数。 - Mark Wilkins

3

尝试执行以下操作:

        string cmdexePath = @"C:\Windows\System32\cmd.exe";
        //notice the quotes around the below string...
        string myApplication = "\"C:\\Windows\\System32\\ftp.exe\"";
        //the /K keeps the CMD window open - even if your windows app closes
        string cmdArguments = String.Format("/K {0}", myApplication);
        ProcessStartInfo psi = new ProcessStartInfo(cmdexePath, cmdArguments);
        Process p = new Process();
        p.StartInfo = psi;
        p.Start();

我认为这将会得到你想要的行为。假设你不只是想在命令窗口中看到输出。如果你只想看到输出,那么你已经有了几个版本的答案。这只是让你可以运行应用程序并保持控制台打开的方法。
希望这能帮到你。祝你好运。

2
如果 app.exe 什么也不做或者完成工作很快(例如只是简单地打印“Hello World”并返回),它将按照您刚才解释的方式运行。如果你想让 app.exe 在完成工作后保持打开状态,请在控制台应用程序中放置某种完成消息,然后跟随 Console.ReadKey();

1
如果你没有控制 app.exe 的内部工作方式,那么你应该了解它的功能。在这种情况下,你可以尝试传递一个帮助标志,可能会提供更多关于如何调用 app.exe 的信息。尝试类似这样的命令:
private startApp()
{
    string command = " -h"; //common help flag for console apps
    System.Diagnostics.Process pRun;
    pRun = new System.Diagnostics.Process();
    pRun.EnableRaisingEvents = true;
    pRun.Exited += new EventHandler(pRun_Exited);
    pRun.StartInfo.FileName = "app.exe";
    pRun.StartInfo.Arguments = command;
    pRun.StartInfo.WindowStyle =  System.Diagnostics.ProcessWindowStyle.Normal

    pRun.Start();
    pRun.WaitForExit();
}
private void  pRun_Exited(object sender, EventArgs e)
{
    //Do Something Here
}

1
如果你可以更改 app.exe 的代码,只需添加 Console.In.Read() 使其等待按键即可。

1

假设app.exe也是一个C#应用程序,您可以通过Console.ReadLine()结束它,前提是您控制源代码。


1

根据您的主/从应用程序设置,您可能有以下两个问题之一:

  1. 您的主应用程序正在打开、显示一个表单,该表单运行从应用程序并立即关闭,即使从应用程序仍在运行。
  2. 您的主应用程序正在打开、显示一个表单,该表单运行从应用程序并立即关闭。

对于第一个问题,您需要等待/阻塞进程完成(即使用 Process.WaitForExit())。

对于第二个问题,似乎从应用程序已经完成了它需要做的事情(或抛出了异常)并立即关闭。尝试从命令提示符中使用相同的参数运行它并检查输出。


0
创建一个新的文本文件,命名为app.bat,并将以下内容放入其中:
app.exe
pause

现在让你的表单指向那个批处理文件。


0
在您的控制台应用程序中,输入以下内容:

Console.ReadLine(); - 使用此代码片段等待直到按下回车键

Console.ReadKey(); - 使用此代码等待按下任意键


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接