डॉस बैच - एक लूप के लिए वर्तमान निर्देशिका प्राप्त करें


0

मैं थोड़ा डॉस बैच लिखने का इरादा रखता हूं जो किसी दिए गए उपनिर्देशिका संरचना के लिए ध्वनि फ़ाइलों वाली एम 3 यू फाइलें बनाता है। M3u फ़ाइल का नाम '[मूल निर्देशिका] .m3u' होगा (जहाँ [मूल निर्देशिका] मूल माता-पिता के वास्तविक नाम द्वारा प्रतिस्थापित किया गया हो, निश्चित रूप से)।

मेरा बैच अब तक:

FOR /D /R %%I IN (\*.\*) DO (
IF EXIST "%%I\\*.mp3" (
    FOR %%* in ("%%I") do set X=%%~n*
    DIR /B "%%I\\*.mp3" > "%%I\\%X%.m3u"
    )
)

ठीक है - इसे छोटा करने के लिए, यह इरादा के अनुसार काम नहीं करता है। M3u फाइलें बनाई जाती हैं, लेकिन उनके पास '.m3u' (येप, केवल विस्तार, कोई नाम नहीं है) जैसे नाम हैं।

कारण शायद यह है कि डॉस लूप के लिए लूप को दूसरे के भीतर कॉल करने की अनुमति नहीं देता है।

हम्फ़ - क्या लूप के लिए बाहरी के माध्यम से काम करते समय वर्तमान निर्देशिका नाम (और केवल वर्तमान एक, संपूर्ण पथ नहीं) पाने का कोई तरीका है?

किसी भी उपयोगी संकेत के लिए आभार!


आप इस पर पूछना चाह सकते हैं स्टैक ओवरफ़्लो बजाय।
lzam

डॉस लूप के लिए नहीं है। केवल Windows NT के cmd में है। वे बहुत अलग हैं
phuclv

जवाबों:


0

आपको अपना उपयोग करना चाहिए FOR के लिए निर्माण CD प्रत्येक उपनिर्देशिका में और उपनिर्देशिका के भीतर से अपनी कमांड चलाएं।

स्रोत फ़ाइलों के माध्यम से / आर लूप के लिए (पुन: प्रस्तुत सबफ़ोल्डर्स)

फ़ाइलों के माध्यम से लूप (पुन: प्राप्त सबफ़ोल्डर)

वाक्य - विन्यास         For / R [[ड्राइव:] पथ] %% पैरामीटर IN (सेट) DO कमांड

कुंजी

ड्राइव: पथ: फ़ोल्डर ट्री जहाँ फ़ाइलें स्थित हैं।

सेट: एक या अधिक फ़ाइलों का एक सेट। वाइल्डकार्ड का उपयोग किया जाना चाहिए।                    यदि (सेट) एक अवधि वर्ण (।) है, तो इच्छा के लिए                    हर फ़ोल्डर के माध्यम से पाश।

कमांड: किसी भी सहित बाहर ले जाने के लिए कमांड                    कमांड लाइन पैरामीटर।

%% पैरामीटर: एक बदली पैरामीटर:                    बैच फ़ाइल में %% G का उपयोग करें (कमांड लाइन% G पर)

यह कमांड उस फ़ोल्डर ट्री को चलाती है जो [ड्राइव:] पथ पर शुरू होता है, और   प्रत्येक मिलान फ़ाइल के विरुद्ध DO कथन निष्पादित करता है।

यदि [ड्राइव:] पथ निर्दिष्ट नहीं है, तो वे वर्तमान में डिफ़ॉल्ट होंगे   ड्राइव: पथ।

एक उदाहरण

बदले में C: \ Work के तहत प्रत्येक सबफ़ोल्डर में निर्देशिका बदलें:

FOR /R "C:\Work\" %%G in (.) DO (
    Pushd %%G
    Echo now in %%G
    Popd )
Echo "back home"

अपने बैच फ़ाइल के रूप में निम्न का प्रयास करें

FOR /R %%G in (.) DO (
    Pushd %%G
    IF EXIST "*.mp3" (
        DIR /B *.mp3 > "%CD%.m3u"
    )
    Popd
)

टिप्पणियाँ:

  • % CD% वर्तमान निर्देशिका है।

0

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

विलंबित विस्तार का उपयोग करके उस समस्या को हल किया जा सकता है ( setlocal enableDelayedExpansion शीर्ष पर, और !X! के बजाय %X%। लेकिन एक बेहतर तरीका है जो डेविडपोस्टिल के समाधान से भी सरल है।

निम्नलिखित कमांड लाइन पर सीधे काम करेगा - कोई बैच स्क्रिप्ट की आवश्यकता नहीं है।

for /r %F in (.) do @if exist "%F\*.mp3" dir /b *.mp3 >"%F\%~nxF.mp3"

यदि आप बैच स्क्रिप्ट में कमांड का उपयोग करते हैं, तो पर्केंट्स को दोगुना करें।

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