Запись на консоль и стандартный вывод в VB.net - PullRequest
2 голосов
/ 25 июля 2010

У меня есть приложение winform, которое пишет в консоль, и кажется, что оно работает хорошо.Я использую этот код:

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

Вопрос: если я запускаю exe-файл приложения из командной строки и пытаюсь перенаправить вывод в файл.Не работаетНапример:

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

Я все еще получаю вывод на экран консоли (файл c: \ output.txt создан, но пустой), но я хочу, чтобы он был сохранен в c: \ output.txt. Чтопошло не так ?Как это сделать?

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 25 июля 2010

Вы можете получить свой торт и съесть его, если вы сначала проверите, был ли перенаправлен вывод. Вот небольшой вспомогательный класс, который содержит 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...
0 голосов
/ 25 июля 2010

Вы подключаетесь к родительскому процессу, чтобы обеспечить вывод, который в вашем случае, вероятно, является cmd.exe.Поток stdout родительского процесса не был перенаправлен и поэтому продолжает отображать вывод на экране.

Я не знаю о прямом подходе.Если вы не позвоните AttachConsole, вы обнаружите, что перенаправление работает, как и ожидалось, но, конечно, тогда вы потеряете возможность иметь консольное окно.Однако есть обходной путь, который я считаю разумным.

Если вы хотите, чтобы вывод выводился в окне консоли, тогда вы предоставляете приложению переключатель командной строки, который указывает на это требование, что-то вроде

C:\> myapp.exe /console

Когда присутствует аргумент /console, вы вызываете AttachConsole, и вывод будет записан на консоль.Когда этот переключатель отсутствует, вы не выполняете вызов AttachConsole и сможете перенаправить вывод в файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...