Windows dosya parametresini stdout'a nasıl yönlendirebilirim? (Windows / dev / stdout` eşdeğeri)


13

Windows konsolu:

  • A aracı bir dosyaya ikili veri yazabilir, ancak stdout kullanmasını söyleme seçeneği yoktur.
  • B aracı stdin'den ikili verileri okuyabilir ve içindeki bilgileri işleyebilir.

Bir ara dosya kullanmadan A'dan B'ye giden çıkışı nasıl alabilirim?

Başka bir deyişle: Windows eşdeğeri /dev/stdoutnedir?

--jeroen

Yanıtlar:


20

Windows / dev / stdout, CON için bir analoga sahiptir:

Microsoft'un devam eden "eski uyumluluk" programını göz önünde bulundurarak hala çalıştığını düşünüyorum.

Ah .. buldum. Microsoft Destek , ayrılmış adların bir listesini verir. Bu adları bir dosyaya adlandıramazsınız ve giriş veya çıkış olarak kullanıldıklarında özel anlamları vardır.

CON'yi stdout'a göndermek için bir çıkış cihazı olarak kullanabilirsiniz.

Liste:

   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
Teşekkürler, gerçekten işe yarıyor (Win 8.1'de bile). Biz toplu modunda, Unity ile yapı çalıştırın: Unity.exe -batchmode -projectPath C:\***\Application -logFile -buildWebPlayer web -quit. Argümanı (dosya adı) olmadan -logFile- çıktıyı konsola yazdırmalıdır, ancak yazdırmaz. CON (ie - -logFile CON) ekledikten sonra - öyle :-)
setevoy

@setevoy bu aslında Windows üzerinde Unity ile çalışır? Daha fazla ayrıntı verebilir misiniz? Sadece Windows 7 ve 10 kullanarak Unity çökmesine neden oluyor Unity.exe -batchmode -quit -projectPath "%cd%" -logFile CON -buildWindows64Player ".\GameBuild\Generic.exe". Komut, günlük dosyası olmadan iyi çalışıyor ancak derleme çıktısı almıyorum.
bbodenmiller

@bbodenmiller Üzgünüz, ancak daha fazla bilgi veremiyoruz - bu proje neredeyse 2 yıl önce tamamlandı :-)
setevoy

1
@bbodenmiller Günlük dosyasının stdout'a çıktısı şu anda bozuk görünüyor. Bakınız: issuetracker.unity3d.com/issues/…
Verox

2
Cevap yanlış. CON cihazı görüntülenir. CON'a yazmak ne bir yönlendirmede (ne olduğu gibi program > file.txt) ne de bir kanalda (başka bir programın verisine olduğu gibi aktarmak için program | another_program) kullanılamaz. CON'a yazılan çıktı her zaman görüntülenir. Doğru cevap "Windows / dev / stdout eşdeğeri"
Egor Skriptunoff

5

Windows'un doğrudan bir eşdeğeri yoktur /dev/stdout.


İşte A programına bir dosya adı olarak verilebilen adlandırılmış bir kanal oluşturan bir C # programı yazma girişimim . .NET v4 gerektirir.

(Derleyici .NET çalışma zamanı ile geldiğinden ve bu bilgisayarda hangi bilgisayarın .NET'i olmadığı için 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);
        }
    }
}

Şununla derleyin:

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

csc Içinde bulunabilir %SystemRoot%\Microsoft.NET\Framework64\<version>\csc.exe

Örneğin, 32 bit Windows XP'de .NET İstemci Profili v4.0.30319'u kullanma:

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

Çalıştırmak:

PipeServer foo in | programtwo

birinci pencerede ve:

programone \\.\pipe\foo

İkinci pencerede.


+1 Şimdi bu harika bir çözüm! Bunu yakında deneyeceğim ve size bildireceğim. Şimdi önce bazı Zzzzzzz :-)
Jeroen Wiert Pluimers

Zzzz yapmadan önce bir düşünce daha: Peki boruyu kapatmak ne olacak? En iyi sinyal mekanizmasının ne programoneolduğunu pipe, bunun ile yapıldığını \\.\pipe\foo
düşüneceğim

@Jeroen: programoneVerilerin çıktısı alındığında, sadece kullandığı çıktı dosyasını kapatır. (İstemci tarafından, borular sıradan dosyalarla aynı şekilde çalışır.) Bunu yaptığında, pipe.exe- daha doğrusu pipe.CopyTo(...)- EOF'a ulaşır ve sadece çıkar.
user1686

@Jeroen: Ayrıca, çözemediğim bir şey var: aracı ters ( out) yönde kullanırken (stdin'i boruya kopyalayın), ilk 1 kB'den sonra "Kırık boru" hatasıyla ölür. inAncak bir boruyu stdout ( ) öğesine kopyalarken gerçekleşmez , bu nedenle programınızı etkilememelidir. (Dedikleri gibi, yamalar hoş geldiniz. )
user1686

teşekkür gelecek hafta bunu deneyecek, projede bir şey daha yüksek bir prio geldi (BT projeleri sevmiyorum <g>)
Jeroen Wiert Pluimers

4

Grawity'nin cevabına dayanarak, bir işlemin birden fazla terminal penceresi kullanmadan doğrudan başlatılmasını sağlayan genişletilmiş bir versiyon oluşturdum.

Genel kullanım:

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

"{Pipe}" dizesi daha sonra yeniden yönlendirme yolu ile değiştirilir.

Gerçek Dünya örneği:

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

Bu komut satırı, örneğin belirli bir harici oluşturucunun derleme günlüğünü StdOut'a yönlendirmek için Eclipse'e doğrudan eklenebilir.

Bu muhtemelen en iyisi ...

bağlantı

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.