Ich bin nicht sicher, warum Sie nicht in eine Datei umleiten möchten. Ich werde hier zwei Methoden zur Verfügung stellen. Eine Methode besteht darin, eine Datei umzuleiten und aus einer Datei zu lesen, die andere besteht aus einer Reihe von Programmen.
Named Pipes
Was ich getan habe, war das Schreiben von zwei Programmen für .NET 4. Eines sendet eine Ausgabe an eine Named Pipe, das andere liest aus dieser Pipe und zeigt sie an der Konsole an. Die Nutzung ist ganz einfach:
asdf.exe | NamedPipeServer.exe "APipeName"
In einem anderen Konsolenfenster:
NamedPipeClient.exe "APipeName"
Leider kann dies aufgrund von Einschränkungen des Pipe-Operators ( ) in der Windows-Eingabeaufforderung nur von alleine stdout
(oder stdin
kombiniert) umgeleitet werden . Wenn Sie herausfinden, wie Sie diesen Pipe-Operator senden, sollte dies funktionieren. Alternativ kann der Server geändert werden, um Ihr Programm zu starten und gezielt umzuleiten . Wenn das notwendig ist, lassen Sie es mich in einem Kommentar wissen (oder machen Sie es selbst). Es ist nicht zu schwierig, wenn Sie über Kenntnisse in der C # - und .NET-Bibliothek "Process" verfügen.stderr
|
stderr
stderr
Sie können den Server und den Client herunterladen .
Wenn Sie den Server nach der Verbindung schließen, wird der Client sofort geschlossen. Wenn Sie den Client nach der Verbindung schließen, wird der Server geschlossen, sobald Sie versuchen, etwas über ihn zu senden. Es ist nicht möglich, eine kaputte Pipe wieder anzuschließen, vor allem, weil ich mich nicht darum kümmere, etwas so kompliziertes zu machen. Es ist auch auf einen Client pro Server beschränkt .
Quellcode
Diese sind in C # geschrieben. Es gibt keinen Grund, es zu erklären. Sie verwenden .NET NamedPipeServerStream und NamedPipeClientStream .
Der Server:
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(); } } }
Der Kunde:
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(); } } }
Umleitung in eine Datei
type NUL>StdErr.temp start powershell -c Get-Content StdErr.temp -Wait MyExecutable.exe 2>StdErr.temp
- Erstellen Sie eine leere Datei
- Starten Sie ein neues Konsolenfenster, das die Datei überwacht
- Führen Sie die ausführbare Datei aus und leiten Sie die
stderr
Ausgabe in diese Datei um
Dies bietet den gewünschten Effekt eines Konsolenfensters zum Ansehen stdout
(und Bereitstellen stdin
) und eines weiteren zum Beobachten stderr
.
Alles, was imitiert, tail
würde funktionieren. Die PowerShell-Methode funktioniert nativ unter Windows, kann jedoch etwas langsam sein (dh zwischen dem Schreiben der Datei und dem Anzeigen auf dem Bildschirm gibt es eine gewisse Latenz). In dieser StackOverflow-Frage finden Sie weitere tail
Alternativen.
Das einzige Problem ist, dass die temporäre Datei ziemlich groß werden kann. Eine mögliche Problemumgehung besteht darin, eine Schleife auszuführen, die nur dann druckt, wenn die Datei Inhalt enthält, und die Datei unmittelbar danach zu löschen. Dies würde jedoch eine Racebedingung verursachen.