12

Консоль Windows:

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

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

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

--jeroen

3 ответа3

18

В Windows есть аналог для /dev /stdout, CON:

Я предполагаю, что это все еще работает, учитывая продолжающуюся программу Microsoft "совместимости с устаревшими версиями"

Ах .. нашел это. Служба поддержки Microsoft предоставляет список зарезервированных имен. Вы не можете назвать файл этими именами, и они имеют особое значение, когда используются как входы или выходы.

Вы МОЖЕТЕ иметь возможность использовать CON в качестве устройства вывода для отправки на стандартный вывод.

Список:

   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
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.

Это, вероятно, лучшее, что он получает ...

Ссылка на сайт

4

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


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

(C # потому что компилятор поставляется с .NET runtime, а какой компьютер не имеет .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 Client Profile 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

во втором окне.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .