【问题标题】:How to hide output (not the window) in a console application?如何在控制台应用程序中隐藏输出(不是窗口)?
【发布时间】:2011-11-16 18:46:23
【问题描述】:

好吧,让我再说一遍。我有一个包含许多类的控制台应用程序,每个类中至少有一个 Console.WriteLine("text") 行。我定义了一些参数,当运行应用程序时,它会准确地输出我在类中编写的内容。在那里,我想定义一个参数,当我使用此参数运行应用程序时,控制台屏幕上不会有输出,但控制台窗口仍会出现。参数可能类似于“-s”。那么有什么方法可以做到这一点,而无需在每个类中使用“if”条件并通过类传递参数?非常感谢。

P/S:我通过互联网搜索并找到了一些与此相关的文章,但大多数答案都是隐藏控制台窗口。我认为这个问题应该是其他人的意思。

【问题讨论】:

  • 您可以在应用程序主函数中解析输入-s,然后将控制台输出重定向到文件,例如,不屏幕,使用控制台类方法
  • 通常应该使用 Debug/Trace 来控制这种行为。
  • @Artur:实际上我不希望控制台输出到任何其他文件,我只想“隐藏”输出,但我仍然需要一些文本出现在控制台屏幕上,而不是隐藏所有。 AMisssico 的回答解决了我的这个问题,我只需要将输出流设置为 null TextWriter,然后随时设置回标准输出流。
  • @sajoshi:不太明白你的建议。在这种情况下调试/跟踪如何工作?
  • 我不确定为什么要隐藏输出。我的理解是您正在输出信息,以便您有一些可用的跟踪信息。

标签: c# command-line console console-application command-line-arguments


【解决方案1】:

使用 Console.SetOut (http://msdn.microsoft.com/en-us/library/system.console.setout.aspx) 并传入一个“空”文本编写器。 -s 上的想法执行 Console.SetOut(new StreamWriter())

Console.SetOut 方法的示例将帮助您入门。

此外,您可以使用此方法轻松添加日志记录。

【讨论】:

  • 当第三方库提供输出或从我的代码启动进程时,这是否有效?
【解决方案2】:

如果你直接传递nullConsole.SetOut 方法会抛出一个ArgumentNullExceptionStreamWriter 相同(如果您是 pass a streampass a string

我使用的是将特殊的Stream.Null 字段传递给StreamWriter

System.Console.SetOut(new System.IO.StreamWriter(System.IO.Stream.Null);

这会将流重定向到本质上是空设备(*NIX 机器上的/dev/null)。

【讨论】:

    【解决方案3】:

    使用这些方法重定向输出(以编程方式):

        Console.SetIn(...);
        Console.SetOut(...);
        Console.SetError(...);
    

    【讨论】:

    • 我也喜欢你的回答。但 AMissico 的回答更详细。还是谢谢^^。
    【解决方案4】:
    app.exe > nul
    

    将输出重定向到无处。仅供参考:Using command redirection operators

    【讨论】:

    • +1 我很确定他的意思是代码中的解决方案,但这真的很酷:D
    • 对不起,我真的是想传入一个参数,这样我就可以定义自己的参数了。此外,我仍然想输出一些文本,例如“以静音模式运行...”之类的开头,如果您将输出重定向到无处,则所有输出都不会再出现。
    • 好提示!很好的资源链接。
    【解决方案5】:

    你有没有遇到过Console.Clear(),你可以用一种让它看起来根本没有输出文本的方式来调用它。

    至于避免在每个类中单独定义这个,你应该看看继承。这允许您在一个地方定义功能,并且每个“子”类都将继承它。

    【讨论】:

    • 我从事的项目属于以前的团队,而不是新团队。如果我必须修改所有类,这将是一场灾难。
    【解决方案6】:

    您可以使用log4net 来定义要记录的项目。它允许您记录有关日志级别、您要记录的类等信息。

    【讨论】:

      【解决方案7】:

      这对很有效!:

      Console.SetOut(StreamWriter.Null);
      Console.SetError(StreamWriter.Null);
      

      这不起作用:

      Console.SetOut(null);
      Console.SetError(null);
      

      结果为@​​987654323@。

      这不起作用:

      Console.SetOut(new StreamWriter(null));
      Console.SetError(new StreamWriter(null));
      

      因为new StreamWriter(string path)new StreamWriter(Stream stream) 之间有歧义。

      最后,这些都不起作用:

      Console.SetOut(new StreamWriter(default(string)));
      Console.SetError(new StreamWriter(default(Stream)));
      

      因为它们也会产生ArgumentNullException

      【讨论】:

      • 为谁? :) 无论如何,您能否添加更多细节并解释您回答的背后是什么?它可以帮助发帖人更好地理解你的答案...
      • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
      • 没有意义,因为接受的答案显示使用不存在的新 StreamWriter()。
      猜你喜欢
      • 2011-04-20
      • 1970-01-01
      • 2017-08-03
      • 2016-03-30
      • 2011-04-04
      • 2012-08-02
      • 1970-01-01
      • 2011-06-19
      • 2011-04-03
      相关资源
      最近更新 更多