Windows จะเปลี่ยนเส้นทางพารามิเตอร์ไฟล์ไปยัง stdout ได้อย่างไร (Windows เทียบเท่า `/ dev / stdout`)


13

คอนโซล Windows:

  • เครื่องมือ A สามารถเขียนข้อมูลไบนารีไปยังไฟล์ แต่ไม่มีตัวเลือกสำหรับบอกให้ใช้ stdout
  • เครื่องมือ B สามารถอ่านข้อมูลไบนารีจาก stdin และประมวลผลข้อมูลในนั้น

ฉันจะรับเอาต์พุตจาก A ไพพ์ถึง B โดยไม่ต้องใช้ไฟล์ระดับกลางได้อย่างไร

ในคำอื่น ๆ : เทียบเท่า Windows /dev/stdoutคืออะไร?

--jeroen

คำตอบ:


20

Windows มีอะนาล็อกสำหรับ / dev / stdout, CON:

ฉันคิดว่ามันยังใช้งานได้โดยพิจารณาจากโปรแกรม "ความเข้ากันได้แบบดั้งเดิม" ของ Microsoft อย่างต่อเนื่อง

อ่า .. พบแล้ว ฝ่ายสนับสนุนของ Microsoftให้รายชื่อที่สงวนไว้ คุณไม่สามารถตั้งชื่อไฟล์ชื่อเหล่านี้และพวกเขามีความหมายพิเศษเมื่อใช้เป็นอินพุตหรือเอาต์พุต

คุณอาจสามารถใช้ CON เป็นอุปกรณ์ส่งออกเพื่อส่งไปยัง stdout ได้

รายการ:

   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
ขอบคุณมันใช้งานได้จริง (แม้ใน Win 8.1) Unity.exe -batchmode -projectPath C:\***\Application -logFile -buildWebPlayer web -quitเราทำงานด้วยการสร้างความสามัคคีในโหมดแบทช์: หากไม่มีอาร์กิวเมนต์ (ชื่อไฟล์) ไปที่-logFile- จะต้องพิมพ์เอาต์พุตไปยังคอนโซล แต่ไม่ต้อง หลังจากเพิ่ม CON (เช่น - -logFile CON) - ใช้ :-)
setevoy

@setevoy มันใช้งานได้จริงสำหรับคุณกับ Unity บน Windows? คุณให้รายละเอียดเพิ่มเติมได้ไหม เพียงแค่ทำให้เกิดความผิดพลาดความสามัคคีสำหรับฉันใน Windows 7 และ 10 Unity.exe -batchmode -quit -projectPath "%cd%" -logFile CON -buildWindows64Player ".\GameBuild\Generic.exe"โดยใช้ คำสั่งทำงานได้ดีโดยไม่ต้องใช้ไฟล์บันทึก แต่ฉันไม่ได้รับเอาต์พุตบิลด์
bbodenmiller

@bbodenmiller ขออภัย แต่ไม่สามารถให้ข้อมูลเพิ่มเติมได้ - โครงการนี้เสร็จเกือบ 2 ปีที่แล้ว :-)
setevoy

1
@bodenmiller ดูเหมือนว่าการส่งออก logfile ไปยัง stdout นั้นไม่สามารถใช้ได้ในขณะนี้ ดู: issuetracker.unity3d.com/issues/…
Verox

2
คำตอบนั้นผิด อุปกรณ์ CON แสดงขึ้น การเขียนไปที่ CON ไม่สามารถเปลี่ยนเส้นทาง (เหมือนในprogram > file.txt) หรือใช้ในไพพ์ (เพื่อส่งผ่านข้อมูลไปยัง stdin ของโปรแกรมอื่นเหมือนในprogram | another_program) เอาต์พุตที่เขียนไปยัง CON จะแสดงขึ้นเสมอ คำตอบที่ถูกต้องคือ "Windows ไม่มีเทียบเท่า / dev / stdout"
Egor Skriptunoff

5

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 บน Windows XP แบบ 32 บิต:

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

วิ่ง:

PipeServer foo in | programtwo

ในหน้าต่างเดียวและ:

programone \\.\pipe\foo

ในหน้าต่างสอง


+1 นั่นเป็นทางออกที่ยอดเยี่ยม! ฉันจะลองเร็ว ๆ นี้และแจ้งให้คุณทราบ ตอนนี้ก่อน Zzzzzzz บาง :-)
Jeroen Wiert Pluimers

อีกหนึ่งความคิดก่อนที่จะทำ Zzzz: แล้วจะปิดท่อได้อย่างไร ฉันจะคิดเกี่ยวกับกลไกการส่งสัญญาณที่ดีที่สุดที่programoneจะบอกpipeว่ามันทำกับ\\.\pipe\foo
Jeroen Wiert Pluimers

@Jeroen: เมื่อprogramoneเสร็จสิ้นการส่งออกข้อมูลมันก็จะปิดไฟล์ที่มันกำลังใช้ (จากฝั่งไคลเอ็นต์ท่อจะทำงานในลักษณะเดียวกับไฟล์ทั่วไป)เมื่อทำเช่นนั้นpipe.exe- แม่นยำยิ่งขึ้นpipe.CopyTo(...)- จะถึง EOF และออกจาก
user1686

@Jeroen: นอกจากนี้ยังมีสิ่งหนึ่งที่ฉันไม่ได้คิดออก: เมื่อใช้เครื่องมือในทิศทางตรงกันข้าม ( out) (คัดลอก stdin ไปยังไปป์) มันจะตายด้วยข้อผิดพลาด "Broken pipe" หลังจาก 1 kB แรก ไม่เกิดขึ้นเมื่อทำการคัดลอกไพพ์ไปยัง stdout ( in) ดังนั้นจึงไม่ควรส่งผลกระทบต่อโปรแกรมของคุณ (ตามที่พวกเขากล่าวว่ายินดีต้อนรับแพทช์. )
user1686

ขอขอบคุณที่จะลองในภายหลังในสัปดาห์หน้ามีบางสิ่งในโครงการที่มาพร้อมกับ Prio ที่สูงขึ้น (คุณไม่ชอบโครงการ IT <g>)
Jeroen Wiert Pluimers

4

ตามคำตอบของgrawityฉันได้สร้างเวอร์ชันเพิ่มเติมซึ่งช่วยให้กระบวนการเริ่มต้นโดยตรงโดยไม่ต้องใช้ windows terminal หลาย ๆ ตัว

การใช้งานทั่วไป:

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

นี่อาจเป็นสิ่งที่ดีที่สุดที่จะได้รับ ...

ลิงค์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.