Tôi không chắc tại sao bạn không muốn chuyển hướng đến một tập tin. Có hai phương pháp tôi sẽ cung cấp ở đây. Một phương pháp là chuyển hướng đến và đọc từ một tệp, hai là một bộ chương trình.
Đặt tên ống
Những gì tôi đã làm là viết hai chương trình cho .NET 4. Một chương trình gửi đầu ra đến một ống có tên, phần còn lại đọc từ ống này và hiển thị tới bàn điều khiển. Cách sử dụng khá đơn giản:
asdf.exe | NamedPipeServer.exe "APipeName"
Trong một cửa sổ giao diện điều khiển khác:
NamedPipeClient.exe "APipeName"
Thật không may, điều này chỉ có thể chuyển hướng stdout
(hoặc stdin
, hoặc kết hợp), chứ không phải stderr
do chính nó, do những hạn chế trong toán tử đường ống ( |
) trong Dấu nhắc lệnh của Windows. Nếu bạn tìm ra cách gửi stderr
qua toán tử đường ống, nó sẽ hoạt động. Ngoài ra, máy chủ có thể được sửa đổi để khởi chạy chương trình của bạn và đặc biệt chuyển hướng stderr
. Nếu điều đó là cần thiết, hãy cho tôi biết trong một nhận xét (hoặc tự làm); không quá khó nếu bạn có kiến thức về thư viện "Quy trình" C # và .NET.
Bạn có thể tải về máy chủ và máy khách .
Nếu bạn đóng máy chủ sau khi kết nối, máy khách sẽ đóng ngay lập tức. Nếu bạn đóng máy khách sau khi kết nối, máy chủ sẽ đóng ngay khi bạn cố gửi thứ gì đó qua nó. Không thể kết nối lại một đường ống bị hỏng, chủ yếu là vì tôi không thể bận tâm làm điều gì đó quá phức tạp ngay bây giờ. Nó cũng giới hạn một khách hàng trên mỗi máy chủ .
Mã nguồn
Chúng được viết bằng C #. Không có nhiều điểm cố gắng để giải thích nó. Họ sử dụng .NET NamedPipeServerStream và NamedPipeClientStream .
Máy chủ:
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();
}
}
}
Khách hàng:
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();
}
}
}
Chuyển hướng đến một tập tin
type NUL>StdErr.temp
start powershell -c Get-Content StdErr.temp -Wait
MyExecutable.exe 2>StdErr.temp
- Tạo một tập tin trống
- Bắt đầu một cửa sổ giao diện điều khiển mới xem tập tin
- Chạy thực thi và chuyển hướng
stderr
đầu ra đến tập tin đó
Điều này cung cấp hiệu ứng mong muốn của một cửa sổ giao diện điều khiển để xem stdout
(và cung cấp stdin
) và một cửa sổ khác để xem stderr
.
Bất cứ điều gì bắt chước tail
sẽ làm việc. Phương thức PowerShell hoạt động tự nhiên trong Windows, nhưng có thể hơi chậm (tức là có một số độ trễ giữa ghi vào tệp và hiển thị ra màn hình). Xem câu hỏi StackOverflow này cho các tail
lựa chọn thay thế khác.
Vấn đề duy nhất là tập tin tạm thời có thể phát triển khá lớn. Một cách giải quyết khác có thể là chạy một vòng lặp chỉ in nếu tệp có nội dung và xóa tệp ngay sau đó, nhưng điều đó sẽ gây ra tình trạng chạy đua.