我不确定为什么您不想重定向到文件。我将在此处提供两种方法。一种方法是重定向到文件或从文件读取,另一种是一组程序。
命名管道
我所做的是为.NET 4编写了两个程序。一个程序将输出发送到命名管道,另一个程序从该管道读取并显示到控制台。用法很简单:
asdf.exe | NamedPipeServer.exe "APipeName"
在另一个控制台窗口中:
NamedPipeClient.exe "APipeName"
不幸的是,由于Windows命令提示符中的管道运算符()的限制,它只能重定向stdout
(或stdin
合并),而不能单独重定向。如果您知道如何通过该管道操作员发送消息,它应该可以工作。或者,可以修改服务器以启动您的程序,并专门重定向。如果有必要,请在评论中让我知道(或您自己做);如果您具有一些C#和.NET“过程”库知识,这并不是很难。stderr
|
stderr
stderr
您可以下载服务器和客户端。
如果在连接后关闭服务器,客户端将立即关闭。如果您在连接后关闭客户端,则服务器将在您尝试通过它发送邮件时立即关闭。重新连接断了的管道是不可能的,主要是因为我现在不愿意做那么复杂的事情。每个服务器也仅限于一个客户端。
源代码
这些都是用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
输出重定向到该文件
这提供了一个期望的效果,一个控制台窗口可以观看stdout
(并提供stdin
),另一个可以观看stderr
。
任何模仿的东西tail
都会起作用。PowerShell方法在Windows中本机运行,但是可能有点慢(即,在写入文件和在屏幕上显示之间存在一些延迟)。有关其他替代方法,请参见此StackOverflow问题tail
。
唯一的问题是临时文件可能会变得很大。可能的解决方法是运行一个循环,该循环仅在文件包含内容时才打印,然后立即清除文件,但这会导致争用情况。