Neden bir dosyaya yönlendirmek istemediğinizden emin değilim. Burada sağlayacağım iki yöntem var. Bir yöntem bir dosyaya yönlendirme ve dosyadan okuma, diğeri ise bir dizi programdır.
Adlandırılmış borular
Yaptığım şey, .NET 4 için iki program yazmaktı. Biri adlandırılmış bir boruya çıktı gönderir, diğeri bu borudan okur ve konsola görüntüler. Kullanımı oldukça basit:
asdf.exe | NamedPipeServer.exe "APipeName"
Başka bir konsol penceresinde:
NamedPipeClient.exe "APipeName"
Ne yazık ki, bu , Windows Komut İstemi'ndeki boru operatörünün ( ) sınırlamaları nedeniyle yalnızca kendi başına değil yeniden yönlendirebilir stdout
(veya stdin
birleştirebilir) . Bu boru operatörünü nasıl göndereceğinizi anlarsanız, çalışması gerekir. Alternatif olarak, sunucu programınızı başlatacak ve özellikle yeniden yönlendirecek şekilde değiştirilebilir . Bu gerekliyse, bir yorumda bana bildirin (veya kendiniz yapın); bazı C # ve .NET "İşlem" kitaplığı bilginiz varsa çok zor değil.stderr
|
stderr
stderr
Sunucuyu ve istemciyi indirebilirsiniz .
Bağlantıdan sonra sunucuyu kapatırsanız, istemci hemen kapanacaktır. Bağlantıdan sonra istemciyi kapatırsanız, sunucu bir şey göndermeye çalıştığınızda kapanır. Kırık bir boruyu yeniden bağlamak mümkün değil, çünkü şu anda çok karmaşık bir şey yapmaktan rahatsız edilemiyorum. Ayrıca sunucu başına bir istemci ile sınırlıdır .
Kaynak kodu
Bunlar C # ile yazılmıştır. Bunu açıklamaya çalışmanın pek bir anlamı yok. .NET NamedPipeServerStream ve NamedPipeClientStream kullanırlar .
Sunucu:
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();
}
}
}
Müşteri:
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();
}
}
}
Bir dosyaya yönlendirme
type NUL>StdErr.temp
start powershell -c Get-Content StdErr.temp -Wait
MyExecutable.exe 2>StdErr.temp
- Boş bir dosya oluştur
- Dosyayı izleyen yeni bir konsol penceresi başlatın
- Yürütülebilir dosyayı çalıştırın ve
stderr
çıktıyı bu dosyaya yönlendirin
Bu, izlemek stdout
(ve sağlamak stdin
) için bir konsol penceresinin ve izlemek için başka bir konsol penceresinin istenen etkisini sağlar stderr
.
Taklit eden her şey işe yarar tail
. PowerShell yöntemi Windows'da yerel olarak çalışır, ancak biraz yavaş olabilir (yani, dosyaya yazma ile ekrana görüntüleme arasında bir miktar gecikme olabilir). Diğer alternatifler için bu StackOverflow sorusuna bakın tail
.
Tek sorun geçici dosya oldukça büyüyebilir. Olası bir geçici çözüm, yalnızca dosyanın içeriğe sahip olması durumunda yazdırılan ve dosyayı hemen sonra temizleyen bir döngü çalıştırmaktır, ancak bu bir yarış durumuna neden olur.