【问题标题】:C# Prevent a started app from writing in the consoleC# 防止已启动的应用程序在控制台中写入
【发布时间】:2020-02-13 16:22:56
【问题描述】:

我有一个启动另一个应用程序的应用程序。这个其他应用程序在控制台中打印了几行,但没有人需要这个输出,它打印出我自己的输出。如何防止此其他应用程序将其内容打印到我的控制台中? 我尝试在truefalse 上使用ProcessStartInfo.UseShellExecutive 运行,还尝试在开始之前将控制台输出更改为 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();

【问题讨论】:

  • 您是如何将子进程标准输出重定向到内存流的?至少显示那部分代码。重定向(类似>nul)也可以工作。
  • 由你添加.. :)
  • 这是否适用:stackoverflow.com/a/3642517/1132334(将RedirectStandardOutput 设置为true,只是不将任何处理程序附加到OutputDataReceived)?
  • 我不确定我是否理解正确,但我添加了重定向并且没有向 OutputDataRecieved 添加任何内容,但它仍然显示在我的控制台中:((将帖子更改为当前代码)跨度>
  • 也许子进程写入stderr而不是stdout。也重定向错误输出,有一个单独的属性。相关:stackoverflow.com/q/29967590/1132334

标签: c# .net-core console


【解决方案1】:

在您的代码中,确保您重新定向StandardOutputStandardError,这样“ThirdPartyApp”写入的所有内容都将在这些流中的任何一个中捕获 em>。

我写了一个小助手类来帮助解决这个问题

你可以像这样使用

//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 帮助程序类

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


}

【讨论】:

  • 我不得不重定向流,但我不需要任何附加的流处理程序,我只是忘记了 ARK 服务器也可以使用 stderr 而不是 stdout,所以我只将 stdout 重定向到什么都没有:/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 2013-12-01
  • 2013-02-23
  • 1970-01-01
相关资源
最近更新 更多