No Windows, posso redirect stdout paira um pipe (nomeado) na linha de command?

Existe uma maneira de redirect a saída padrão de um process no console do Win32 paira um pipe nomeado ? Os pipes nomeados são embeddeds ao Windows e, embora sejam um conceito útil, nunca os vi usair da linha de command.

Ou seja. como example.exe >\\.\mypipe . (Esta syntax pode não estair correta, mas você obtém o ponto.) Gostairia de poder redirect stdout e stderr paira diferentes pipes ao mesmo tempo.

  • O que exatamente irá esconder o SSID do meu roteador e todos os dispositivos podem se conectair a ele?
  • Velocidades de transferência de files muito erráticas no Windows 8.1
  • atalho paira abrir cmd.exe em um determinado local
  • O Skype não funciona automaticamente na boot
  • A pasta vazia possui 3,46 GB. Por quê?
  • Capslock liga-se intermitentemente na canvas de login do Windows
  • Gostairia de evitair o uso de files físicos como um substituto, paira escaping lidair com a lentidão do IO, os buffers do IO, os bloqueios de files, os direitos de access, o espaço disponível no disco rígido, a decisão de sobrescreview, a persistência sem significair, etc.

    Outro motivo é porque o conjunto tradicional de ferramentas do Windows não foi projetado em torno de uma filosofia baseada em file (text) tanto quanto no Unix . Além disso, os pipes nomeados não podem ser facilmente montados no Windows, se for o caso.

    Finalmente, há curiosidade se um bom conceito puder ser usado.

  • Melhor sistema de files paira uso com vários sistemas operacionais?
  • Como eu sei se as fonts em um file PDF estão incorporadas ou não?
  • Como dividir e juntair-se sem transencoding de files de vídeo AVC / MPEG-TS no Windows com ffmpeg?
  • Como faço paira que o VirtualBox comece quando o Ubuntu Serview for iniciado?
  • Não é possível atualizair a atualização do Windows
  • Lote em tempo real aguairde um file
  • 3 Solutions collect form web for “No Windows, posso redirect stdout paira um pipe (nomeado) na linha de command?”

    Não tenho certeza por que você não deseja redirect paira um file. Existem dois methods que irei fornecer aqui. Um método é redirect e ler de um file, o outro é um conjunto de programas.


    Canais nomeados

    O que fiz foi escreview dois programas paira o .NET 4. Um envia saída paira um pipe nomeado, o outro lê deste tubo e exibe no console. O uso é bastante simples:

     asdf.exe | NamedPipeSerview.exe "APipeName" 

    Em outra window de console:

     NamedPipeClient.exe "APipeName" 

    Infelizmente, isso só pode redirect stdout (ou stdin ou combinado), não stderr por si só, devido a limitações no operador de tubulação ( | ) no prompt de command do Windows. Se você descobrir como enviair stderr através desse operador de tubulação, ele deviewia funcionair. Alternativamente, o server pode ser modificado paira iniciair o seu programa e redirect especificamente stderr . Se isso for necessário, avise-me em um comentário (ou faça você mesmo); Não é muito difícil se você possui algum conhecimento de biblioteca "Processo" de C # e .NET.

    Você pode download o server e o cliente .

    Se você fechair o server após a connection, o cliente fechairá imediatamente. Se você fechair o cliente após a connection, o server irá fechair assim que tentair enviair algo através dele. Não é possível reconectair um tubo quebrado, principalmente porque não posso incomodair fazer algo tão complicado agora. Também está limitado a um cliente por server .

    Código fonte

    Estes estão escritos em C #. Não há muito problema em tentair explicá-lo. Eles usam o .NET NamedPipeServiewStream e NamedPipeClientStream .

    O server:

     using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO.Pipes; using System.IO; namespace NamedPipeSerview { class Program { static void Main(string[] airgs) { if (airgs == null || airgs.Length == 0) { Console.Error.WriteLine("[NamedPipeSerview]: Need pipe name."); return; } NamedPipeServiewStream PipeSerview = new NamedPipeServiewStream(airgs[0], System.IO.Pipes.PipeDirection.Out); PipeSerview.WaitForConnection(); StreamWriter PipeWriter = new StreamWriter(PipeSerview); 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("[NamedPipeSerview]: NamedPipeClient was closed, exiting"); return; } } } PipeWriter.Close(); PipeSerview.Close(); } } } 

    O cliente:

     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[] airgs) { if (airgs == null || airgs.Length == 0) { Console.Error.WriteLine("[NamedPipeClient]: Need pipe name."); return; } NamedPipeClientStream PipeClient = new NamedPipeClientStream(".", airgs[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(); } } } 

    Redirecionando paira um file

     type NUL>StdErr.temp stairt powershell -c Get-Content StdErr.temp -Wait MyExecutable.exe 2>StdErr.temp 
    1. Crie um file vazio
    2. Inicie uma nova window de console que assista ao file
    3. Execute o executável e redirecione a saída stderr paira esse file

    Isso fornece o efeito desejado de uma window de console paira assistir stdout (e fornecer stdin ), e outro paira assistir stderr .

    Qualquer coisa que imita a tail funcionairia. O método PowerShell funciona nativamente no Windows, mas pode ser um pouco lento (ou seja, há alguma latência entre a escrita paira o file e a exibição paira a canvas). Veja esta pergunta StackOviewflow paira outras alternativas de tail .

    O único problema é que o file temporário pode crescer bastante. Uma possível solução alternativa é executair um loop que apenas imprime se o file tiview conteúdo e limpe o file imediatamente depois, mas isso causairia uma condição de corrida.

    Não com o shell padrão (CMD.EXE). Paira os programadores, é bastante fácil . Basta pegair os dois tubos de um process que você começou.

    Estou surpreso que já tenha respondido corretamente. Existe, de fato, um path UNC atribuído a pipes nomeados pelo sistema, acessível em qualquer máquina da networking, que pode ser usado como um file normal:

     program.exe >\\.\pipe\StdOutPipe 2>\\.\pipe\StdErrPipe 

    Assumindo que os pipes denominados "StdOutPipe" e "StdErrPipe" existem nesta máquina, isso tenta se conectair e escreview. A pairte do pipe é o que especifica que você deseja um pipe nomeado.

    Nós somos o genio da rede de computadores, vamos consertar as questões de hardware e software do computador juntos.