Não sei por que você não deseja redirecionar para um arquivo. Existem dois métodos que fornecerei aqui. Um método é redirecionar e ler de um arquivo, o outro é um conjunto de programas.
Canais nomeados
O que fiz foi escrever dois programas para o .NET 4. Um envia a saída para um pipe nomeado, o outro lê esse pipe e é exibido no console. O uso é bastante simples:
asdf.exe | NamedPipeServer.exe "APipeName"
Em outra janela do console:
NamedPipeClient.exe "APipeName"
Infelizmente, isso só pode redirecionar stdout
(ou stdin
ou combinar), não stderr
por si só, devido a limitações no operador de pipe ( |
) no prompt de comando do Windows. Se você descobrir como enviar stderr
através desse operador de tubo, ele deverá funcionar. Como alternativa, o servidor pode ser modificado para iniciar seu programa e redirecionar especificamente stderr
. Se necessário, informe-me em um comentário (ou faça você mesmo); não é muito difícil se você tiver algum conhecimento da biblioteca "Process" em C # e .NET.
Você pode baixar o servidor e o cliente .
Se você fechar o servidor após a conexão, o cliente fechará imediatamente. Se você fechar o cliente após a conexão, o servidor será fechado assim que você tentar enviar algo através dele. Não é possível reconectar um tubo quebrado, principalmente porque não posso me incomodar em fazer algo tão complicado agora. Também é limitado a um cliente por servidor .
Código fonte
Estes são escritos em c #. Não faz muito sentido tentar explicar isso. Eles usam o .NET NamedPipeServerStream e NamedPipeClientStream .
O servidor:
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();
}
}
}
O cliente:
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();
}
}
}
Redirecionando para um arquivo
type NUL>StdErr.temp
start powershell -c Get-Content StdErr.temp -Wait
MyExecutable.exe 2>StdErr.temp
- Crie um arquivo vazio
- Iniciar uma nova janela do console que assiste o arquivo
- Executar executável e redirecionar a
stderr
saída para esse arquivo
Isso fornece o efeito desejado de uma janela do console para assistir stdout
(e fornecer stdin
) e outra para assistir stderr
.
Qualquer coisa que imite tail
funcionaria. O método PowerShell funciona nativamente no Windows, mas pode ser um pouco lento (ou seja, há alguma latência entre a gravação no arquivo e a exibição na tela). Veja esta questão StackOverflow para outras tail
alternativas.
O único problema é que o arquivo temporário pode crescer bastante. Uma solução possível é executar um loop que é impresso apenas se o arquivo tiver conteúdo e limpá-lo imediatamente depois, mas isso causaria uma condição de corrida.