Gibt es eine Möglichkeit, die Standardausgabe eines Prozesses in der Win32-Konsole an eine Named Pipe umzuleiten ? Named Pipes sind in Windows integriert und obwohl sie ein nützliches Konzept wären, habe ich sie noch nie von der Befehlszeile aus gesehen.
Dh wie example.exe >\\.\mypipe
. (Diese Syntax ist möglicherweise nicht korrekt, aber Sie verstehen den Punkt.) Ich möchte in der Lage sein, stdout und stderr gleichzeitig auf verschiedene Pipes umzuleiten .
Ich möchte vermeiden, physische Dateien als Ersatz zu verwenden, um nicht mit E / A-Langsamkeit, E / A-Puffern, Dateisperren, Zugriffsrechten, verfügbarem Festplattenspeicher, Überschreibungsentscheidungen, unbeabsichtigter Persistenz usw. umzugehen.
Ein weiterer Grund ist, dass die traditionellen Windows- Tools nicht so sehr auf einer (text-) dateibasierten Philosophie basieren wie unter Unix . Außerdem konnten Named Pipes in Windows nicht ohne weiteres bereitgestellt werden, wenn überhaupt.
Schließlich besteht die Neugier, ob ein gutes Konzept sinnvoll eingesetzt werden kann.
quelle
Antworten:
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:
In einem anderen Konsolenfenster:
Leider kann dies aufgrund von Einschränkungen des Pipe-Operators ( ) in der Windows-Eingabeaufforderung nur umleiten
stdout
(oderstdin
kombinieren), nichtstderr
von selbst|
. Wenn Sie herausfinden, wie Siestderr
durch diesen Pipe-Operator senden , sollte es funktionieren. Alternativ könnte der Server geändert werden, um Ihr Programm zu starten und gezielt umzuleitenstderr
. 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:
Der Kunde:
In eine Datei umleiten
stderr
Ausgabe in diese Datei umDies bietet den gewünschten Effekt, wenn ein Konsolenfenster überwacht
stdout
(und bereitgestelltstdin
) und ein anderes überwacht wirdstderr
.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.
quelle
Ich bin überrascht, dass dies noch nicht richtig beantwortet wurde. Das System weist Named Pipes einen UNC-Pfad zu, auf den auf allen Computern im Netzwerk zugegriffen werden kann. Dieser Pfad kann wie eine normale Datei verwendet werden:
Vorausgesetzt, auf diesem Computer sind Pipes mit den Namen "StdOutPipe" und "StdErrPipe" vorhanden, wird versucht, eine Verbindung herzustellen und darauf zu schreiben. Der
pipe
Teil gibt an, dass Sie eine Named Pipe wünschen.quelle
Nicht mit der Standard-Shell (CMD.EXE). Für Programmierer ist es ziemlich einfach . Nehmen Sie einfach die beiden Pipes eines Prozesses, den Sie gestartet haben.
quelle
Ihre Vorlieben für eine Windows-Pipe von Daten von einem Server zu einem Client-DOS-Fenster, entweder sofort oder später, könnten mit einem kleinen RAM-Laufwerk zufrieden sein. Derselbe Speicher wird für die Daten reserviert, die mit einem dateisystemähnlichen Namen geschrieben / gelesen werden. Der Client löscht entweder die verbrauchte Datei und wartet auf eine andere oder lässt sie beim Herunterfahren des Computers verschwinden.
quelle