Windows, как перенаправить параметр файла к stdout? (Windows, эквивалентный из '/dev/stdout')

Консоль Windows:

  • Инструмент A может записать двоичные данные в файл, но не имеет никакой опции для сообщения его использовать stdout.
  • Инструмент B может считать двоичные данные с stdin и обработать информацию в нем.

Как я могу получить вывод от переданного по каналу до B, не используя промежуточный файл?

Другими словами: из чего Windows эквивалентен /dev/stdout?

- jeroen

12
задан 24.10.2013, 13:08

1 ответ

Windows не имеет никакого прямого эквивалента /dev/stdout.


Вот моя попытка записи программы C#, которая создает именованный канал, который может быть дан программе A как имя файла. Требует.NET v4.

(C#, потому что компилятор идет со временем выполнения.NET, и что компьютер не имеет.NET в эти дни?)

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

Например, с помощью Клиентского Профиля.NET v4.0.30319 на 32-разрядном Windows XP:

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

Выполненный:

PipeServer foo in | programtwo

в окне один, и:

programone \\.\pipe\foo

в окне два.

4
ответ дан 07.12.2019, 11:49

Теги

Похожие вопросы