আপনি কেন কোনও ফাইলে পুনর্নির্দেশ করতে চান না তা আমি নিশ্চিত নই। আমি এখানে দুটি পদ্ধতি সরবরাহ করব। একটি পদ্ধতি হ'ল পুনর্নির্দেশ করা এবং কোনও ফাইল থেকে পড়া, অন্যটি প্রোগ্রামগুলির একটি সেট।
নামকরণ পাইপ
আমি যা করেছি তা। নেট 4 এর জন্য দুটি প্রোগ্রাম লিখি One একটি নামযুক্ত পাইপে আউটপুট প্রেরণ করে, অন্যটি এই পাইপ থেকে পড়ে কনসোলে প্রদর্শন করে। ব্যবহার বেশ সহজ:
asdf.exe | NamedPipeServer.exe "APipeName"
অন্য কনসোল উইন্ডোতে:
NamedPipeClient.exe "APipeName"
দুর্ভাগ্যক্রমে, উইন্ডোজ কমান্ড প্রম্পটে পাইপ অপারেটর ( ) এর সীমাবদ্ধতার কারণে এটি কেবল নিজের দ্বারা নয় stdout
(বা stdin
সংযুক্ত) পুনঃনির্দেশ করতে পারে । যদি আপনি কীভাবে পাইপ অপারেটরটির মাধ্যমে প্রেরণ করতে পারেন তবে এটি কাজ করা উচিত। বিকল্পভাবে, আপনার প্রোগ্রামটি চালু করতে এবং বিশেষত পুনর্নির্দেশের জন্য সার্ভারটি পরিবর্তন করা যেতে পারে । যদি এটি প্রয়োজনীয় হয় তবে আমাকে একটি মন্তব্যে জানান (বা এটি নিজে করুন); আপনার কাছে কিছু সি # এবং .NET "প্রক্রিয়া" লাইব্রেরি জ্ঞান থাকলে এটি খুব বেশি কঠিন নয়।stderr
|
stderr
stderr
আপনি সার্ভার এবং ক্লায়েন্ট ডাউনলোড করতে পারেন ।
সংযোগের পরে আপনি যদি সার্ভারটি বন্ধ করেন তবে ক্লায়েন্টটি অবিলম্বে বন্ধ হয়ে যাবে। আপনি যদি সংযোগের পরে ক্লায়েন্টটি বন্ধ করেন, আপনি এর মাধ্যমে কিছু প্রেরণের চেষ্টা করার সাথে সাথে সার্ভারটি বন্ধ হয়ে যাবে। কোনও ভাঙা পাইপ পুনরায় সংযোগ করা সম্ভব নয়, বেশিরভাগ কারণেই এখনই আমাকে এত জটিল কিছু করতে বিরক্ত করা যায় না। এটি প্রতি সার্ভারে একটি ক্লায়েন্টের মধ্যেও সীমাবদ্ধ ।
সোর্স কোড
এগুলি সি # তে লেখা আছে। এটি ব্যাখ্যা করার চেষ্টা করার মতো খুব একটা বিষয় নেই। তারা .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
- একটি খালি ফাইল তৈরি করুন
- একটি নতুন কনসোল উইন্ডো শুরু করুন যা ফাইলটি দেখে
- এক্সিকিউটেবল চালান এবং
stderr
এই ফাইলটিতে আউটপুট পুনর্নির্দেশ
এটি দেখার জন্য একটি কনসোল উইন্ডোর পছন্দসই প্রভাব সরবরাহ করে stdout
(এবং সরবরাহ করে stdin
) এবং অন্যটি দেখার জন্য stderr
।
যে কোনও কিছু নকল করে tail
কাজ করবে। পাওয়ারশেল পদ্ধতিটি উইন্ডোজে নেটিভভাবে কাজ করে তবে কিছুটা ধীর হতে পারে (অর্থাত্ ফাইলটিতে লেখা এবং স্ক্রিনে প্রদর্শিত হওয়ার মধ্যে কিছুটা বিলম্ব আছে)। অন্যান্য বিকল্পের জন্য এই স্ট্যাকওভারফ্লো প্রশ্নটি দেখুন tail
।
একমাত্র সমস্যা হ'ল অস্থায়ী ফাইলটি বেশ বড় হতে পারে। একটি সম্ভাব্য কর্মসূচী হ'ল একটি লুপ চালানো যা কেবল প্রিন্ট করে যদি ফাইলে বিষয়বস্তু থাকে এবং ততক্ষনে ফাইলটি সাফ করে, তবে এটি একটি রেসের শর্ত তৈরি করে।