Soru Aynı konsolda bir işlem başlat


Bir işlem başlatabilir miyim (C # kullanarak Process.Start()) arama programı ile aynı konsolda? Bu şekilde yeni pencere oluşturulmayacak ve standart giriş / çıkış / hata çağıran konsol uygulaması ile aynı olmayacaktır. Ayarlamayı denedim process.StartInfo.CreateNoWindow = true; Ancak süreç hala yeni bir pencerede başlar (ve tamamlandıktan sonra hemen kapanır).


25
2017-09-03 07:31


Menşei




Cevaplar:


Belirlenenden başka bir şey yapmanıza gerek yok. UseShellExecute = false, Win32 için varsayılan davranış olarak Süreci oluşturmak Bir konsol uygulaması için, siz belirtmedikçe, üst konsolun konsolunu devralması gerekir. CREATE_NEW_CONSOLE bayrağı.

Aşağıdaki programı denedim:

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();
}

ve bana bu çıktıyı verdi:

alt text


44
2017-09-03 08:28



Harika çalıştın, teşekkürler. - ses011


Bu işlemin çıktısını yeniden yönlendirmeyi ve ardından arama işlemi konsoluna yazdırmayı deneyebilirsiniz:

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());
    }
}

Kullanarak alternatif yaklaşım Exited olay ve bekleme kolu:

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());
    }           
}

8
2017-09-03 07:41



İle döngü için herhangi bir özel sebep Thread.Sleep dinlemek yerine Process.Exited ve bunun yerine bekle kolu ile senkronize etmek? - Fredrik Mörk
Hayır, belirli bir sebep yok, sadece tembel olmak, cevabımı bu mükemmel öneriyi yansıtacak şekilde düzenlemekte özgürsünüz. - Darin Dimitrov
Ya da sadece kullanabilirsin Process.WaitForExit :) - Phil Devaney