Windows 파일 매개 변수를 stdout으로 리디렉션하는 방법은 무엇입니까? (`/ dev / stdout`에 해당하는 Windows)


13

Windows 콘솔 :

  • 도구 A는 이진 데이터를 파일에 쓸 수 있지만 stdout을 사용하도록 지시하는 옵션은 없습니다.
  • 도구 B는 stdin에서 이진 데이터를 읽고 정보를 처리 할 수 ​​있습니다.

중간 파일을 사용하지 않고 B를 통해 A 파이프 출력을 얻는 방법은 무엇입니까?

다시 말해, Windows는 무엇과 동일 /dev/stdout합니까?

-제로 엔

답변:


20

Windows에는 / dev / stdout, CON에 대한 아날로그가 있습니다.

Microsoft의 "레거시 호환성"프로그램을 고려할 때 여전히 작동한다고 생각합니다.

아 .. 찾았어요 Microsoft 지원 에서는 예약 이름 목록을 제공합니다. 파일 이름을 이러한 이름으로 지정할 수 없으며 입력 또는 출력으로 사용될 때 특별한 의미를 갖습니다.

CON을 출력 장치로 사용하여 stdout에 보낼 수 있습니다.

목록 :

   Name    Function
   ----    --------
   CON     Keyboard and display
   PRN     System list device, usually a parallel port
   AUX     Auxiliary device, usually a serial port
   CLOCK$  System real-time clock
   NUL     Bit-bucket device
   A:-Z:   Drive letters
   COM1    First serial communications port
   LPT1    First parallel printer port
   LPT2    Second parallel printer port
   LPT3    Third parallel printer port
   COM2    Second serial communications port
   COM3    Third serial communications port
   COM4    Fourth serial communications port

2
고마워, 그것은 실제로 작동합니다 (Win 8.1에서도). 배치 모드에서 Unity를 사용하여 빌드를 실행합니다 Unity.exe -batchmode -projectPath C:\***\Application -logFile -buildWebPlayer web -quit. 인수 (파일 이름)가 없으면 -logFile콘솔에 출력을 인쇄해야하지만 그렇지 않습니다. CON (예 -logFile CON:-)을 추가 한 후 : –-
setevoy

@ setevoy 이것은 Windows의 Unity에서 실제로 작동합니까? 더 자세한 정보를 줄 수 있습니까? 를 사용하여 Windows 7 및 10에서 Unity 충돌이 발생합니다 Unity.exe -batchmode -quit -projectPath "%cd%" -logFile CON -buildWindows64Player ".\GameBuild\Generic.exe". 로그 파일없이 명령이 제대로 작동하지만 빌드 출력이 없습니다.
bbodenmiller

@bbodenmiller 죄송하지만 더 이상 정보를 제공 할 수 없습니다-이 프로젝트는 거의 2 년 전에 완료되었습니다 :-)
setevoy

1
@bbodenmiller 로그 파일을 stdout으로 출력하는 것이 현재 중단 된 것 같습니다. 참조 : issuetracker.unity3d.com/issues/…
Verox

2
답이 틀렸다. CON 장치가 표시됩니다. CON에 쓰는 것은 (에서와 같이 program > file.txt) 리디렉션 되거나 파이프에서 (와 같이 다른 프로그램의 stdin에 데이터를 전달하기 위해) 사용될 수 없습니다 program | another_program. CON에 기록 된 출력은 항상 표시됩니다. 정답은 "Windows에는 / dev / stdout에 해당하지 않습니다"
Egor Skriptunoff

5

Windows는와 직접적으로 동일하지 않습니다 /dev/stdout.


다음은 명명 된 파이프 를 만드는 C # 프로그램을 작성하려는 시도 이며, 프로그램 A에 파일 이름으로 제공 할 수 있습니다. .NET v4가 필요합니다.

(컴파일러는 .NET 런타임과 함께 제공되며 요즘 어떤 컴퓨터에 .NET이 없기 때문에 C #입니까?)

PipeServer.cs

using System;
using System.IO;
using System.IO.Pipes;

class PipeServer {
    static int Main(string[] args) {
        string usage = "Usage: PipeServer <name> <in | out>";
        if (args.Length != 2) {
            Console.WriteLine(usage);
            return 1;
        }

        string name = args[0];
        if (String.Compare(args[1], "in") == 0) {
            Pipe(name, PipeDirection.In);
        }
        else if (String.Compare(args[1], "out") == 0) {
            Pipe(name, PipeDirection.Out);
        }
        else {
            Console.WriteLine(usage);
            return 1;
        }
        return 0;
    }

    static void Pipe(string name, PipeDirection dir) {
        NamedPipeServerStream pipe = new NamedPipeServerStream(name, dir, 1);
        pipe.WaitForConnection();
        try {
            switch (dir) {
                case PipeDirection.In:
                    pipe.CopyTo(Console.OpenStandardOutput());
                    break;
                case PipeDirection.Out:
                    Console.OpenStandardInput().CopyTo(pipe);
                    break;
                default:
                    Console.WriteLine("unsupported direction {0}", dir);
                    return;
            }
        } catch (IOException e) {
            Console.WriteLine("error: {0}", e.Message);
        }
    }
}

다음과 같이 컴파일하십시오.

csc PipeServer.cs /r:System.Core.dll

csc 에서 찾을 수 있습니다 %SystemRoot%\Microsoft.NET\Framework64\<version>\csc.exe

예를 들어, 32 비트 Windows XP에서 .NET Client Profile v4.0.30319 사용 :

"C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\csc.exe" PipeServer.cs /r:System.Core.dll

운영:

PipeServer foo in | programtwo

창 1에서 :

programone \\.\pipe\foo

창 2에서.


+1 이제 멋진 솔루션입니다! 나는 그것을 곧 시도하고 알려줄 것입니다. 이제 처음으로 일부 Zzzzzzz :-)
제론 Wiert Pluimers

Zzzz를 수행하기 전에 한 가지 더 생각하십시오. 파이프를 닫는 것은 어떻습니까? 나는 최고의 신호 메커니즘가 무엇인지에 대해 생각하는거야 programone이야기하는 pipe이 함께 이루어집니다,\\.\pipe\foo
제론 Wiert Pluimers

@Jeroen : programone데이터 출력이 끝나면 사용하던 출력 파일을 닫습니다. (클라이언트 측에서 파이프는 일반 파일과 같은 방식으로 작동합니다.) 그렇게하면 pipe.exe보다 정확하게 pipe.CopyTo(...)EOF에 도달하여 종료됩니다.
user1686

@Jeroen : 또한 알아 채지 못한 것이 있습니다. 공구를 반대 out방향 () 방향 (stdin to pipe)으로 사용하면 처음 1 kB 이후 "Broken pipe"오류로 죽습니다. in그러나 파이프를 stdout ( )으로 복사 할 때는 발생 하지 않으므로 프로그램에 영향을 미치지 않아야합니다. (그들은 패치를 환영합니다. )
user1686

다음 주 후반에이를 시도해 보겠습니다. 프로젝트의 무언가가 더 높은
프라 이오 (

4

grawity 의 답변을 바탕으로 여러 터미널 창을 사용하지 않고도 프로세스를 직접 시작할 수있는 확장 버전을 만들었습니다.

일반적인 사용법 :

PipeServer [in|out] [process name] [argument 1] [argument 2] [...]

그런 다음 문자열 "{pipe}"가 경로 재 지정 경로로 바뀝니다.

실제 예 :

PipeServer.exe in "C:\Keil\UV4\Uv4.exe" -b "C:\Project\Project.uvproj" -j0 -o "{pipe}"

이 명령 행은 예를 들어 Eclipse에 직접 삽입하여 특정 외부 빌더의 빌드 로그를 StdOut으로 경로 재 지정할 수 있습니다.

이것은 아마도 가장 좋은 것입니다 ...

링크

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.