【问题标题】:Writing to console and stdout in VB.net在 VB.net 中写入控制台和标准输出
【发布时间】:2010-07-25 05:35:59
【问题描述】:

我有一个正在写入控制台的 winform 应用程序,它似乎运行良好。我正在使用此代码:

AttachConsole(-1)
 Console.Out.WriteLine("Hellow world")
  FreeConsole()

问题是: 如果我从命令行运行应用程序的 exe 文件,并尝试将输出重定向到文件中。它不起作用。 例如:

C:\ > myapp.exe > c:\output.txt

我仍然将输出输出到控制台屏幕(c:\output.txt 文件已创建但为空),但我希望将其保存到 c:\output.txt 怎么了?该怎么做?

非常感谢!

【问题讨论】:

  • 你为什么打电话给AttachConsoleConsole.Out 已经是标准输出了。

标签: vb.net winforms console stdout


【解决方案1】:

如果您首先检查输出是否被重定向,您也可以吃蛋糕。这是一个包含 P/Invoke voodoo 的小助手类:

using System;
using System.Runtime.InteropServices;

public static class ConsoleEx {
    public static bool OutputRedirected {
        get { return FileType.Char != GetFileType(GetStdHandle(StdHandle.Stdout)); }
    }
    public static bool InputRedirected {
        get { return FileType.Char != GetFileType(GetStdHandle(StdHandle.Stdin)); }
    }
    public static bool ErrorRedirected {
        get { return FileType.Char != GetFileType(GetStdHandle(StdHandle.Stderr)); }
    }

    // P/Invoke:
    private enum FileType { Unknown, Disk, Char, Pipe };
    private enum StdHandle { Stdin = -10, Stdout = -11, Stderr = -12 };
    [DllImport("kernel32.dll")]
    private static extern FileType GetFileType(IntPtr hdl);
    [DllImport("kernel32.dll")]
    private static extern IntPtr GetStdHandle(StdHandle std);
}

用法:

bool redir = ConsoleEx.OutputRedirected;
if (!redir) AttachConsole(-1);
// etc...

【讨论】:

  • 谢谢。你能提供链接 VB.NET 的等效代码吗?
  • 谢谢。您能否提供 VB.NET 中相同代码的链接?或者如何在 VB.NET 中使用它?
  • 嗯,一个链接。这段代码是原创的,我的大脑还没上线。这是一个:developerfusion.com/tools/convert/csharp-to-vb
  • 谢谢汉斯。我把它翻译成VB并试了一下。即使没有重定向,它也总是返回 true...
【解决方案2】:

您附加到父进程以提供输出,在您的情况下可能是 cmd.exe。父进程的 stdout 流没有被重定向,因此继续在屏幕上显示输出。

我不知道直接的方法。如果您不调用AttachConsole,您会发现重定向按预期工作,但是当然您会失去拥有控制台窗口的选项。但是,有一个我认为是合理的解决方法。

如果您希望输出转到控制台窗口,那么您可以为您的应用程序提供一个指示此要求的命令行开关,例如

C:\> myapp.exe /console

当存在/console 参数时,您调用AttachConsole 并且输出将被写入控制台。当此开关不存在时,您无需调用AttachConsole,您将能够将输出重定向到文件。

【讨论】:

  • 听起来不错。那么我应该怎么做才能解决它..?谢谢
  • @emc2,请查看我的编辑,了解可能适合您要求的解决方案。
  • 谢谢!我将使用这种方法。有没有办法确定命令行是否包含重定向(> >>)标志?我试图通过使用“Environment.GetCommandLineArgs”来计算它,但似乎找不到它。如果我能找到它是否包含重定向标志,那对我来说会比“/console”开关好得多。谢谢!
  • @emc2,重定向由 shell (cmd.exe) 处理,因此当命令行到达您的应用程序时,重定向已经从命令行中剥离。我没有尝试过,但是您可以通过将输出句柄与标准输出句柄进行比较来检测输出已被重定向。使用 CreateFile 打开“CONOUT$”可以找到标准输出句柄,这是我的一篇文章,可以帮助您。 stackoverflow.com/questions/3173750/…
猜你喜欢
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
相关资源
最近更新 更多