Ich bin mir nicht sicher, warum Sie nicht zu einer Datei umleiten möchten. Es gibt zwei Methoden, die ich hier zur Verfügung stellen werde. Eine Methode ist das Weiterleiten und Lesen einer Datei, die andere ist eine Reihe von Programmen.
Named Pipes
Ich habe zwei Programme für .NET 4 geschrieben. Eines sendet die Ausgabe an eine Named Pipe, das andere liest von dieser Pipe und zeigt sie an der Konsole an. Die Verwendung 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 umleiten stdout
(oder stdin
kombinieren), nicht stderr
von selbst |
. Wenn Sie herausfinden, wie Sie stderr
durch diesen Pipe-Operator senden , sollte es funktionieren. Alternativ könnte der Server geändert werden, um Ihr Programm zu starten und gezielt umzuleiten stderr
. Wenn das nötig ist, lass es mich in einem Kommentar wissen (oder mach es selbst); Es ist nicht allzu schwierig, wenn Sie über C # - und .NET- "Process" -Bibliothekskenntnisse verfügen.
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 durch ihn zu senden. Es ist nicht möglich, ein defektes Rohr wieder anzuschließen, vor allem, weil ich mich momentan nicht darum kümmere, etwas so Kompliziertes zu tun. Es ist auch auf einen Client pro Server beschränkt .
Quellcode
Diese sind in C # geschrieben. Es macht nicht viel Sinn, es zu erklären. Sie verwenden .NET NamedPipeServerStream und NamedPipeClientStream .
Der Kellner:
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();
}
}
}
In eine Datei umleiten
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, wenn ein Konsolenfenster überwacht stdout
(und bereitgestellt stdin
) und ein anderes überwacht wird stderr
.
Alles, was das nachahmt, tail
würde funktionieren. Die PowerShell-Methode funktioniert von Haus aus unter Windows, ist jedoch möglicherweise etwas langsam (dh zwischen dem Schreiben in die Datei und dem Anzeigen auf dem Bildschirm besteht eine gewisse Latenz). Weitere Alternativen finden Sie in dieser StackOverflow-Fragetail
.
Das einzige Problem ist, dass die temporäre Datei sehr groß werden kann. Eine mögliche Problemumgehung besteht darin, eine Schleife auszuführen, die nur gedruckt wird, wenn die Datei Inhalt enthält, und die Datei anschließend sofort zu löschen, was jedoch zu einer Race-Bedingung führen würde.