2010-07-25 3 views
1

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

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

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

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

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

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

+0

Почему вы называете 'AttachConsole'? 'Console.Out' уже есть. – Oded

+0

Спасибо, Одед! – Dave

ответ

0

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

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

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

C:\> myapp.exe /console 

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

+0

Звучит так. Итак, что мне делать, чтобы разрешить это.? Спасибо – Dave

+0

@ emc2, см. Мое редактирование для возможного решения, которое может удовлетворить ваши требования. –

+0

Спасибо! Я собираюсь использовать этот подход. Есть ли способ выяснить, содержит ли в командной строке переадресацию (> >>)? Я попытался понять это с помощью «Environment.GetCommandLineArgs», но, похоже, не нашел его. Если бы я мог найти, если он содержит знаки переадресации, для меня это будет намного лучше, чем переключатель «/ console». Спасибо! – Dave

1

Вы можете получить свой торт и съесть его, если вы сначала проверите, был ли перенаправлен выход. Вот небольшой вспомогательный класс, который содержит P/Invoke вуду:

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

Спасибо. Можете ли вы предоставить ссылку на эквивалентный код для VB.NET? – Dave

+0

Спасибо. Можете ли вы предоставить ссылку на тот же код в VB.NET? Или как использовать его с VB.NET? – Dave

+1

Хмм, ссылка. Этот код оригинален, мой мозг еще не в сети. Вот один из них: http://www.developerfusion.com/tools/convert/csharp-to-vb/ –

Смежные вопросы