विंडोज कैसे stdout करने के लिए फ़ाइल पैरामीटर पुनर्निर्देशित करें? (`/ देव / stdout` के बराबर विंडोज)


13

Windows कंसोल:

  • टूल ए एक फाइल में बाइनरी डेटा लिख ​​सकता है, लेकिन इसमें स्टडआउट का उपयोग करने के लिए कहने का कोई विकल्प नहीं है।
  • टूल बी स्टड से बाइनरी डेटा को पढ़ सकता है और इसमें जानकारी को संसाधित कर सकता है।

मैं एक मध्यवर्ती फ़ाइल का उपयोग किए बिना बी के माध्यम से ए पाइप से आउटपुट कैसे प्राप्त कर सकता हूं?

दूसरे शब्दों में: विंडोज किसके समकक्ष है /dev/stdout?

--jeroen

जवाबों:


20

Windows के पास / dev / stdout, CON के लिए एक एनालॉग है:

मुझे लगता है कि यह अभी भी काम करता है, माइक्रोसॉफ्ट के चल रहे "विरासत संगतता" कार्यक्रम को देखते हुए।

आह .. पाया। Microsoft समर्थन आरक्षित नामों की एक सूची देता है। आप इन नामों को फ़ाइल नहीं कर सकते हैं, और इनपुट या आउटपुट के रूप में उपयोग किए जाने पर उनके विशेष अर्थ हैं।

आप कनेक्ट करने के लिए भेजने के लिए एक आउटपुट डिवाइस के रूप में कांग्रेस का उपयोग करने में सक्षम हो।

सूचि:

   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
धन्यवाद, यह वास्तव में काम करता है (जीत 8.1 में भी)। हम बैच मोड में एकता के साथ निर्माण चलाते हैं Unity.exe -batchmode -projectPath C:\***\Application -logFile -buildWebPlayer web -quit:। तर्क (फ़ाइल नाम) के बिना -logFile- यह कंसोल को आउटपुट प्रिंट करना चाहिए, लेकिन यह नहीं करता है। CON (यानी - -logFile CON) जोड़ने के बाद यह :-)
setevoy

@setevoy यह वास्तव में विंडोज पर एकता के साथ आपके लिए काम करता है? क्या आप अधिक विवरण दे सकते हैं? सिर्फ विंडोज 7 और 10 का उपयोग करके मेरे लिए एकता दुर्घटना का कारण बनता है Unity.exe -batchmode -quit -projectPath "%cd%" -logFile CON -buildWindows64Player ".\GameBuild\Generic.exe"। कमांड लॉग फ़ाइल के बिना ठीक काम करता है लेकिन मुझे कोई बिल्ड आउटपुट नहीं मिलता है।
bbodenmiller

@bbodenmiller क्षमा करें, लेकिन कोई और जानकारी प्रदान नहीं कर सकता - यह परियोजना लगभग 2 साल पहले समाप्त हो गई थी :-)
setevoy

1
@bbodenmiller ऐसा लगता है कि स्टेपआउट के लिए लॉगफ़ाइल को आउटपुट करना फिलहाल टूट गया है। देखें: जारीकर्ता .unity3d.com
issues

2
उत्तर गलत है। कांग्रेस डिवाइस प्रदर्शन है। कोन को लिखना न तो पुनर्निर्देशित किया जा सकता है (जैसा कि program > file.txt) और न ही एक पाइप में उपयोग किया जाता है (जैसा कि किसी अन्य प्रोग्राम के स्टैड में डेटा पास करने के लिए program | another_program)। CON को लिखा गया आउटपुट हमेशा प्रदर्शित होता है। सही उत्तर है "विंडोज के पास / dev / stdout के बराबर नहीं है"
Egor Skriptunoff

5

विंडोज के बराबर कोई प्रत्यक्ष नहीं है /dev/stdout


यहाँ एक सी # प्रोग्राम लिखने का मेरा प्रयास है जो एक नामांकित पाइप बनाता है , जिसे प्रोग्राम ए के नाम के रूप में दिया जा सकता है। .NET v4 की आवश्यकता है।

(C # क्योंकि कंपाइलर .NET रनटाइम के साथ आता है, और इन दिनों कंप्यूटर में .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

उदाहरण के लिए, 32-बिट Windows XP पर .NET क्लाइंट प्रोफ़ाइल v4.0.30319 का उपयोग करना:

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

Daud:

PipeServer foo in | programtwo

एक खिड़की में, और:

programone \\.\pipe\foo

खिड़की दो में।


+1 अब यह एक अच्छा उपाय है! मैं जल्द ही कोशिश करूंगा और आपको बताऊंगा। अब पहले कुछ Zzzzzzz :-)
Jeroen Wiert Pluimers

ज़ज़्ज़ करने से पहले एक और विचार: पाइप को बंद करने के बारे में क्या? मैं यह सोचने के लिए जा रहा हूं कि सबसे अच्छा सिग्नलिंग तंत्र क्या है , यह programoneबताने के लिए pipeकि यह \\.\pipe\foo
किसके

@Jeroen: जब programoneडेटा आउटपुट किया जाता है, तो यह केवल उस आउटपुट फ़ाइल को बंद कर देगा जिसका वह उपयोग कर रहा था। (क्लाइंट की ओर से, पाइप सामान्य फ़ाइलों की तरह ही काम करते हैं।) जब यह ऐसा करता है, pipe.exe- अधिक सटीक रूप से, pipe.CopyTo(...)- ईओएफ तक पहुंच जाएगा और बस बाहर निकल जाएगा।
user1686

@Jeroen: इसके अलावा, एक बात यह है कि मुझे पता नहीं चला है: विपरीत ( out) दिशा में उपकरण का उपयोग करते समय ( पाइप को स्टड कॉपी करें), यह पहले 1 kB के बाद "टूटी पाइप" त्रुटि से मर जाता है। ऐसा तब नहीं होता, जब किसी पाइप को stdout ( in) में कॉपी किया जाता है , हालांकि, इसलिए यह आपके प्रोग्राम को प्रभावित नहीं करना चाहिए। (जैसा कि वे कहते हैं, पैच स्वागत करते हैं। )
user1686

धन्यवाद अगले हफ्ते बाद में कोशिश करेंगे, इस परियोजना में एक उच्च prio के साथ आया (आप आईटी परियोजनाओं <g> प्यार नहीं है)
Jeroen Wiert Pluimers

4

ग्रेविटी के उत्तर के आधार पर मैंने एक विस्तारित संस्करण बनाया है, जो कई टर्मिनल विंडो का उपयोग किए बिना एक प्रक्रिया को सीधे शुरू करने की अनुमति देता है।

सामान्य उपयोग:

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

स्ट्रिंग "{पाइप}" को फिर पुनर्निर्देशन पथ द्वारा बदल दिया जाता है।

वास्तविक दुनिया उदाहरण:

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

इस कमांड-लाइन को सीधे अंदर डाला जा सकता है, उदाहरण के लिए, ग्रहण एक निश्चित बाहरी बिल्डर के बिल्ड लॉग को StOOut पर पुनर्निर्देशित करने के लिए।

यह शायद यह सबसे अच्छा हो जाता है ...

संपर्क

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.