C# Предотвращение записи запущенного приложения в консоли - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть приложение, которое запускает другое приложение. Это другое приложение печатает несколько строк в консоли, но никому не нужен этот вывод, и он выводит свой вывод между моими собственными. Как я могу запретить этому другому приложению печатать свои вещи в моей консоли? Я попытался запустить с ProcessStartInfo.UseShellExecutive на true и false, также пытался изменить вывод консоли на MemoryStream перед запуском, но так как мне нужна Консоль, мне пришлось изменить вывод обратно, и это похоже на другое приложение их вход тоже изменился.

Process serverprocess = new Process();
serverprocess.StartInfo.FileName = Path.GetFileName(serverpath);
serverprocess.StartInfo.Arguments = launch;
serverprocess.StartInfo.UseShellExecute = false;
serverprocess.StartInfo.RedirectStandardOutput = true;
serverprocess.Start();

1 Ответ

1 голос
/ 14 февраля 2020

В вашем коде убедитесь, что вы перенаправляете и StandardOutput, и StandardError таким образом, что все, что пишет "ThirdPartyApp", будет захвачено в любом из этих потоков .

Я написал небольшой класс помощников, который помогает с этим

Вы можете использовать как

//Launching excel.exe with /safe as arg
var excelExample1 = @"""C:\Program Files (x86)\Microsoft Office\Office15\EXCEL.EXE"" /safe";

LaunchCMD.Invoke(excelExample1);

//To get its output, if any
var getOutput = LaunchCMD.Output;

LaunchCMD Helper Class

class LaunchCMD
{


    public static string Output
    {
        get; set;
    } = "";




    public static void Invoke(string command, bool waitTillExit = false, bool closeOutputWindow = false)
    {

        ProcessStartInfo ProcessInfo;
        Process Process = new Process();


        ProcessInfo = new ProcessStartInfo("cmd.exe", "/C " + command);


        ProcessInfo.CreateNoWindow = false;
        ProcessInfo.UseShellExecute = false;
        ProcessInfo.RedirectStandardOutput = true;
        ProcessInfo.RedirectStandardError = true;
        Process.EnableRaisingEvents = true;

        Process = Process.Start(ProcessInfo);


        Process.ErrorDataReceived += ConsoleDataReceived;
        Process.OutputDataReceived += ConsoleDataReceived;


        Process.BeginOutputReadLine();
        Process.BeginErrorReadLine();




        if (waitTillExit == true)
        {


            Process.WaitForExit();
        }
        if (closeOutputWindow == true)
        {
            Process.CloseMainWindow();
        }


        Process.Close();
        System.Threading.Thread.Sleep(1000);
        Output.ToString();


    }


    private static void ConsoleDataReceived(object sender, DataReceivedEventArgs e)
    {
        System.Threading.Thread.Sleep(1000);
        if (e.Data != null)
        {
            Output = Output + e.Data;
        }
    }


}
...