Non sono sicuro del motivo per cui non si desidera reindirizzare a un file. Ci sono due metodi che fornirò qui. Un metodo consiste nel reindirizzare e leggere da un file, l'altro è un insieme di programmi.
Pipe nominate
Quello che ho fatto è stato scrivere due programmi per .NET 4. Uno invia l'output a una pipe denominata, l'altro legge da questa pipe e viene visualizzato sulla console. L'utilizzo è abbastanza semplice:
asdf.exe | NamedPipeServer.exe "APipeName"
In un'altra finestra della console:
NamedPipeClient.exe "APipeName"
Sfortunatamente, questo può solo reindirizzare stdout
(o stdin
, o combinato), non stderr
da solo, a causa delle limitazioni nell'operatore pipe ( |
) nel Prompt dei comandi di Windows. Se capisci come inviare stderr
attraverso quell'operatore di pipa, dovrebbe funzionare. In alternativa, è possibile modificare il server per avviare il programma e reindirizzare in modo specifico stderr
. Se è necessario, fammi sapere in un commento (o fallo da solo); non è troppo difficile se si ha una certa conoscenza della libreria "Process" di C # e .NET.
È possibile scaricare il server e il client .
Se si chiude il server dopo la connessione, il client si chiuderà immediatamente. Se si chiude il client dopo la connessione, il server si chiuderà non appena si tenta di inviare qualcosa attraverso di esso. Non è possibile ricollegare un tubo rotto, soprattutto perché non posso essere disturbato a fare qualcosa di così complicato in questo momento. È inoltre limitato a un client per server .
Codice sorgente
Questi sono scritti in C #. Non ha molto senso cercare di spiegarlo. Usano .NET NamedPipeServerStream e NamedPipeClientStream .
Il server:
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();
}
}
}
Il 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();
}
}
}
Reindirizzamento a un file
type NUL>StdErr.temp
start powershell -c Get-Content StdErr.temp -Wait
MyExecutable.exe 2>StdErr.temp
- Crea un file vuoto
- Avvia una nuova finestra della console che controlla il file
- Esegui eseguibile e reindirizza l'
stderr
output su quel file
Ciò fornisce l'effetto desiderato di una finestra della console da guardare stdout
(e fornire stdin
) e un'altra da guardare stderr
.
Tutto ciò che imita tail
avrebbe funzionato. Il metodo PowerShell funziona in modo nativo in Windows, ma potrebbe essere un po 'lento (ovvero c'è una certa latenza tra la scrittura sul file e la visualizzazione sullo schermo). Vedi questa domanda StackOverflow per altre tail
alternative.
L'unico problema è che il file temporaneo potrebbe diventare piuttosto grande. Una possibile soluzione alternativa consiste nell'eseguire un ciclo che stampa solo se il file ha contenuto e cancella il file immediatamente dopo, ma ciò causerebbe una condizione di competizione.