2010-07-25 5 views
1

J'ai une application winform qui écrit sur console et qui semble fonctionner correctement. J'utilise ce code:Ecriture sur console et stdout dans VB.net

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

La question est: Si je lance le fichier exe de l'application de la ligne de commande, et essayer de rediriger la sortie dans un fichier. Ça ne marche pas. Par exemple:

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

je reçois toujours la sortie à l'écran console (fichier c: \ sortie.txt est créé, mais vide), mais je veux qu'il soit enregistré dans c: \ sortie.txt Qu'est-ce ça va mal? Comment faire ça?

Merci beaucoup!

+0

Pourquoi appelez-vous 'AttachConsole'? 'Console.Out' est déjà sur stdout. – Oded

+0

Merci Oded! – Dave

Répondre

0

Vous vous attachez au processus parent pour fournir une sortie, ce qui dans votre cas est probablement cmd.exe. Le flux stdout du processus parent n'a pas été redirigé et continue donc d'afficher la sortie sur l'écran.

Je ne suis pas au courant d'une approche directe. Si vous n'appelez pas AttachConsole, vous constaterez que la redirection fonctionne comme prévu, mais bien sûr, vous perdez l'option d'avoir une fenêtre de console. Cependant, il y a un travail qui me semble raisonnable.

Si vous voulez que la sortie pour aller à une fenêtre de la console, vous fournissez votre application avec un commutateur de ligne de commande qui indique cette exigence, quelque chose comme

C:\> myapp.exe /console 

Lorsque l'argument /console est présent que vous appelez AttachConsole et la sortie sera écrit sur la console. Lorsque ce commutateur n'est pas présent, vous ne faites pas l'appel à AttachConsole et vous serez en mesure de rediriger la sortie vers un fichier.

+0

Cela semble vrai. Alors, que dois-je faire pour le résoudre ..? Merci – Dave

+0

@ emc2, s'il vous plaît voir mon édition pour une solution possible qui pourrait répondre à vos besoins. –

+0

Merci! Je vais utiliser cette approche. Existe-t-il un moyen de déterminer si la ligne de commande contient des signes de redirections (> >>)? J'ai essayé de le comprendre en utilisant "Environment.GetCommandLineArgs" mais il semble ne pas le trouver. Si je pouvais trouver s'il contient des signes de redirection, ce serait beaucoup mieux pour moi que le commutateur "/ console". Merci! – Dave

1

Vous pouvez avoir votre gâteau et le manger aussi si vous vérifiez d'abord si la sortie a été redirigée. Voici une petite classe d'aide qui contient le 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); 
} 

Utilisation:

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

Merci. Pouvez-vous fournir le lien le code équivalent pour VB.NET? – Dave

+0

Merci. Pouvez-vous fournir le lien pour le même code dans VB.NET? Ou comment l'utiliser avec VB.NET? – Dave

+1

Hmm, un lien. Ce code est original, mon cerveau n'est pas encore en ligne. Voici une: http://www.developerfusion.com/tools/convert/csharp-to-vb/ –

Questions connexes