ファイルにリダイレクトしたくない理由がわかりません。ここで提供する方法は2つあります。1つの方法はファイルへのリダイレクトとファイルからの読み取りで、もう1つはプログラムのセットです。
名前付きパイプ
.NET 4用の2つのプログラムを作成しました。1つは名前付きパイプに出力を送信し、もう1つはこのパイプから読み取り、コンソールに表示します。使い方はとても簡単です:
asdf.exe | NamedPipeServer.exe "APipeName"
別のコンソールウィンドウで:
NamedPipeClient.exe "APipeName"
残念ながら、これはWindowsコマンドプロンプトのパイプ演算子()の制限により、それ自体ではなく、リダイレクトstdout
(またはstdin
、または結合)のみ可能です。そのパイプ演算子を介して送信する方法を見つけた場合、それは動作するはずです。または、サーバーを変更してプログラムを起動し、具体的にリダイレクトすることもできます。それが必要な場合は、コメントで知らせてください(または自分でやります)。C#および.NETの「プロセス」ライブラリの知識があれば、それほど難しくありません。stderr
|
stderr
stderr
サーバーとクライアントをダウンロードできます。
接続後にサーバーを閉じると、クライアントはすぐに閉じます。接続後にクライアントを閉じると、サーバーは何かを送信しようとするとすぐに閉じます。壊れたパイプを再接続することはできません。これは、ほとんどの場合、今はそれほど複雑なことをするのが面倒だからです。また、サーバーごとに1つのクライアントに制限されます。
ソースコード
これらは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
そのファイルに出力をリダイレクトします
これにより、1つのコンソールウィンドウが監視stdout
(および提供stdin
)し、別のウィンドウが監視するという望ましい効果が得られstderr
ます。
模倣tail
するものはすべて動作します。PowerShellメソッドはWindowsでネイティブに機能しますが、少し遅い場合があります(つまり、ファイルへの書き込みから画面への表示までに多少の遅延があります)。他の選択肢については、このStackOverflowの質問をご覧くださいtail
。
唯一の問題は、一時ファイルが非常に大きくなる可能性があることです。考えられる回避策は、ファイルにコンテンツがある場合にのみ印刷し、その後すぐにファイルをクリアするループを実行することですが、それにより競合状態が発生します。