मुझे यकीन नहीं है कि आप किसी फ़ाइल को पुनर्निर्देशित क्यों नहीं करना चाहते हैं। यहाँ दो विधियाँ उपलब्ध हैं। एक विधि एक फ़ाइल से रीडायरेक्ट और रीडायरेक्ट करने के लिए है, दूसरा प्रोग्राम का एक सेट है।
नाम दिया गया पाइप
मैंने क्या किया था।नेट 4 के लिए दो कार्यक्रम लिखे थे। एक नामांकित पाइप को आउटपुट भेजता है, दूसरा इस पाइप से पढ़ता है और कंसोल को प्रदर्शित करता है। उपयोग काफी सरल है:
asdf.exe | NamedPipeServer.exe "APipeName"
एक और कंसोल विंडो में:
NamedPipeClient.exe "APipeName"
दुर्भाग्य से, यह विंडोज ऑपरेटर प्रॉम्प्ट में पाइप ऑपरेटर ( ) में सीमाओं के कारण केवल पुनर्निर्देशित कर सकता है stdout
(या stdin
संयुक्त), stderr
अपने आप से नहीं |
। यदि आप यह जानते हैं stderr
कि उस पाइप ऑपरेटर के माध्यम से कैसे भेजा जाए , तो यह काम करना चाहिए। वैकल्पिक रूप से, सर्वर को आपके प्रोग्राम और विशेष रूप से पुनर्निर्देशित करने के लिए संशोधित किया जा सकता है stderr
। यदि यह आवश्यक है, तो मुझे एक टिप्पणी में बताएं (या इसे स्वयं करें); यदि आपके पास कुछ C # और .NET "प्रोसेस" लाइब्रेरी नॉलेज है तो यह बहुत मुश्किल नहीं है।
आप सर्वर और क्लाइंट को डाउनलोड कर सकते हैं ।
यदि आप कनेक्शन के बाद सर्वर को बंद करते हैं, तो क्लाइंट तुरंत बंद हो जाएगा। यदि आप कनेक्शन के बाद क्लाइंट को बंद करते हैं, तो जैसे ही आप इसके माध्यम से कुछ भेजने की कोशिश करेंगे, सर्वर बंद हो जाएगा। एक टूटे हुए पाइप को फिर से जोड़ना संभव नहीं है, ज्यादातर क्योंकि मैं अभी कुछ जटिल करने से परेशान नहीं हो सकता। यह प्रति सर्वर एक ग्राहक तक भी सीमित है ।
सोर्स कोड
ये C # में लिखे गए हैं। इसको समझाने की कोशिश में ज्यादा बात नहीं है। वे .NET NamedPipeServerStream और NamedPipeClientStream का उपयोग करते हैं ।
सर्वर:
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
।
कुछ भी है कि mimics tail
काम करेगा। PowerShell विधि विंडोज़ में मूल रूप से काम करती है, लेकिन थोड़ी धीमी हो सकती है (यानी फ़ाइल में लिखने और स्क्रीन को प्रदर्शित करने के बीच कुछ विलंबता)। अन्य विकल्पों के लिए इस StackOverflow प्रश्न को देखें tail
।
एकमात्र समस्या यह है कि अस्थायी फ़ाइल काफी बड़ी हो सकती है। एक संभावित समाधान एक लूप को चलाना है जो केवल प्रिंट करता है यदि फ़ाइल में सामग्री है और फ़ाइल को तुरंत बाद में साफ़ करें, लेकिन इससे दौड़ की स्थिति पैदा होगी।