विंडोज में लाइन द्वारा कमांड लाइन का पाइप आउटपुट


2

मैं एक बैच फ़ाइल से एक सर्वर चला रहा हूं और मैं चाहता हूं कि सर्वर आउटपुट को स्क्रीन पर प्रदर्शित किया जाए और लॉग फाइल को भी लिखा जाए। मुझे इस उत्तर से ऐसा करने का एक तरीका मिला :

powershell "startmyserver | tee server.log"

समस्या यह है कि पाइप पहली कमांड को चलाने का कारण बनता है और दूसरी कमांड चलने से पहले पूरी तरह से पूरा हो जाता है। इसका मतलब है कि मैं अपने सर्वर के स्टडआउट की निगरानी नहीं कर सकता, जबकि यह वास्तव में चल रहा है, जो कि मैं करने की कोशिश कर रहा हूं (मैं अभी हाल के लॉग संदेशों की जांच करने के लिए सर्वर को बंद नहीं करना चाहता)।

अधिक सरल उदाहरण के लिए मैंने कोशिश की pause। ठीक है, pauseपॉवर्सशेल पर मौजूद नहीं है, इसलिए मुझे इसे नेस्टेड cmdशेल के अंदर चलाना पड़ा :

powershell "cmd /c pause | tee test.txt"

अप्रत्याशित रूप से, इस कमांड को निष्पादित करने के बाद मुझे बस एक चमकता हुआ कर्सर मिलता है। थोड़ी देर के बाद, मैं एक कुंजी दबाता हूं, और फिर "जारी रखने के लिए कोई भी कुंजी दबाएं" प्रकट होता है और लगभग उसी समय फ़ाइल में लिखा जाता है।

जो मैं करना चाहता हूं वह अगले कमांड के लिए लाइन द्वारा स्टडआउट लाइन को स्ट्रीम करने के लिए पाइप है। दूसरे शब्दों में जब भी यह एक ईओएल चरित्र का सामना करता है तो इसे कुछ आउटपुट भेजना चाहिए और यह (मेरे मामले में tee) पाठ को स्क्रीन पर दिखाई देने का कारण बनता है और साथ ही फ़ाइल में लिखा जाता है। (वास्तव में, मैं इस बात से भी परेशान नहीं हूं कि क्या फाइल लाइन-बाय-लाइन के लिए लिखी गई है, इसे अंत में लिखा जा सकता है, हालांकि यह आदर्श नहीं होगा। मैं सिर्फ लाइनें देखना चाहता हूं। स्क्रीन पर जैसे वे लिखे गए हैं।)

क्या यह कमांड प्रॉम्प्ट और / या पॉवर्सशेल में संभव है?


@PimpJuiceIT मुझे लगता है कि यह दोहरे उद्धरण पदों के साथ मायने रखता है। यदि आप चलाते powershell cmd /c pause | tee "test.txt"हैं तो आप अपने वर्तमान संदर्भ में टी चला रहे हैं। मैं इसे cmd से चला रहा हूं (ps1 नहीं) इसलिए यह कमांड विफल हो जाएगी क्योंकि teeएक पॉवर्सशेल कमांड है। अगर इस कमांड ने आपके लिए काम किया है, तो मुझे लगता है कि या तो (ए) आपके पास teeआपके सिस्टम पर कोई दूसरा है या (बी) आपने इसे पॉवर्सशेल के भीतर से चलाया है। न ही जो मेरे उपयोग के मामले हैं।
किडबर्ला

@PimpJuiceIT क्या आपके पास एक कमांड का एक और उदाहरण है जिसके बजाय मैं उपयोग कर सकता हूं pause? मैंने pauseसिर्फ सुविधा के लिए उपयोग किया क्योंकि मैं ऐसा कमांड नहीं चाहता था जो सीधे समाप्त हो जाए और इसलिए यह बताना असंभव है कि क्या कमांड पूरा होने से पहले लाइनों को स्ट्रीम किया गया था
किडबर्ला

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

जवाबों:


1

इस समस्या को स्टैक ओवरफ्लो पर इस तथ्य के रूप में समझाया गया है कि पावरशेल Tee-Objectआउटपुट स्ट्रीम को फ्लश नहीं करता है, लेकिन केवल स्रोत को ऐसा करने के लिए इंतजार करता है, इसलिए आपको ऑपरेशन के अंत में आउटपुट मिलता है। यह डिजाइन द्वारा है।

उत्तर में प्रस्तावित समाधान इस कोड का उपयोग करना था:

./program | ForEach-Object {
    Write-Host $_
    $_
} | Set-Content program.log

यदि कोई उपरोक्त कार्य नहीं करता है, तो वैकल्पिक सूत्रीकरण:

./program | ForEach-Object {
    [Console]::WriteLine($_)
    [Console]::Out.Flush()
    $_
} | Set-Content program.log

तो कमांड जैसा दिखेगा:

PowerShell -ExecutionPolicy Unrestricted "startmyserver | ForEach-Object { Write-Host $_; $_} | Set-Content server.log"

मेरे मामूली परीक्षण में मेरे लिए यह देखने के लिए आउटपुट बहुत तेजी से उत्पन्न हुआ कि क्या आपने यह निर्दिष्ट किया है।


धन्यवाद! क्या आपके पास कोई विचार है कि (a) इसे लिखने को stdout और stderr दोनों कैसे बनाते हैं, (b) एक ऐसी फाइल को जोड़ते हैं जो पहले से मौजूद है न कि नया बनाने के बजाय?
किदबर्ला

1

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