विंडोज बैच: फॉर लूप में एक से अधिक कमांड को कॉल करें?


124

क्या विंडोज बैच फ़ाइल में एक ही FOR लूप में एक से अधिक कमांड को कॉल करना संभव है ? उदाहरण के लिए मान लें कि मैं फ़ाइल का नाम प्रिंट करना चाहता हूं और इसे हटाने के बाद:

@ECHO OFF
FOR /r %%X IN (*.txt) DO (ECHO %%X DEL %%X)
REM the line above is invalid syntax.

मुझे पता है कि इस मामले में मैं इसे दो अलग-अलग छोरों के लिए हल कर सकता हूं: एक नाम दिखाने के लिए और एक फ़ाइल को हटाने के लिए, लेकिन क्या यह केवल एक लूप में करना संभव है?

जवाबों:


117
FOR /r %%X IN (*) DO (ECHO %%X & DEL %%X)

2
दरअसल, मुझे लगता है कि कोष्ठक अनावश्यक हैं। for %i in (1 2 3) do echo %i & echo fooप्रिंट करता है कि मैं क्या उम्मीद करूंगा: "1", "फू", "2", "फू", "3", "फू" (अलग-अलग लाइनों पर)।
18

नहीं &&बल्कि होना चाहिए &?
jww

9
@jww &&विफल हो जाएगा यदि पहला कमांड विफल &हो जाता है, तो दूसरी कमांड को परवाह किए बिना निष्पादित करेगा।
yyny

यदि यह समाधान आपके लिए एक वाक्यविन्यास त्रुटि करता है, तो देखें कि क्या आपको DO-परियों के बीच एक बिना खोजे हुए परन मिला है। आप उन्हें संलग्न करके बच सकते हैं ^
Константин Ван

199

का उपयोग करना &छोटे आदेशों के लिए ठीक है, लेकिन वह एकल पंक्ति बहुत जल्दी बहुत लंबी हो सकती है। जब ऐसा होता है, तो मल्टी-लाइन सिंटैक्स पर स्विच करें।

FOR /r %%X IN (*.txt) DO (
    ECHO %%X
    DEL %%X
)

प्लेसमेंट (और )मायने रखती है। DOएक ही लाइन पर रखा जाना चाहिए के बाद गोल कोष्ठक , अन्यथा बैच फ़ाइल गलत होगी।

if /?|find /V ""विवरण के लिए देखें।


12
यह समाधान साफ ​​और पठनीय दिखता है। मैं किसी भी प्रोग्रामर को भी चेतावनी दूंगा जो इस समाधान का उपयोग करता है कि राउंड ब्रैकेट को DOअगली पंक्ति में नहीं रखा जाना चाहिए अन्यथा यह बैच फ़ाइल को ब्रेक करता है। कोड में जब मैं लूप के लिए लिखता हूं तो मैं आमतौर पर घुंघराले ब्रैकेट को {अगली पंक्ति में रखता हूं ।
मार्को डेमायो

2
इसके अलावा - सावधान रहें यदि आपके किसी नेस्टेड कमांड में कोष्ठक हैं (उदाहरण के लिए, "इको समथिंग समथिंग समथिंग (कुछ और)" EDIT: आह, bk1e का उत्तर देखें :)
टिम बैरास

31

सिल्वरस्किन और एंडर्स दोनों सही हैं। आप कई आदेशों को निष्पादित करने के लिए कोष्ठक का उपयोग कर सकते हैं। हालांकि, आपको यह सुनिश्चित करना होगा कि आदेश स्वयं (और उनके मापदंडों) में कोष्ठक नहीं हैं। cmdलालच में पहले बंद कोष्ठक के लिए खोज करता है, बजाय सुंदर रूप से कोष्ठक के नेस्टेड सेट को संभालने के बजाय। यह कमांड लाइन के बाकी हिस्सों को पार्स करने में विफल हो सकता है, या यह कुछ कोष्ठकों को कमांडों (जैसे DEL myfile.txt)) में पारित होने का कारण हो सकता है ।

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

FOR /r %%X IN (*.txt) DO CALL :loopbody %%X
REM Don't "fall through" to :loopbody.
GOTO :EOF

:loopbody
ECHO %1
DEL %1
GOTO :EOF

3
जब हम विषय पर होते हैं, फ़ाइल नाम के साथ काम करते समय% X कभी भी सही नहीं होता है, तो हमेशा "% ~ X" का उपयोग करें (आपके उदाहरण में, आप शायद सबफ़ंक्शन में% * का उपयोग करके दूर हो सकते हैं)
एंडर्स

1
यह वास्तव में एक अच्छा बिंदु है। पथ का एक अच्छा उदाहरण जो दोनों समस्याओं को प्रदर्शित करता है C:\Program Files (x86)
bk1e
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.