Saya tidak yakin mengapa Anda tidak ingin mengalihkan ke file. Ada dua metode yang akan saya berikan di sini. Salah satu metode adalah untuk mengarahkan ulang dan membaca dari file, yang lain adalah serangkaian program.
Bernama pipa
Apa yang saya lakukan adalah menulis dua program untuk .NET 4. Satu mengirimkan output ke pipa bernama, yang lain membaca dari pipa ini dan menampilkan ke konsol. Penggunaannya cukup sederhana:
asdf.exe | NamedPipeServer.exe "APipeName"
Di jendela konsol lain:
NamedPipeClient.exe "APipeName"
Sayangnya, ini hanya dapat mengarahkan ulang stdout
(atau stdin
, atau dikombinasikan), bukan stderr
dengan sendirinya, karena keterbatasan dalam operator pipa ( |
) di Prompt Perintah Windows. Jika Anda mengetahui cara mengirim stderr
melalui operator pipa itu, itu akan berhasil. Atau, server dapat dimodifikasi untuk meluncurkan program Anda dan secara khusus mengarahkan ulang stderr
. Jika itu perlu, beri tahu saya dalam komentar (atau lakukan sendiri); tidak terlalu sulit jika Anda memiliki pengetahuan pustaka C # dan .NET "Process".
Anda dapat mengunduh server dan klien .
Jika Anda menutup server setelah koneksi, klien akan segera menutup. Jika Anda menutup klien setelah koneksi, server akan menutup segera setelah Anda mencoba mengirim sesuatu melaluinya. Tidak mungkin untuk menyambungkan kembali pipa yang rusak, terutama karena saya tidak dapat diganggu melakukan sesuatu yang begitu rumit sekarang. Ini juga terbatas pada satu klien per server .
Kode sumber
Ini ditulis dalam C #. Tidak banyak gunanya mencoba menjelaskannya. Mereka menggunakan .NET NamedPipeServerStream dan NamedPipeClientStream .
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();
}
}
}
Klien:
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();
}
}
}
Mengarahkan kembali ke file
type NUL>StdErr.temp
start powershell -c Get-Content StdErr.temp -Wait
MyExecutable.exe 2>StdErr.temp
- Buat file kosong
- Mulai jendela konsol baru yang menonton file
- Jalankan
stderr
output yang dapat dieksekusi dan arahkan ke file itu
Ini memberikan efek yang diinginkan dari satu jendela konsol untuk menonton stdout
(dan menyediakan stdin
), dan lainnya untuk menonton stderr
.
Apa pun yang meniru tail
akan berhasil. Metode PowerShell bekerja secara asli di Windows, tetapi mungkin agak lambat (yaitu ada beberapa latensi antara penulisan ke file dan tampilan ke layar). Lihat pertanyaan StackOverflow ini untuk tail
alternatif lain .
Satu-satunya masalah adalah file sementara dapat tumbuh cukup besar. Solusi yang mungkin adalah menjalankan loop yang hanya mencetak jika file memiliki konten dan menghapus file segera setelahnya, tetapi itu akan menyebabkan kondisi balapan.