Я не уверен, почему вы не хотите перенаправить в файл. Здесь я приведу два метода. Один метод - перенаправление и чтение из файла, другой - набор программ.
Именованные трубы
Я написал две программы для .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
альтернатив.
Единственная проблема - временный файл может стать довольно большим. Возможный обходной путь - запустить цикл, который печатает только в том случае, если в файле есть содержимое, и сразу же очищать файл, но это может вызвать состояние гонки.