Запустите процесс в той же консоли - PullRequest
29 голосов
/ 03 сентября 2010

Могу ли я запустить процесс (используя C # Process.Start()) в той же консоли, что и вызывающая программа?Таким образом, новое окно не будет создано, и стандартный ввод / вывод / ошибка будет таким же, как и у вызывающего консольного приложения.Я попытался установить process.StartInfo.CreateNoWindow = true;, но процесс все еще запускается в новом окне (и сразу же закрывается после его завершения).

Ответы [ 2 ]

47 голосов
/ 03 сентября 2010

Вам не нужно делать ничего, кроме установки UseShellExecute = false, поскольку поведение по умолчанию для функции Win32 CreateProcess заключается в том, что консольное приложение наследует консоль своего родителя, если вы не укажете CREATE_NEW_CONSOLE flag.

Я попробовал следующую программу:

private static void Main()
{
    Console.WriteLine( "Hello" );

    var p = new Process();
    p.StartInfo = new ProcessStartInfo( @"c:\windows\system32\netstat.exe", "-n" ) 
        {
            UseShellExecute = false
        };

    p.Start();
    p.WaitForExit();

    Console.WriteLine( "World" );
    Console.ReadLine();
}

, и он дал мне такой вывод:

alt text

9 голосов
/ 03 сентября 2010

Вы можете попытаться перенаправить вывод этого процесса и затем распечатать его на консоли вызывающего процесса:

public class Program
{
    static void Main()
    {
        var psi = new ProcessStartInfo
        {
            FileName = @"c:\windows\system32\netstat.exe",
            Arguments = "-n",
            RedirectStandardOutput = true,
            UseShellExecute = false
        };
        var process = Process.Start(psi);
        while (!process.HasExited)
        {
            Thread.Sleep(100);
        }

        Console.WriteLine(process.StandardOutput.ReadToEnd());
    }
}

Альтернативный подход с использованием события Exited и дескриптора ожидания:

static void Main()
{
    using (Process p = new Process())
    {
        p.StartInfo = new ProcessStartInfo
        {
            FileName = @"netstat.exe",
            Arguments = "-n",                                        
            RedirectStandardOutput = true,
            UseShellExecute = false                    
        };
        p.EnableRaisingEvents = true;
        using (ManualResetEvent mre = new ManualResetEvent(false))
        {
            p.Exited += (s, e) => mre.Set();
            p.Start();
            mre.WaitOne();
        }

        Console.WriteLine(p.StandardOutput.ReadToEnd());
    }           
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...