Windows bagaimana cara mengarahkan parameter file ke stdout? (Setara Windows dengan `/ dev / stdout`)

12

Konsol Windows:

  • Alat A dapat menulis data biner ke file, tetapi tidak memiliki opsi untuk memerintahkannya menggunakan stdout.
  • Alat B dapat membaca data biner dari stdin dan memproses info di dalamnya.

Bagaimana saya bisa mendapatkan output dari A disalurkan melalui B tanpa menggunakan file perantara?

Dengan kata lain: apa yang setara dengan Windows /dev/stdout?

--Jeroen

Jeroen Wiert Pluimer
sumber

Jawaban:

18

Windows memang memiliki analog untuk / dev / stdout, CON:

Saya membayangkan itu masih bekerja, mengingat program "legacy kompatibilitas" Microsoft yang sedang berlangsung.

Ah .. menemukannya. Dukungan Microsoft memberikan daftar nama yang dipesan. Anda tidak dapat memberi nama file nama-nama ini, dan mereka memiliki arti khusus ketika digunakan sebagai input atau output.

Anda mungkin dapat menggunakan CON sebagai perangkat keluaran untuk mengirim ke stdout.

Daftar:

   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
lornix
sumber
1
Terima kasih, ini benar-benar berfungsi (bahkan di Win 8.1). Kami menjalankan membangun dengan Unity, dalam modus batch: Unity.exe -batchmode -projectPath C:\***\Application -logFile -buildWebPlayer web -quit. Tanpa argumen (nama file) ke -logFile- itu harus mencetak output ke konsol, tetapi tidak. Setelah menambahkan CON (yaitu - -logFile CON) - tidak :-)
setevoy
@setevoy ini benar-benar berfungsi untuk Anda dengan Unity di Windows? Bisakah Anda memberikan lebih banyak detail? Hanya menyebabkan Unity crash untuk saya di Windows 7 dan 10 menggunakan Unity.exe -batchmode -quit -projectPath "%cd%" -logFile CON -buildWindows64Player ".\GameBuild\Generic.exe". Perintah berfungsi dengan baik tanpa file log tapi saya tidak mendapatkan output build.
bbodenmiller
@bbodenmiller Maaf, tetapi tidak dapat memberikan informasi lebih lanjut - proyek ini selesai hampir 2 tahun lalu :-)
setevoy
1
@ bbodenmiller Tampaknya keluaran logfile ke stdout rusak saat ini. Lihat: issuetracker.unity3d.com/issues/…
Verox
2
Jawabannya salah. Perangkat CON ditampilkan. Menulis ke CON tidak dapat diarahkan (seperti di program > file.txt) atau digunakan dalam pipa (untuk meneruskan data ke stdin program lain seperti di program | another_program). Output yang ditulis ke CON selalu ditampilkan. Jawaban yang benar adalah "Windows tidak memiliki yang setara dengan / dev / stdout"
Egor Skriptunoff
5

Windows tidak memiliki padanan langsung dengan /dev/stdout.


Ini adalah usaha saya untuk menulis program C # yang membuat pipa bernama , yang dapat diberikan kepada program A sebagai nama file. Membutuhkan .NET v4.

(C # karena kompiler dilengkapi dengan .NET runtime, dan komputer apa yang tidak memiliki .NET akhir-akhir ini?)

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

Kompilasi dengan:

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

csc dapat ditemukan di %SystemRoot%\Microsoft.NET\Framework64\<version>\csc.exe

Misalnya, menggunakan .NET Client Profile v4.0.30319 pada Windows XP 32-bit:

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

Lari:

PipeServer foo in | programtwo

di jendela satu, dan:

programone \\.\pipe\foo

di jendela dua.

pengguna1686
sumber
+1 Sekarang itu solusi keren! Saya akan segera mencobanya dan memberi tahu Anda. Sekarang, pertama beberapa Zzzzzzz :-)
Jeroen Wiert Pluimers
Satu lagi pemikiran sebelum melakukan Zzzz: bagaimana dengan menutup pipa? Saya akan berpikir tentang mekanisme pensinyalan terbaik untuk programonemengatakan pipe, bahwa hal itu dilakukan dengan\\.\pipe\foo
Jeroen Wiert Pluimers
@ Joen: Ketika programoneselesai menghasilkan data, itu hanya akan menutup file output yang digunakannya. (Dari sisi klien, pipa bekerja dengan cara yang sama seperti file biasa.) Ketika melakukannya, pipe.exe- lebih tepatnya, pipe.CopyTo(...)- akan mencapai EOF dan cukup keluar.
user1686
@ Joen: Juga, ada satu hal yang belum saya ketahui: ketika menggunakan alat di arah yang berlawanan ( out) (salin stdin ke pipa), ia mati dengan kesalahan "Pipa rusak" setelah 1 kB pertama. Namun, tidak terjadi saat menyalin pipa ke stdout ( in), jadi itu tidak akan memengaruhi program Anda. (Seperti yang mereka katakan, tambalan selamat datang. )
user1686
terima kasih akan mencoba minggu depan nanti, sesuatu dalam proyek ini datang dengan prio yang lebih tinggi (jangan Anda suka proyek TI <g>)
Jeroen Wiert Pluimers
4

Berdasarkan grawity jawaban , saya telah membuat versi tambahan yang memungkinkan proses dimulai secara langsung tanpa harus menggunakan banyak terminal windows.

Penggunaan umum:

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

String "{pipe}" kemudian diganti oleh jalur redirection.

Contoh Dunia Nyata:

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

Baris perintah ini dapat dimasukkan secara langsung ke dalam, misalnya, Eclipse untuk mengarahkan kembali log build dari builder eksternal tertentu ke StdOut.

Ini mungkin yang terbaik yang didapatnya ...

Tautan

ntninja
sumber