Je ne sais pas pourquoi vous ne voulez pas rediriger vers un fichier. Il y a deux méthodes que je vais fournir ici. Une méthode consiste à rediriger vers et à lire un fichier, l'autre est un ensemble de programmes.
Tuyaux nommés
J'ai écrit deux programmes pour .NET 4. L'un envoie la sortie à un canal nommé, l'autre lit à partir de ce canal et s'affiche sur la console. L'utilisation est assez simple:
asdf.exe | NamedPipeServer.exe "APipeName"
Dans une autre fenêtre de console:
NamedPipeClient.exe "APipeName"
Malheureusement, cela ne peut que rediriger stdout
(ou stdin
, ou combiné), pas stderr
seul, en raison des limitations de l'opérateur de canal ( |
) dans l'invite de commandes Windows. Si vous savez comment envoyer stderr
via cet opérateur de tuyau, cela devrait fonctionner. Alternativement, le serveur pourrait être modifié pour lancer votre programme et rediriger spécifiquement stderr
. Si cela est nécessaire, faites-le moi savoir dans un commentaire (ou faites-le vous-même); ce n'est pas trop difficile si vous avez des connaissances en bibliothèque C # et .NET "Process".
Vous pouvez télécharger le serveur et le client .
Si vous fermez le serveur après la connexion, le client se fermera immédiatement. Si vous fermez le client après la connexion, le serveur se fermera dès que vous tenterez d'envoyer quelque chose par son intermédiaire. Il n'est pas possible de reconnecter un tuyau cassé, principalement parce que je ne peux pas être dérangé de faire quelque chose de si compliqué en ce moment. Il est également limité à un client par serveur .
Code source
Celles-ci sont écrites en C #. Il n'y a pas grand-chose à essayer de l'expliquer. Ils utilisent le .NET NamedPipeServerStream et NamedPipeClientStream .
Le serveur:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Pipes;
using System.IO;
namespace NamedPipeServer
{
class Program
{
static void Main(string[] args)
{
if (args == null || args.Length == 0)
{
Console.Error.WriteLine("[NamedPipeServer]: Need pipe name.");
return;
}
NamedPipeServerStream PipeServer = new NamedPipeServerStream(args[0], System.IO.Pipes.PipeDirection.Out);
PipeServer.WaitForConnection();
StreamWriter PipeWriter = new StreamWriter(PipeServer);
PipeWriter.AutoFlush = true;
string tempWrite;
while ((tempWrite = Console.ReadLine()) != null)
{
try
{
PipeWriter.WriteLine(tempWrite);
}
catch (IOException ex)
{
if (ex.Message == "Pipe is broken.")
{
Console.Error.WriteLine("[NamedPipeServer]: NamedPipeClient was closed, exiting");
return;
}
}
}
PipeWriter.Close();
PipeServer.Close();
}
}
}
Le client:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Pipes;
using System.IO;
namespace NamedPipeClient
{
class Program
{
static void Main(string[] args)
{
if (args == null || args.Length == 0)
{
Console.Error.WriteLine("[NamedPipeClient]: Need pipe name.");
return;
}
NamedPipeClientStream PipeClient = new NamedPipeClientStream(".", args[0], System.IO.Pipes.PipeDirection.In);
PipeClient.Connect();
StreamReader PipeReader = new StreamReader(PipeClient);
string tempRead;
while ((tempRead = PipeReader.ReadLine()) != null)
{
Console.WriteLine(tempRead);
}
PipeReader.Close();
PipeClient.Close();
}
}
}
Redirection vers un fichier
type NUL>StdErr.temp
start powershell -c Get-Content StdErr.temp -Wait
MyExecutable.exe 2>StdErr.temp
- Créer un fichier vide
- Démarrer une nouvelle fenêtre de console qui surveille le fichier
- Exécutez l'exécutable et redirigez la
stderr
sortie vers ce fichier
Cela fournit l'effet souhaité d'une fenêtre de console à regarder stdout
(et fournir stdin
) et d'une autre à regarderstderr
.
Tout ce qui imite tail
fonctionnerait. La méthode PowerShell fonctionne de manière native dans Windows, mais peut être un peu lente (c'est-à-dire qu'il y a une certaine latence entre l'écriture dans le fichier et l'affichage à l'écran). Voir cette question StackOverflow pour d'autres tail
alternatives.
Le seul problème est que le fichier temporaire peut devenir assez volumineux. Une solution de contournement possible consiste à exécuter une boucle qui s'imprime uniquement si le fichier a du contenu et à effacer le fichier immédiatement après, mais cela provoquerait une condition de concurrence critique.