я не уверен, почему вы не хотите перенаправить в файл. Есть два метода, которые я приведу здесь. Первый способ-перенаправление и чтение из файла, другой набор программ.
именованные каналы
я написал две программы для .NET 4. Один отправляет выходные данные в именованный канал, другой считывает их из этого канала и выводит на консоль. Использование довольно просто:
asdf.exe | NamedPipeServer.exe "APipeName"
в другой консоли window:
NamedPipeClient.exe "APipeName"
к сожалению, перенаправить можно только stdout
(или stdin
, или вместе взятые), а не stderr
само собой, из-за ограничений в операторе трубы (|
) в командной строке Windows. Если вы выясните, как отправить stderr
через оператора трубы, он должен работать. В качестве альтернативы, сервер может быть изменен, чтобы запустить программу и специально перенаправить stderr
. Если это необходимо, дайте мне знать в комментарии (или сделайте это самостоятельно); это не слишком сложно, если у вас есть некоторые C# и .NET "процесс" библиотеки знаний.
можно скачать сервер и client.
если вы закроете сервер после подключения, клиент закроется немедленно. Если вы закроете клиент после подключения, сервер закроется, как только вы попытаетесь отправить что-то через него. невозможно подключить сломанную трубу, в основном потому, что я не могу быть обеспокоен тем, что делаю что-то настолько сложное правильно теперь. Он также ограничен один клиент на сервер.
исходный код
они написаны на 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
альтернативы.
проблема лишь в том, что временный файл может стать довольно большим. Возможный обходной путь должен выполнить цикл, который только печатает, если файл имеет содержание и очищает файл сразу после этого, но это вызвало бы условие гонки.