উইন্ডোজ কীভাবে স্টাডাউটে ফাইলের প্যারামিটার পুনঃনির্দেশ করবেন? (উইন্ডোজ equivalent / dev / stdout Windows এর সমতুল্য)


13

উইন্ডোজ কনসোল:

  • টুল এ কোনও ফাইলটিতে বাইনারি ডেটা লিখতে পারে তবে স্টডআউট ব্যবহার করতে বলার কোনও বিকল্প নেই।
  • সরঞ্জাম বি স্ট্ডিনের থেকে বাইনারি ডেটা পড়তে এবং এতে থাকা তথ্যের প্রক্রিয়া করতে পারে।

কোন মধ্যবর্তী ফাইল ব্যবহার না করে আমি কীভাবে পাইপযুক্ত এ থেকে আউটপুট পেতে পারি?

অন্য কথায়: উইন্ডোজ এর সমতুল্য কি /dev/stdout?

--jeroen

উত্তর:


20

উইন্ডোজের / dev / 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
ধন্যবাদ, এটি সত্যিই কার্যকর হয় (এমনকি উইন 8.1 তেও)। আমরা ঐক্য সঙ্গে বিল্ড চালানোর জন্য, ব্যাচ মোডে: Unity.exe -batchmode -projectPath C:\***\Application -logFile -buildWebPlayer web -quit। আর্গুমেন্ট (ফাইলের নাম) ছাড়াই -logFile- এটি কনসোলে আউটপুট মুদ্রণ করতে হবে, তবে তা হয় না। কন যোগ করার পরে (অর্থাত্ -logFile CON) - এটি করে :-)
setevoy

@ Setevoy এটি উইন্ডোজে ityক্য নিয়ে আসলে আপনার জন্য কাজ করে? আরো বিস্তারিত দিতে পারেন? উইন্ডোজ 7 এবং 10 ব্যবহার করে কেবল আমার জন্য ityক্যের ক্রাশ ঘটায় Unity.exe -batchmode -quit -projectPath "%cd%" -logFile CON -buildWindows64Player ".\GameBuild\Generic.exe"। লগ ফাইল ছাড়াই কমান্ড সূক্ষ্মভাবে কাজ করে তবে আমি কোনও বিল্ড আউটপুট পাই না।
bbodenmiller

@bbodenmiller দুঃখিত, তবে আর কোনও তথ্য সরবরাহ করতে পারে না - এই প্রকল্পটি প্রায় 2 বছর আগে সমাপ্ত হয়েছিল :-)
setevoy

1
@bbodenmiller মনে হচ্ছে লগফাইলে স্টডআউটে আউটপুট দেওয়া এই মুহুর্তে ভেঙে গেছে। দেখুন: ইস্যুটিয়রেকার.উইনুনিটি 3 ডি
ম্যাসিউজ_

2
উত্তরটি ভুল। কন ডিভাইস প্রদর্শন করা হয়। CON- এ লিখিতভাবে পুনঃনির্দেশিত (যেমন হিসাবে program > file.txt) বা পাইপ ব্যবহার করা যাবে না (অন্য প্রোগ্রামের স্টিডিনের হিসাবে ডেটা প্রেরণে program | another_program)। CON এ লেখা আউটপুট সর্বদা প্রদর্শিত হয়। সঠিক উত্তরটি "উইন্ডোজের / dev / stdout এর সমতুল্য নেই"
Egor Skriptunoff

5

উইন্ডোজ এর সরাসরি কোন সমতুল্য নেই /dev/stdout


এখানে একটি সি # প্রোগ্রাম লেখার আমার প্রচেষ্টা যা একটি নামযুক্ত পাইপ তৈরি করে , যা প্রোগ্রাম নামক একটি ফাইলের নাম হিসাবে দেওয়া যেতে পারে। নেট। ভি 4 দরকার।

(সি # কারণ সংকলক। নেট রানটাইম নিয়ে আসে এবং কম্পিউটারে আজকাল নেট নেই?)

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-বিট উইন্ডোজ এক্সপিতে .NET ক্লায়েন্ট প্রোফাইল v4.0.30319 ব্যবহার করে:

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

চালান:

PipeServer foo in | programtwo

এক উইন্ডোতে এবং:

programone \\.\pipe\foo

উইন্ডো দুই।


+1 এখন এটি একটি দুর্দান্ত সমাধান! আমি তাড়াতাড়ি চেষ্টা করব এবং আপনাকে জানাব। এখন প্রথমে কিছু জ্যাজ্জেজ্জেস :-)
জেরোয়েন ওয়েয়ার্ট প্লুমাইমার

জেডজ্জ করার আগে আরও একবার ভেবেছিলেন: পাইপ বন্ধ করার কী হবে? আমি সবচেয়ে ভাল সিগন্যালিং মেকানিজমটি কী programoneতা বলার জন্য তা নিয়ে ভাবতে যাচ্ছি pipe, এটি দিয়ে এটি করা হয়েছে\\.\pipe\foo
জেরোয়েন ওয়েয়ার্ট প্লুইমার্স

@ জিরোইন: যখন programoneআউটপুট তথ্য ডেটা করা হয়, এটি কেবল এটির আউটপুট ফাইলটি বন্ধ করে দেবে। (ক্লায়েন্টের দিক থেকে, পাইপগুলি সাধারণ ফাইলগুলির মতো একইভাবে কাজ করে)) এটি যখন ঘটে, pipe.exe- আরও স্পষ্টভাবে pipe.CopyTo(...)- - ইওএফ পৌঁছাবে এবং কেবল প্রস্থান করবে।
user1686

@ জিরোইন: এছাড়াও, আমি একটি জিনিসও বুঝতে পারি নি: বিপরীত ( out) দিকের (পাইপ থেকে স্টিডিন অনুলিপি) ব্যবহার করার সময় , এটি প্রথম 1 কেবি পরে "ব্রোকন পাইপ" ত্রুটির সাথে মারা যায়। Stdout ( in) তে পাইপ অনুলিপি করার সময় ঘটে না , তবে এটি আপনার প্রোগ্রামকে প্রভাবিত করবে না। (তারা বলে, প্যাচ স্বাগত জানাই। )
user1686

ধন্যবাদ পরের সপ্তাহে এই চেষ্টা করে দেখুন, প্রকল্পের কিছু উচ্চতর প্রিও নিয়ে এসেছিল (আপনি আইটি প্রকল্পগুলিকে পছন্দ করেন না <g>)
জেরোয়েন ওয়েয়ার্ট প্লুইমারস

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}"

এই কমান্ড-লাইনটি সরাসরি intoোকানো যেতে পারে, উদাহরণস্বরূপ, কোনও নির্দিষ্ট বাহ্যিক নির্মাতার বিল্ড লগটি স্টডআউটে পুনর্নির্দেশের জন্য Eclipse।

এটি সম্ভবত এটিই সেরা ...

লিংক

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.