2011-08-08 12 views
28

क्या बैच फ़ाइल के अंदर एक पाइप वाली स्टडीन स्ट्रीम का उपयोग करना संभव है? जब मैंने इसे type testFile.txt | process.bat साथ परीक्षणबैच फ़ाइल में stdin स्ट्रीम पढ़ें

echo OFF 
setlocal 

:again 
set /p inputLine="" 
echo.%inputLine% 
if not (%inputLine%)==() goto again 

endlocal 
:End 

:

C:\>someOtherProgram.exe | process.bat 

मेरा पहला प्रयास की तरह लग रहा था:

मैं अपने बैच फ़ाइल में process.bat सूची तो एक आदेश के उत्पादन में पुनर्निर्देशित करने के लिए सक्षम होना चाहते हैं यह बार-बार पहली पंक्ति को प्रिंट करता है।

क्या कोई और तरीका है?

+2

महान प्रश्न, अच्छा जवाब, वास्तव में गड़बड़ है कि एक बेहतर जवाब नहीं है! –

उत्तर

31

set /p पाइप के साथ काम नहीं करता है, यह इनपुट से एक (यादृच्छिक रूप से) रेखा लेता है।
लेकिन आप फॉर-लूप के अंदर more का उपयोग कर सकते हैं।

@echo off 
setlocal 
for /F "tokens=*" %%a in ('more') do (
    echo #%%a 
) 

लेकिन इस लाइनों अर्धविराम के साथ शुरुआत के साथ विफल (EOL के लिए लूप-मानक के रूप में ; है)।
और यह खाली लाइनें नहीं पढ़ सकता है।
लेकिन findstr के साथ आप इसे भी हल कर सकते हैं, यह लिननंबर के साथ प्रत्येक पंक्ति को उपसर्ग करता है, इसलिए आपको खाली रेखाएं कभी नहीं मिलतीं।
और फिर उपसर्ग को पहले कोलन में हटा दिया जाता है।

@echo off 
setlocal DisableDelayedExpansion 

for /F "tokens=*" %%a in ('findstr /n $') do (
    set "line=%%a" 
    setlocal EnableDelayedExpansion 
    set "line=!line:*:=!" 
    echo(!line! 
    endlocal 
) 

वैकल्पिक रूप से, कुछ वातावरण (WinRE) की तरह है कि findstr शामिल नहीं है पर, find.exe साथ एक विकल्प के लिए पर्याप्त हो सकता है। find एक शून्य खोज स्ट्रिंग "" स्वीकार करेगा, और खोज विचलन की अनुमति देता है। यह कुछ इस तरह की अनुमति होगी:

@echo off 
setlocal DisableDelayedExpansion 

for /F "tokens=*" %%a in ('find /v ""') do (
    set "line=%%a" 
    echo(!line! 
) 
+1

यह काम करता प्रतीत होता है। मैंने 'सेट "लाइन =! लाइन नहीं देखी है: *: =!" पहले वाक्यविन्यास। अधिक बैच स्क्रिप्ट पागलपन। मैंने इसे एमएसवाईएस उपकरण का उपयोग करने के लिए थोड़ा सा अनुकूलित किया है; 'sed "s/^ \ (। * \) $/\" \ 1 \ "/"' 'findstr/n $' के बजाय। उसके बाद शरीर को 'echo। %% ~ a' के साथ प्रतिस्थापित किया जा सकता है और यह किसी भी डॉस लाइन एंडिंग को संभाल नहीं सकता है (जो मेरे पास बहुत सारी फाइलें हैं)। – m0tive

+5

'FINDSTR/N'^"' 'का उपयोग करने के लिए बेहतर। यह खोज यूनिक्स स्वरूपित लाइनों के साथ-साथ किसी भी अंतिम पंक्ति के साथ सभी लाइनों को सही ढंग से वापस लाएगी जो एक नई लाइन के साथ समाप्त नहीं हो सकती हैं। – dbenham

+0

मुझे लगता है कि आप अर्धविराम से शुरू होने वाली लाइनों से निपटने के लिए 'for/F" टोकन = * eol = "' का उपयोग कर सकते हैं। – wangzq

3

सेट "line=!line:*:=!" वाक्य रचना है:

  1. सेट एक पैरामीटर है कि है a=b की आवश्यकता है।
    यदि कोई स्थान या कुछ शामिल है, तो आपको इस पैरामीटर के आस-पास उद्धरण चिह्नों का उपयोग करना होगा। यहाँ मैं इस वाक्य रचना, आप टाइप कर सकते हैं 'set /?' चर का उपयोग करने पर आधिकारिक विवरण देखने के लिए किसी भी

  2. !line:*:=!
    नहीं दिख रहा। मूल्य प्राप्त करने के लिए
    !var!%var% जैसा है। लेकिन !var! का अर्थ है विस्तार में देरी हुई।

पंक्ति var नाम

पहले: चर संशोधन निशान।

**:= **:= (खाली) वेरिएबल का मान मैचों "*:" में स्ट्रिंग की जगह (लगभग स्ट्रिंग से पहले : घटना के लिए शुरू) (खाली), अर्थात् के साथ पहली बार पेट के लिए शुरू से ही सबस्ट्रिंग को हटा दें।

1
FOR /F "tokens=1* delims=]" %%A IN ('FIND /N /V ""') DO (
    > CON ECHO.%%B 
    >> %File% ECHO.%%B 
) 

यहाँ स्रोत: http://www.robvanderwoude.com/unixports.php#TEE

+0

ढूंढने या ढूंढने का उपयोग करता हूं यह अर्ध-कॉलन से शुरू होने वाली रेखाओं पर असफल नहीं होता है। – Ben

+0

लेकिन मेरे लिए, यह ']' से शुरू होने वाली लाइनों पर विफल रहा। –

1

वैकल्पिक रूप से, कुछ वातावरण (WinRE) की तरह है कि findstr शामिल नहीं है पर, find.exe साथ एक विकल्प के लिए पर्याप्त हो सकता है। find एक शून्य खोज स्ट्रिंग "" स्वीकार करेगा, और खोज विचलन की अनुमति देता है। इससे कुछ इस तरह की अनुमति होगी:

@echo off 
setlocal DisableDelayedExpansion 

for /F "tokens=*" %%a in ('find /v ""') do (
    set "line=%%a" 
    echo(!line! 
) 
संबंधित मुद्दे