উইন্ডোজগুলিতে, আমি কমান্ড লাইনে স্টাডাউটকে একটি (নামযুক্ত) পাইপে পুনর্নির্দেশ করতে পারি?


17

উইন 32 কনসোলে কোনও প্রক্রিয়াটির স্ট্যান্ডার্ড আউটপুটটিকে কোনও নামযুক্ত পাইপে পুনঃনির্দেশ করার কোনও উপায় আছে কি ? নামযুক্ত পাইপগুলি উইন্ডোজে নির্মিত হয় এবং এটি একটি কার্যকর ধারণা হতে পারে, আমি কমান্ড লাইন থেকে এগুলিকে কখনও ব্যবহার করতে দেখিনি।

অর্থাৎ। মত example.exe >\\.\mypipe। (এই বাক্য গঠনটি সঠিক নাও হতে পারে তবে আপনি পয়েন্টটি পান।) আমি একই সাথে স্টাডআউট এবং স্টডারকে বিভিন্ন পাইপগুলিতে পুনর্নির্দেশ করতে সক্ষম হতে চাই ।

আমি বিকল্প হিসাবে শারীরিক ফাইলগুলি এড়িয়ে চলতে চাই, আইও আলস্যতা, আইও বাফারস, ফাইল লক, অ্যাক্সেস রাইটস, উপলব্ধ হার্ডডিস্কের স্থান, ওভাররাইটের সিদ্ধান্ত, অনড় জেদ ইত্যাদির সাথে মোকাবিলা করতে পারি না etc.

আর একটি কারণ হ'ল ট্র্যাডিশনাল উইন্ডোজ সেটগুলির সরঞ্জামগুলি ইউনিক্সের মতো কোনও (পাঠ্য) ফাইল ভিত্তিক দর্শনের আশেপাশে নকশাকৃত নয় । এছাড়াও, নামী পাইপগুলি উইন্ডোজে সহজেই মাউন্ট করা যায়নি, যদি তা হয় তবে।

পরিশেষে, কৌতূহল আছে যদি একটি ভাল ধারণাটি ভাল ব্যবহারে রাখা যায়।


1
আপনার অর্থ কোনও নামযুক্ত পাইপ বা মেলস্লটতে পুনঃনির্দেশের মতো? আপনি কি / গ্রহণের শেষ লিখতে ইচ্ছুক?
ixe013

হ্যাঁ, নামী পাইপ বা মেলস্লট পছন্দ করুন। আমি এখনও প্রাপ্তির শেষ লিখতে ইচ্ছুক কিন্তু না।
n611x007

উত্তর:


8

আপনি কেন কোনও ফাইলে পুনর্নির্দেশ করতে চান না তা আমি নিশ্চিত নই। আমি এখানে দুটি পদ্ধতি সরবরাহ করব। একটি পদ্ধতি হ'ল পুনর্নির্দেশ করা এবং কোনও ফাইল থেকে পড়া, অন্যটি প্রোগ্রামগুলির একটি সেট।


নামকরণ পাইপ

আমি যা করেছি তা। নেট 4 এর জন্য দুটি প্রোগ্রাম লিখি One একটি নামযুক্ত পাইপে আউটপুট প্রেরণ করে, অন্যটি এই পাইপ থেকে পড়ে কনসোলে প্রদর্শন করে। ব্যবহার বেশ সহজ:

asdf.exe | NamedPipeServer.exe "APipeName"

অন্য কনসোল উইন্ডোতে:

NamedPipeClient.exe "APipeName"

দুর্ভাগ্যক্রমে, উইন্ডোজ কমান্ড প্রম্পটে পাইপ অপারেটর ( ) এর সীমাবদ্ধতার কারণে এটি কেবল নিজের দ্বারা নয় stdout(বা stdinসংযুক্ত) পুনঃনির্দেশ করতে পারে । যদি আপনি কীভাবে পাইপ অপারেটরটির মাধ্যমে প্রেরণ করতে পারেন তবে এটি কাজ করা উচিত। বিকল্পভাবে, আপনার প্রোগ্রামটি চালু করতে এবং বিশেষত পুনর্নির্দেশের জন্য সার্ভারটি পরিবর্তন করা যেতে পারে । যদি এটি প্রয়োজনীয় হয় তবে আমাকে একটি মন্তব্যে জানান (বা এটি নিজে করুন); আপনার কাছে কিছু সি # এবং .NET "প্রক্রিয়া" লাইব্রেরি জ্ঞান থাকলে এটি খুব বেশি কঠিন নয়।stderr|stderrstderr

আপনি সার্ভার এবং ক্লায়েন্ট ডাউনলোড করতে পারেন ।

সংযোগের পরে আপনি যদি সার্ভারটি বন্ধ করেন তবে ক্লায়েন্টটি অবিলম্বে বন্ধ হয়ে যাবে। আপনি যদি সংযোগের পরে ক্লায়েন্টটি বন্ধ করেন, আপনি এর মাধ্যমে কিছু প্রেরণের চেষ্টা করার সাথে সাথে সার্ভারটি বন্ধ হয়ে যাবে। কোনও ভাঙা পাইপ পুনরায় সংযোগ করা সম্ভব নয়, বেশিরভাগ কারণেই এখনই আমাকে এত জটিল কিছু করতে বিরক্ত করা যায় না। এটি প্রতি সার্ভারে একটি ক্লায়েন্টের মধ্যেও সীমাবদ্ধ ।

সোর্স কোড

এগুলি সি # তে লেখা আছে। এটি ব্যাখ্যা করার চেষ্টা করার মতো খুব একটা বিষয় নেই। তারা .NET নামযুক্ত পাইপ সার্ভারস্ট্রিম এবং নামযুক্ত পাইপক্লিয়েন্টস্ট্রিম ব্যবহার করে ।

সার্ভার:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Pipes;
using System.IO;

namespace NamedPipeServer
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args == null || args.Length == 0)
            {
                Console.Error.WriteLine("[NamedPipeServer]: Need pipe name.");
                return;
            }

            NamedPipeServerStream PipeServer = new NamedPipeServerStream(args[0], System.IO.Pipes.PipeDirection.Out);
            PipeServer.WaitForConnection();
            StreamWriter PipeWriter = new StreamWriter(PipeServer);
            PipeWriter.AutoFlush = true;

            string tempWrite;

            while ((tempWrite = Console.ReadLine()) != null)
            {
                try
                {
                    PipeWriter.WriteLine(tempWrite);
                }
                catch (IOException ex)
                {
                    if (ex.Message == "Pipe is broken.")
                    {
                        Console.Error.WriteLine("[NamedPipeServer]: NamedPipeClient was closed, exiting");
                        return;
                    }
                }
            }

            PipeWriter.Close();
            PipeServer.Close();
        }
    }
}

ক্লায়েন্ট:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Pipes;
using System.IO;

namespace NamedPipeClient
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args == null || args.Length == 0)
            {
                Console.Error.WriteLine("[NamedPipeClient]: Need pipe name.");
                return;
            }

            NamedPipeClientStream PipeClient = new NamedPipeClientStream(".", args[0], System.IO.Pipes.PipeDirection.In);
            PipeClient.Connect();
            StreamReader PipeReader = new StreamReader(PipeClient);

            string tempRead;

            while ((tempRead = PipeReader.ReadLine()) != null)
            {
                Console.WriteLine(tempRead);
            }

            PipeReader.Close();
            PipeClient.Close();
        }
    }
}

কোনও ফাইলে পুনঃনির্দেশ করা হচ্ছে

type NUL>StdErr.temp
start powershell -c Get-Content StdErr.temp -Wait
MyExecutable.exe 2>StdErr.temp
  1. একটি খালি ফাইল তৈরি করুন
  2. একটি নতুন কনসোল উইন্ডো শুরু করুন যা ফাইলটি দেখে
  3. এক্সিকিউটেবল চালান এবং stderrএই ফাইলটিতে আউটপুট পুনর্নির্দেশ

এটি দেখার জন্য একটি কনসোল উইন্ডোর পছন্দসই প্রভাব সরবরাহ করে stdout(এবং সরবরাহ করে stdin) এবং অন্যটি দেখার জন্য stderr

যে কোনও কিছু নকল করে tailকাজ করবে। পাওয়ারশেল পদ্ধতিটি উইন্ডোজে নেটিভভাবে কাজ করে তবে কিছুটা ধীর হতে পারে (অর্থাত্ ফাইলটিতে লেখা এবং স্ক্রিনে প্রদর্শিত হওয়ার মধ্যে কিছুটা বিলম্ব আছে)। অন্যান্য বিকল্পের জন্য এই স্ট্যাকওভারফ্লো প্রশ্নটি দেখুন tail

একমাত্র সমস্যা হ'ল অস্থায়ী ফাইলটি বেশ বড় হতে পারে। একটি সম্ভাব্য কর্মসূচী হ'ল একটি লুপ চালানো যা কেবল প্রিন্ট করে যদি ফাইলে বিষয়বস্তু থাকে এবং ততক্ষনে ফাইলটি সাফ করে, তবে এটি একটি রেসের শর্ত তৈরি করে।


2
ইউনিক্স ব্যবহারকারীরা বিরক্ত হলেন কারণ উইন্ডোজ আবারও 40 বছরের পুরানো ধারণাটি বোধগম্যভাবে প্রয়োগ করতে ব্যর্থ হয়েছে। আপনি যখন কোনও প্রাথমিক কাজটি করতে চান প্রতিবার আপনার কাস্টম প্রোগ্রাম লেখার দরকার নেই। ফেসপাম
bambams

নীচে দেখুন: আপনি নামযুক্ত পাইপের জন্য নির্ধারিত ইউএনসি পাথটি ব্যবহার করতে পারেন এবং এটি সরাসরি অ্যাক্সেস করতে পারেন।
এরিক অ্যারোনস্টি

15

আমি অবাক হয়েছি যে ইতিমধ্যে এর সঠিক উত্তর দেওয়া হয়নি। সিস্টেমের নামী পাইপগুলির জন্য প্রকৃতপক্ষে একটি ইউএনসি পথ নির্ধারিত রয়েছে, এটি নেটওয়ার্কের যে কোনও মেশিনে অ্যাক্সেসযোগ্য, যা সাধারণ ফাইলের মতো ব্যবহার করা যেতে পারে:

program.exe >\\.\pipe\StdOutPipe 2>\\.\pipe\StdErrPipe

এই স্টেশনে "StdOutPipe" এবং "StdErrPipe" নামে পাইপগুলি বিদ্যমান বলে ধরে নেওয়া হচ্ছে, এটি তাদের সাথে সংযোগ স্থাপন এবং লেখার চেষ্টা করে। pipeঅংশ কি নির্দিষ্ট করে যে আপনি একটি নামে নল চাই।


আমি মনে করি এটি ঠিক উত্তর হিসাবে চিহ্নিত করা উচিত ঠিক যা যা জিজ্ঞাসা করছে @ n611x007 এটি করার জন্য বাহ্যিক প্রোগ্রামের প্রয়োজন নেই!
আর্টারন

সমস্যাটি হ'ল আপনাকে এখনও এমন কোনও পরিষেবা চালু করতে হবে যা এই পাইপগুলি তৈরি করে .... তাদের প্রোগ্রামটি স্বাধীনভাবে উপস্থিত হয় না যা প্রোগ্রাম তৈরি হয়ে যায় এবং প্রোগ্রামটি চলে যাওয়ার পরে ধ্বংস হয়ে যায়।
এরিক অ্যারোনস্টি

@ এরিক অ্যারোনাস্টি আমি ধরে নিয়েছি এই পাইপগুলি ইতিমধ্যে রয়েছে। অন্যথায়, সেগুলি কেবলমাত্র cmd.exe দিয়ে তৈরি করার কোনও উপায় নেই।
ইলিডানএস 4 মনিকাকে

হ্যাঁ এটি ইউনিক্স পাইপ সম্পর্কে দুর্দান্ত জিনিস, আপনি কমান্ড লাইন থেকে পাইপ তৈরি করতে পারেন
এরিক অ্যারোনস্টি

1

স্ট্যান্ডার্ড শেল (সিএমডি.এক্সই) এর সাথে নয়। প্রোগ্রামারদের জন্য, এটি মোটামুটি সহজ । আপনি যে প্রক্রিয়াটি শুরু করেছিলেন তার কেবল দুটি পাইপ ধরুন।


1
কেবলমাত্র prb হ'ল নমুনাটি বেনামে থাকা পাইপগুলি ব্যবহার করে, যা ওভারল্যাপড আইও (অ্যাসিঙ্ক) সমর্থন করে না এবং এভাবে ডেডলকস প্রবণ হয়, বা কমপক্ষে পিকনমেডপাইপ অবশ্যই ব্যবহার করা উচিত।
ফার্নান্দো গঞ্জালেজ সানচেজ

1
ব্লকিং অপেক্ষাগুলি অচলাবস্থা নয় এবং মূল সমস্যা (তথ্য গ্রহণকারী থ্রেডগুলি উত্পাদকের থ্রেডটিকে উত্পাদন করে) এটি ওভারল্যাপড আই / ও দ্বারা যেভাবেই সমাধান করা যায় না।
এমসাল্টারস


1
@ ফার্নান্দোগোঞ্জালেজ সানচেজ: বেশ একই সমস্যা। নোট করুন যে প্রস্তাবিত সমাধান (অতিরিক্ত থ্রেড) অ্যাসিঙ্ক আই / ও এর জন্য যে কোনও প্রয়োজনকে পাশ কাটাবে।
এমসাল্টারস

1
হ্যাঁ, এমএসডিএন নমুনায় প্রিবি হ'ল পিতা বা মাতা চিরকালের জন্য অপেক্ষা করছেন, ফাংশন রিডফ্রিমপাইপে, লাইন বিসুসেস = রিডফাইলে (g_hChildStd_OUT_Rd, chBuf, BUFSIZE, & dwRead, NULL); 1st০ বাইট প্রথমবার পড়বে, এবং দ্বিতীয়বার চিরকালের জন্য আটকে থাকবে (পিকনমেডপাইপ যা অনুপস্থিত তা অবরুদ্ধ নয়)।
ফার্নান্দো গঞ্জালেজ সানচেজ

-1

কোনও সার্ভার থেকে ক্লায়েন্ট ডস উইন্ডোতে ডেটা উইন্ডোজ পাইপের জন্য আপনার পছন্দগুলি তাত্ক্ষণিকভাবে বা পরে একটি ছোট র‌্যাম ড্রাইভের সাথে সন্তুষ্ট হতে পারে। একই মেমোরি ফাইলের জন্য বরাদ্দ পায়, ফাইল-সিস্টেমের মতো নামের সাথে লিখিত / পঠিত। ক্লায়েন্টটি হয় ব্যবহৃত আপ ফাইলটি মুছে ফেলে এবং অন্যটির জন্য অপেক্ষা করে, বা কম্পিউটার বন্ধ হয়ে গেলে এটি অদৃশ্য হয়ে যায়।

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