Я не уверен, почему вы не хотите перенаправить в файл. Здесь я приведу два метода. Один метод - перенаправление и чтение из файла, другой - набор программ.
Именованные трубы
Я написал две программы для .NET 4. Одна отправляет вывод в именованный канал, другая читает из этого канала и выводит на консоль. Использование довольно просто:
asdf.exe | NamedPipeServer.exe "APipeName"
В другом окне консоли:
NamedPipeClient.exe "APipeName"
К сожалению, это может только перенаправить stdout
(или stdin
, или объединить), но не stderr
само по себе, из-за ограничений в трубе оператора ( |
) в командной строке Windows. Если вы выясните, как отправить stderr
через этого оператора трубопровода, это должно работать. Кроме того, сервер может быть изменен для запуска вашей программы и, в частности, для перенаправления stderr
. Если это необходимо, дайте мне знать в комментарии (или сделайте это самостоятельно); это не так уж сложно, если у вас есть знания по библиотекам C # и .NET "Process".
Вы можете скачать сервер и клиент .
Если вы закроете сервер после подключения, клиент закроется немедленно. Если вы закроете клиент после подключения, сервер закроется, как только вы попытаетесь что-то отправить через него. Невозможно восстановить сломанную трубу, главным образом потому, что я не могу быть обеспокоен тем, что сейчас занимаюсь чем-то таким сложным. Это также ограничено одним клиентом на сервер .
Исходный код
Они написаны на C #. Нет особого смысла пытаться это объяснить. Они используют .NET NamedPipeServerStream и NamedPipeClientStream .
Сервер:
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(); } } }
Клиент:
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(); } } }
Перенаправление в файл
type NUL>StdErr.temp start powershell -c Get-Content StdErr.temp -Wait MyExecutable.exe 2>StdErr.temp
- Создать пустой файл
- Запустите новое окно консоли, которое просматривает файл
- Запустите исполняемый файл и перенаправьте
stderr
вывод в этот файл
Это обеспечивает желаемый эффект одного окна консоли для просмотра stdout
(и предоставления stdin
), а другого - для просмотра stderr
.
Все, что имитирует, tail
будет работать. Метод PowerShell изначально работает в Windows, но может быть немного медленным (то есть существует некоторая задержка между записью в файл и отображением на экране). Посмотрите этот вопрос StackOverflow для других tail
альтернатив.
Единственная проблема - временный файл может стать довольно большим. Возможный обходной путь - запустить цикл, который печатает только в том случае, если в файле есть содержимое, и сразу же очищать файл, но это может вызвать состояние гонки.