2012-08-14 18 views
5

है मैं एक बैच फ़ाइल (.bat) में लाइनों की एक श्रृंखला है, जैसे एक Windows मशीन पर चल:पुनर्निर्देशन डॉस आउटपुट अगर वहाँ आउटपुट

start /b prog.exe cmdparam1 cmdparam2 > test1.txt 
start /b prog.exe cmdparam1 cmdparam2 > test2.txt 

कभी कभी proj.exe कुछ भी नहीं (खाली) रिटर्न के बजाय उपयोगी डेटा का। उन मामलों में मैं एक टेक्स्ट फ़ाइल उत्पन्न नहीं करना चाहता हूं, क्या यह चीज़ों के बैच फ़ाइल पक्ष पर आसानी से करने योग्य है? वर्तमान व्यवहार यह है कि एक खाली फ़ाइल हमेशा बनाई जाती है, खाली आउटपुट के मामले में यह केवल एक खाली फ़ाइल है।

+2

बस [शून्य लम्बाई के साथ सभी फ़ाइलों को हटाने] [1]। आप उन आदेशों को "प्रारंभ" आदेशों से जोड़ सकते हैं। अर्थात। कुछ ऐसा: [1]: http://stackoverflow.com/questions/4176962/recursively-delete-0kb-files-using-windows-cmd – jpe

+0

@jpe - यह एकमात्र संभावित उत्तर जैसा लगता है यदि आप चाहते हैं इसे पूरी तरह से डॉस में संभालने के लिए। आपको इसे एक उत्तर के रूप में पोस्ट करना चाहिए ताकि इसे 'सही' चिह्नित किया जा सके। –

+0

स्टैक ओवरफ़्लो ने मेरा जवाब एक टिप्पणी में बदल दिया क्योंकि यह बहुत छोटा था। तो मैंने थोड़ा सा विस्तार किया :) – jpe

उत्तर

4

जेपी समाधान के लिए आपके माता-पिता को यह जानने की आवश्यकता होती है कि प्रारंभिक प्रक्रियाओं को आउटपुट फ़ाइल आकारों की जांच करने से पहले कब पूरा हो गया है। आप स्टार्ट/डब्ल्यूएआईटी विकल्प का उपयोग कर सकते हैं, लेकिन फिर आप समानांतर में चलने का लाभ खो देते हैं।

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

आप शायद अपने आउटपुट फ़ाइल के लिए stderr के साथ-साथ stdout रीडायरेक्ट करना चाहिए

@echo off 

::start the processes and redirect the output to the ouptut files 
start /b "" cmd /c prog.exe cmdparam1 cmdparam2 >test1.txt 2>&1 
start /b "" cmd /c prog.exe cmdparam1 cmdparam2 >test2.txt 2>&1 

::define the output files (must match the redirections above) 
set files="test1.txt" "test2.txt" 

:waitUntilFinished 
:: Verify that this parent script can redirect an unused file handle to the 
:: output file (append mode). Loop back if the test fails for any output file. 
:: Use ping to introduce a delay so that the CPU is not inundated. 
>nul 2>nul ping -n 2 ::1 
for %%F in (%files%) do (
    9>>%%F (
    rem 
) 
) 2>nul || goto :waitUntilFinished 

::Delete 0 length output files 
for %%F in (%files%) do if %%~zF==0 del %%F 
+0

'stdin'' 0' है, 'stdout'' 1' है, 'stderr' '2' है। जिज्ञासा से, '9> %% एफ का' 9' हिस्सा क्या है ('do? –

+0

यह सीएमडी.एक्सईई के लिए उपलब्ध उच्चतम क्रमांकित अप्रयुक्त फ़ाइल हैंडल है। फ़ाइल बनाई गई है, और कोई भी आउटपुट जो भेजा जाता है वह फ़ाइल हैंडल फ़ाइल में समाप्त हो जाएगा, लेकिन निश्चित रूप से सामान्य परिस्थितियों में कभी भी कुछ भी नहीं होगा। इसे फ़ाइल में से किसी एक के साथ काम करना चाहिए 1-9, लेकिन मैं सिर्फ सतर्क था। – dbenham

2

बस delete all files with zero length। संपादित करें: तथ्य यह है कि prog.exe इंतजार कर से पहले/WAIT झंडा रिटर्न बिना start समाप्त करने के लिए समायोजित करने के लिए, आप अपने prog.exe निम्नलिखित आवरण स्क्रिप्ट progwrapper.bat बना सकते हैं:

prog.exe "%1" "%2" > "%3" 
if %~z3==0 del "%3" 

फिर अपने गुरु स्क्रिप्ट से आवरण फोन:

start /b progwrapper.bat cmdparam1 cmdparam2 > test1.txt 
start /b progwrapper.bat cmdparam1 cmdparam2 > test2.txt 

आदि

prog.exe एक जीयूआई अनुप्रयोग है, तो आप progwrapper.bat में एक start /B /WAIT prog.exe होना चाहिए।

+1

यह काम करता है, केवल समस्या यह है कि मुझे अपनी 'शुरुआत' पर '/ प्रतीक्षा' ध्वज डालना होगा क्योंकि अन्यथा मैं जेनरेट होने से पहले हटाने की कोशिश करता हूं। – user17753

+0

@ user17753 - हां, आपके मूल बैच को फ़ाइल आकार की जांच कब करना होगा। मैं एक ऐसे उत्तर पर काम कर रहा हूं जो एकाधिक कार्यक्रमों को समानांतर में चलाने की अनुमति देगा और सभी पूर्ण होने तक आकारों की जांच नहीं करेगा। – dbenham

संबंधित मुद्दे