2012-05-01 9 views
8

का उपयोग कर किसी निर्देशिका में नाम x के सभी फ़ोल्डरों को कैसे निकालें I मेरे पास कई उपफोल्डर और फ़ाइलों के साथ x नामक फ़ोल्डर है। मैं वाई नामक फ़ोल्डर को हटाना चाहता हूं जो एक्स और उसके सभी सबफ़ोल्डर में मौजूद है। कहा गया फ़ोल्डर जिसे हटाया जाना है या हो सकता है कि कोई भी फाइल न हो। मुझे विश्वास है कि मैं cmd ​​या किसी प्रकार की बैच फ़ाइल का उपयोग करके ऐसा कर सकता हूं लेकिन मैं कमांड लाइन नई द्विपक्षीय हूं और वास्तव में कुछ मदद का उपयोग कर सकता हूं।cmd/बैच फ़ाइल

फ़ोल्डर की नाम को चलाने के लिए एक साधारण बात होगी, जो काम करता है लेकिन मेरा मानना ​​है कि प्रत्येक फ़ोल्डर को व्यक्तिगत रूप से हटाने से बेहतर तरीके हैं .. कुछ फ़ोल्डर्स जो सभी फ़ोल्डर्स के माध्यम से जाते हैं।

धन्यवाद

संपादित करें: बस स्पष्ट करने के लिए, मैं y (फ़ोल्डर हटाना आवश्यक है कि) x के अंदर है, और इसे एक्स के उप-फ़ोल्डर में से किसी में और गहराई के किसी भी स्तर पर हो सकता है। इसके अलावा मैं जवाब देख रहा हूं और मुझे किसी भी उत्तर को स्वीकार करने में कुछ समय लग सकता है। आरडी आदेश के लिए है कि का उपयोग कर के मेरे साथ सहन कृपया :)

उत्तर

7

यहाँ स्क्रिप्ट के प्रत्येक भाग का वर्णन करने के टिप्पणी की इस बात के लिए एक समाधान है:

@Echo OFF 
REM Important that Delayed Expansion is Enabled 
setlocal enabledelayedexpansion 
REM This sets what folder the batch is looking for and the root in which it starts the search: 
set /p foldername=Please enter the foldername you want to delete: 
set /p root=Please enter the root directory (ex: C:\TestFolder) 
REM Checks each directory in the given root 
FOR /R %root% %%A IN (.) DO (
    if '%%A'=='' goto end 
    REM Correctly parses info for executing the loop and RM functions 
    set dir="%%A" 
    set dir=!dir:.=! 
    set directory=%%A 
    set directory=!directory::=! 
    set directory=!directory:\=;! 
    REM Checks each directory 
    for /f "tokens=* delims=;" %%P in ("!directory!") do call :loop %%P 
) 
REM After each directory is checked the batch will allow you to see folders deleted. 
:end 
pause 
endlocal 
exit 
REM This loop checks each folder inside the directory for the specified folder name. This allows you to check multiple nested directories. 
:loop 
if '%1'=='' goto endloop 
if '%1'=='%foldername%' (
    rd /S /Q !dir! 
    echo !dir! was deleted. 
) 
SHIFT 
goto :loop 
:endloop 

आप प्रारंभिक चर के सामने से /p बाहर ले जा सकते हैं और सिर्फ = के बाद उनके मान दर्ज करता है, तो आप डॉन 'टी के लिए प्रेरित किया हैं:

set foldername= 
set root= 

तुम भी अंत भाग में पाश हिस्से में echo और pause निकाल सकते हैं बैच चुपचाप चलाने के लिए।

यह थोड़ा और जटिल हो सकता है, लेकिन कोड कई अन्य उपयोगों पर लागू किया जा सकता है।

C:\Test\qwerty 
C:\Test\qwerty\subfolder 
C:\Test\test\qwerty 
C:\Test\test\test\qwerty 

और जो कुछ छोड़ दिया गया था था:

C:\Test\ 
C:\Test\test\ 
C:\Test\test\test\ 
4
FOR /D /R %%X IN (fileprefix*) DO RD /S /Q "%%X" 

लें देखभाल ...

:

/S  Removes all directories and files in the specified directory 
     in addition to the directory itself. Used to remove a directory 
     tree. 
/Q  Quiet mode, do not ask if ok to remove a directory tree with /S 

आदेश के लिए फाइल या चरों की सूची लूप करने के लिए प्रयोग किया जाता है , विकल्पों को याद करने के लिए बहुत आसान हैं, निर्देशिका केवल रिकर्सिवली।

+0

आप वास्तव में यह क्या करता है पर थोड़ा व्याख्या कर सकते हैं? fileprefix क्या है? और उन झंडे .. अब कोशिश कर रहे हैं। – Achshar

+0

आशा है कि यह लिंक आपकी मदद कर सकता है। http://www.robvanderwoude.com/batchcommands.php – StarPinkER

+2

@ अक्षर: असल में, 'fileprefix' ('... IN (Y *) DO ...') के बजाय वाई फ़ोल्डर का नाम डालें। साथ ही, एक्स फ़ोल्डर के पथ को '/ R' और' %% X' के बीच रखें (जर्मेन ने इस तथ्य को याद किया कि '/ R' स्विच को एक तर्क की आवश्यकता है, जो कि रूट फ़ोल्डर है)। और एक और बात, आपको यह सुनिश्चित करने के लिए एक शर्त भी जोड़नी होगी कि आप 'वाई' फ़ोल्डर को हटा रहे हैं, न कि 'Ysomething' जो 'Y *' मास्क से मेल खाता है। ऐसा कुछ ऐसा हो सकता है: '... अगर मैं "%% ~ nxX" == "वाई" आरडी ... '। –

1

एक समस्या विषयों के इस प्रकार के लिए आम है कि है

मैं इसे C:\Test में एक ही फ़ोल्डर qwerty के कई उदाहरण की तलाश में परीक्षण किया यदि कई स्तरों पर लक्ष्य फ़ोल्डर के उदाहरण हैं, तो अधिकांश विधियों में त्रुटि होती है क्योंकि जब एक उच्च स्तरीय फ़ोल्डर हटा दिया जाता है, तो नीचे दिए गए सभी फ़ोल्डर्स गायब हो जाते हैं। उदाहरण के लिए:

C:\X\Y\subfolder 
C:\X\Y\subfolder\one\Y 
C:\X\Y\subfolder\two\Y 
C:\X\Y\subfolder\three\Y 
C:\X\test 
C:\X\test\test 

पिछला उदाहरण Y नामित 4 फ़ोल्डरों की सूची है कि हटा दिया जाएगा उत्पन्न है, लेकिन पहले एक के बाद हटा दिया गया है शेष तीन नामों अब मौजूद नहीं हैं, एक त्रुटि संदेश के कारण जब वे को हटाने का प्रयास कर रहे हैं । मैं समझता हूं कि यह आपके मामले में एक संभावना है।

इस समस्या को हल करने के लिए फ़ोल्डरों को नीचे-अप आदेश में हटा दिया जाना चाहिए, यानी, सबसे निचला फ़ोल्डर पहले हटा दिया जाना चाहिए और शीर्ष स्तर फ़ोल्डर को अंतिम बार हटा दिया जाना चाहिए।जिस तरह से इस लक्ष्य को हासिल करने के लिए एक पुनरावर्ती सबरूटीन के माध्यम से है:

@echo off 
rem Enter into top level folder, process it and go back to original folder 
pushd x 
call :processFolder 
popd 
goto :EOF 

:processFolder 
rem For each folder in this level 
for /D %%a in (*) do (
    rem Enter into it, process it and go back to original 
    cd %%a 
    call :processFolder 
    cd .. 
    rem If is the target folder, delete it 
    if /I "%%a" == "y" (
     rd /S /Q "%%a" 
    ) 
) 
exit /B 

हालांकि इस विशेष मामले में अन्य तरीकों की वजह से समस्याओं सिर्फ कई त्रुटि संदेश हैं, वहाँ अन्य मामलों रहे हैं जब यह प्रसंस्करण आदेश मौलिक है।

निम्नलिखित के साथ
0

मेक .bat:

del /q "C:\Users\XXX\AppData\Local\Temp\*" 

FOR /D %%p IN ("C:\Users\XXX\AppData\Local\Temp\*.*") DO rmdir "%%p" /s /q