2011-12-06 11 views
24

ठीक है, मैं एक PHP प्रोग्रामर हूं और दुर्भाग्यवश, कारणों से मैं संक्षिप्तता की घोषणा नहीं करूंगा, मुझे बैच फ़ाइल लिखने/उपयोग करने की आवश्यकता है जो मेरे लिए कुछ इमेजरी को संसाधित करता है।विंडोज बैच फ़ाइल प्रक्रिया फ़ाइलों के लिए निर्देशिकाओं के माध्यम से लूपिंग?

मेरे पास नेस्टेड फ़ोल्डर्स से भरा एक फ़ोल्डर है, इनमें से प्रत्येक नेस्टेड फ़ोल्डरों में से एक और फ़ोल्डर है जिसमें कई टीआईएफ छवियां हैं, प्रत्येक फ़ोल्डर में छवियों की संख्या अलग-अलग होती है। मेरे पास बैच फ़ाइल भी है, इसे विंडोज़ के लिए ProcessImages.bat पर कॉल करने दें, जिन्हें आप इन टीआईएफ फाइलों को "ड्रॉप" कर सकते हैं (या बल्लेबाजी करते समय उन्हें कमांड लाइन सूची में स्पष्ट रूप से निर्दिष्ट करें); जिस पर यह मेरे पास एक EXE के आधार पर मेरी सभी छवियों की प्रक्रिया के साथ एक नया फ़ोल्डर बनाता है।

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

सभी ने कहा ... क्या कोई मुझे सही दिशा में इंगित कर सकता है (विंडोज़ बैट फ़ाइल अमेटेर के लिए) मैं एक विंडोज बैट स्क्रिप्ट लिख सकता हूं जिसे मैं एक निर्देशिका के अंदर से कॉल कर सकता हूं और इसे सभी के माध्यम से पार कर सकता हूं निर्देशिकाओं के अंदर निहित निर्देशिका ... और एक समय में छवियों के प्रत्येक सेट पर मेरी प्रोसेसिंग बैच फ़ाइल चलाएं?

अग्रिम धन्यवाद!

टायलर

उत्तर

67

आप बैच में पुनरावर्ती एल्गोरिदम कि तुम क्या आप हर नेस्टेड उप-निर्देशिका के कर की सटीक नियंत्रण देता है लिख सकते हैं:

@echo off 
call :treeProcess 
goto :eof 

:treeProcess 
rem Do whatever you want here over the files of this subdir, for example: 
for %%f in (*.tif) do echo %%f 
for /D %%d in (*) do (
    cd %%d 
    call :treeProcess 
    cd .. 
) 
exit /b 
+0

धन्यवाद @Aacini! बहुत सही कहा! मैंने कुछ इसी तरह काम करना शुरू कर दिया था, लेकिन कहीं नहीं मिला ... मुझे यह देखने के लिए जरूरी था कि यह कैसे काम करता है; और इस कोड का एक त्वरित परीक्षण इंगित करता है कि यह बिल्कुल अपेक्षित काम करेगा। – Tyler

+1

@ एसिनी। क्या आप यह भी बता सकते हैं/टिप्पणी कर सकते हैं कि इन/डी, %% एफ कमांड क्या करते हैं? वह महान होगा ! – Dexters

+2

आप निम्न यूआरएल से वाक्यविन्यास पर अधिक पा सकते हैं। http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/for.mspx?mfr=true –

42

Aacini के समाधान काम करता है, लेकिन आप एक पंक्ति में कर सकते हैं:

for /R %%f in (*.tif) do echo "%%f" 
+0

पता नहीं कितने साल बाद, लेकिन मैं अभी भी इसका उपयोग कर रहा हूं! – Tyler

+0

मैं इसका उपयोग कर रहा हूं, और किसी कारण से, यह डायरेक्टरी पेड़ में प्रत्येक फ़ाइल के लिए कमांड करता है, न केवल एक्सटेंशन वाले जिन्हें मैं –

+2

निर्दिष्ट करता हूं जैसा कि मैंने कहा था, मेरी विधि प्रत्येक उपनिर्देशिका में आपके द्वारा किए गए कार्यों का सटीक नियंत्रण देती है । अगर प्रक्रिया को एक निश्चित क्रम की आवश्यकता होगी (उदाहरण के लिए, पहले फ़ाइलों को ले जाएं और फिर खाली उपनिर्देशिकाएं हटाएं) तो इसे 'for/r'' का उपयोग करके हासिल नहीं किया जा सकता है ... – Aacini

1

यहां पोस्ट करना क्योंकि यह इस मामले के बारे में सबसे लोकप्रिय सवाल प्रतीत होता है।

यहां एक पुराना मणि है जिसे मैंने अंत में इंटरनेट पर वापस खोजने में कामयाब रहा है: sweep.exe
यह वर्तमान निर्देशिका और सभी उपनिर्देशिकाओं में प्रदान की गई कमांड को निष्पादित करता है, जो कि सरल है।


के आप कुछ प्रोग्राम है कि एक निर्देशिका में सभी फ़ाइलों को प्रोसेस है (लेकिन उपयोग के मामलों वास्तव में इस तुलना में अधिक व्यापक हैं) मान लेते हैं:

For example, a file C:\Commands\processimages.cmd which contains: 
FOR %%f IN (*.png) DO whatever 

तो, आप मौजूदा निर्देशिका में इस कार्यक्रम चलाना चाहते हैं और सभी सबडायरेक्टरियों:

:: Put sweep.exe in your PATH, you'll love it! 
C:\ImagesDir> sweep C:\Commands\processimages.cmd 

:: And if processimages.cmd is in your PATH too, the command becomes: 
C:\ImagesDir> sweep processimages 


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

कॉन: कुछ आदेशों के साथ असफल हो सकता है (रिक्त स्थान, उद्धरण, मुझे नहीं पता)। उदाहरण के लिए this thread देखें।

+0

यह शानदार है ... – Tyler

2

मुझे पता है कि यह रिकर्सन नहीं है (गणना की गई उपनिर्देशिकाओं के माध्यम से पुनरावृत्ति?), लेकिन यह कुछ अनुप्रयोगों के लिए बेहतर काम कर सकता है:

for /F "delims=" %%i in ('dir /ad /on /b /s') do (
    pushd %%i 
    dir | find /i "Directory of" 
    popd 
) 

तीसरी पंक्ति को जो भी आदेश आपको चाहिए, उसे बदलें।

dir/विज्ञापन - सूची केवल निर्देशिका

अच्छी बात यह है pushd रिक्त स्थान है, तो रास्ते में उद्धरण की जरूरत नहीं है है।

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