Windows como redirecionar o parâmetro de arquivo para stdout? (Equivalente no Windows a '/ dev / stdout')

12

console do Windows:

  • A Ferramenta A pode gravar dados binários em um arquivo, mas não tem opção para dizer que use stdout.
  • A ferramenta B pode ler dados binários do stdin e processar as informações contidas nela.

Como posso obter a saída de A através de B sem usar um arquivo intermediário?

Em outras palavras: qual é o equivalente do Windows de /dev/stdout ?

- jeroen

    
por Jeroen Wiert Pluimers 03.02.2011 / 17:01

3 respostas

17

O Windows tem um análogo para / dev / stdout, CON:

Eu imagino que ainda funciona, considerando o programa de "compatibilidade legada" da Microsoft.

Ah .. encontrei. Suporte da Microsoft fornece uma lista de nomes reservados. Você não pode nomear um arquivo com esses nomes e eles têm significados especiais quando usados como entradas ou saídas.

Você PODERIA usar o CON como um dispositivo de saída para enviar para o stdout.

A lista:

   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
    
por 22.07.2013 / 15:34
4

Com base na resposta do grawity , criei uma versão estendida que permite que um processo seja iniciado diretamente, sem ter para usar várias janelas de terminal.

Uso geral:

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

A string "{pipe}" é então substituída pelo caminho de redirecionamento.

Exemplo do mundo real:

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

Essa linha de comandos pode ser inserida diretamente, por exemplo, no Eclipse para redirecionar o log de construção de um determinado construtor externo para o StdOut.

Este é provavelmente o melhor que se consegue ...

Link

    
por 22.07.2013 / 14:58
4

O Windows não tem equivalente direto a /dev/stdout .

Esta é minha tentativa de escrever um programa em C # que cria um canal nomeado , que pode ser dado ao programa A como um nome de arquivo. Requer o .NET v4.

(C # porque o compilador vem com o runtime .NET, e qual computador não tem o .NET atualmente?)

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);
        }
    }
}

Compile com:

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

csc pode ser encontrado em %SystemRoot%\Microsoft.NET\Framework64\<version>\csc.exe

Por exemplo, usando o .NET Client Profile v4.0.30319 em um Windows XP de 32 bits:

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

Executar:

PipeServer foo in | programtwo

na janela um e:

programone \.\pipe\foo

na janela dois.

    
por 03.02.2011 / 17:25