왜 파일로 리디렉션하고 싶지 않은지 잘 모르겠습니다. 여기서 제공 할 두 가지 방법이 있습니다. 한 가지 방법은 파일로 리디렉션하고 파일에서 읽는 방법이고 다른 방법은 프로그램 세트입니다.
명명 된 파이프
내가 한 것은 .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
.
유일한 문제는 임시 파일이 상당히 커질 수 있다는 것입니다. 가능한 해결 방법은 파일에 내용이있는 경우에만 인쇄하고 즉시 파일을 지우는 루프를 실행하지만 경쟁 조건을 야기 할 수 있습니다.