2018-06-01 पर पोस्ट किए गए उत्तरों में से कोई भी , फॉक्सड्राइव द्वारा पोस्ट की गई एकल कमांड लाइन के अपवाद के साथ , वास्तव में सभी फ़ाइलों और सभी फ़ोल्डरों / निर्देशिकाओं को हटा दिया गया । यही कारण है कि एक फ़ोल्डर के सभी फ़ाइलों और सबफ़ोल्डरों को हटाने के लिए एक बहुत ही सरल सिंगल कमांड लाइन के साथ एक और उत्तर पोस्ट करने के लिए और साथ ही एक बैच फ़ाइल के साथ एक और अधिक जटिल समाधान बताते हुए कि अन्य सभी उत्तर 2018-06-01 को DEL का उपयोग करके पोस्ट क्यों किया गया और के लिए के साथ आरडी पूरी तरह से एक फ़ोल्डर को साफ करने में विफल रहा है।%PathToFolder%
सरल सिंगल कमांड लाइन समाधान जो निश्चित रूप से एक बैच फ़ाइल में भी उपयोग किया जा सकता है:
pushd "%PathToFolder%" 2>nul && ( rd /Q /S "%PathToFolder%" 2>nul & popd )
इस कमांड लाइन में एक के बाद एक निष्पादित तीन कमांड होते हैं।
पहला आदेश PUSHD स्टैक पर वर्तमान निर्देशिका पथ को धकेलता है और अगला %PathToFolder%
कमांड प्रक्रिया को चलाने के लिए वर्तमान निर्देशिका बनाता है।
यह UNC रास्तों के लिए भी डिफ़ॉल्ट रूप से कार्य करता है क्योंकि कमांड एक्सटेंशन डिफ़ॉल्ट रूप से सक्षम होते हैं और इस स्थिति में PUSHD एक अस्थायी ड्राइव अक्षर बनाता है जो उस निर्दिष्ट नेटवर्क संसाधन की ओर इशारा करता है और फिर नए परिभाषित ड्राइव अक्षर का उपयोग करके वर्तमान ड्राइव और निर्देशिका को बदलता है।
PUSHD STDERR को संभालने के लिए त्रुटि संदेश के बाद आउटपुट देता है यदि निर्दिष्ट निर्देशिका बिल्कुल मौजूद नहीं है:
सिस्टम निर्दिष्ट पथ नहीं ढूंढ सकता है।
इस त्रुटि संदेश 2>nul
को डिवाइस NUL के साथ पुनर्निर्देशित करके दबा दिया जाता है ।
अगली कमांड आरडी को केवल तभी निष्पादित किया जाता है जब वर्तमान निर्देशिका प्रक्रिया के लिए वर्तमान निर्देशिका को निर्दिष्ट निर्देशिका में बदलना सफल रहा, अर्थात निर्दिष्ट निर्देशिका बिल्कुल मौजूद है।
विकल्पों के साथ आदेश RD/Q
और सभी उपनिर्देशिकाओं के साथ चुपचाप/S
एक निर्देशिका को हटा देता है, भले ही निर्दिष्ट निर्देशिका में छिपी विशेषता के साथ फाइलें या फ़ोल्डर हों या केवल पढ़ने के लिए विशेषता सेट हो। सिस्टम विशेषता फ़ाइल या फ़ोल्डर को हटाने से कभी नहीं रोकती है।
नहीं हटाए गए हैं:
फ़ोल्डर किसी भी चालू प्रक्रिया के लिए वर्तमान निर्देशिका के रूप में उपयोग किया जाता है। यदि किसी फ़ोल्डर को किसी चालू प्रक्रिया के लिए वर्तमान निर्देशिका के रूप में उपयोग किया जाता है, तो ऐसे फ़ोल्डर का संपूर्ण ट्री ट्री डिलीट नहीं किया जा सकता है।
वर्तमान में चल रही एप्लिकेशन / प्रक्रिया द्वारा खोले जाने पर फ़ाइल को हटाने की अनुमति देने के लिए फ़ाइल ओपन अनुमतियों के साथ किसी भी चल रही प्रक्रिया द्वारा खोली गई फाइलें। इस तरह की एक खुली हुई फाइल भी पूरे फ़ोल्डर ट्री को हटाए गए फ़ाइल को हटाने से रोकती है।
फ़ाइलें / फ़ोल्डर जिस पर वर्तमान उपयोगकर्ता को फ़ाइल (फ़ोल्डर) को हटाने के लिए आवश्यक (NTFS) अनुमतियाँ नहीं हैं, जो इस फ़ाइल / फ़ोल्डर में फ़ोल्डर ट्री को हटाने से भी रोकता है।
किसी फ़ोल्डर को न हटाने का पहला कारण इस कमांड लाइन द्वारा निर्दिष्ट फ़ोल्डर की सभी फ़ाइलों और सबफ़ोल्डरों को हटाने के लिए उपयोग किया जाता है, लेकिन फ़ोल्डर को ही नहीं। फ़ोल्डर अस्थायी रूप से वर्तमान निर्देशिका को कमांड प्रक्रिया चलाने के लिए बनाया गया है जो फ़ोल्डर को हटाने से रोकता है। बेशक आदेश RD द्वारा एक त्रुटि संदेश के उत्पादन में यह परिणाम है :
प्रक्रिया फ़ाइल तक नहीं पहुँच सकती क्योंकि इसका उपयोग किसी अन्य प्रक्रिया द्वारा किया जा रहा है।
फ़ाइल यहाँ गलत शब्द है क्योंकि वास्तव में फ़ोल्डर का उपयोग एक अन्य प्रक्रिया द्वारा किया जा रहा है, वर्तमान कमांड प्रक्रिया जो कमांड RD निष्पादित करती है । खैर, वास्तव में एक फ़ोल्डर फ़ाइल सिस्टम के लिए एक विशेष फ़ाइल है जिसमें फ़ाइल विशेषता निर्देशिका होती है जो इस त्रुटि संदेश को बताती है। लेकिन मैं फ़ाइल सिस्टम प्रबंधन में बहुत गहराई तक नहीं जाना चाहता।
यह त्रुटि संदेश, अन्य सभी त्रुटि संदेशों की तरह, जो ऊपर लिखे गए तीन कारणों की वजह से हो सकता है, इसे STDERR से डिवाइस NUL2>nul
तक हैंडल से रीडायरेक्ट करके दबाया जाता है। ।
तीसरी कमांड, POPD , कमांड RD के निकास मान से स्वतंत्र रूप से निष्पादित की जाती है ।
POPD स्टैक से PUSHD द्वारा धक्का दिया निर्देशिका पथ को पॉप करता है और इस निर्देशिका को कमांड प्रक्रिया को चलाने के लिए वर्तमान निर्देशिका को बदलता है, अर्थात प्रारंभिक वर्तमान निर्देशिका को पुनर्स्थापित करता है। POPD UNC फ़ोल्डर पथ के मामले में PUSHD द्वारा बनाए गए अस्थायी ड्राइव अक्षर को हटा देता है ।
नोट: POPD चुपचाप प्रारंभिक वर्तमान निर्देशिका को पुनर्स्थापित करने में विफल हो सकती है यदि प्रारंभिक वर्तमान निर्देशिका साफ़ करने के लिए निर्देशिका की उपनिर्देशिका थी जो अब मौजूद नहीं है। इस विशेष मामले %PathToFolder%
में वर्तमान निर्देशिका बनी हुई है। इसलिए उपर्युक्त से अप्रत्यक्ष रूप से कमांड लाइन को चलाने की सलाह दी जाती है %PathToFolder%
।
एक और दिलचस्प तथ्य:
मैंने कमांड लाइन C:\Temp
को साझा नाम के साथ स्थानीय निर्देशिका को साझा Temp
करके UNC पथ का उपयोग करने की कोशिश की और विंडोज 7 पर \\%COMPUTERNAME%\Temp\CleanTest
पर्यावरण चर को सौंपा UNC पथ का उपयोग कर रहा है PathToFolder
। यदि कमांड लाइन चलाने पर वर्तमान निर्देशिका एक साझा स्थानीय का उपनिर्देशिका है UNC पथ का उपयोग करके एक्सेस किया गया फ़ोल्डर C:\Temp\CleanTest\Subfolder1
, Subfolder1
जिसे RD द्वारा हटा दिया गया है , और अगला POPDC:\Temp\CleanTest\Subfolder1
वर्तमान निर्देशिका को फिर से बनाने में चुपचाप विफल रहता है जिसके परिणामस्वरूपZ:\CleanTest
चालू कमांड प्रक्रिया के लिए वर्तमान निर्देशिका शेष है। इसलिए इसमें बहुत खास मामला अस्थायी ड्राइव अक्षर का रहता है जब तक कि वर्तमान निर्देशिका को उदाहरण के लिए नहीं बदला जाताcd /D %SystemRoot%
स्थानीय निर्देशिका में वास्तव में मौजूद है। दुर्भाग्यवश POPD0 से अधिक मूल्य के साथ बाहर नहीं निकलता है यदि यह प्रारंभिक वर्तमान निर्देशिका को पुनर्स्थापित करने में विफल रहता है, तो यह केवल पीओपीडी के निकास कोड का उपयोग करके इस बहुत ही विशेष त्रुटि स्थिति का पता लगाना असंभव है । हालांकि, यह माना जा सकता है कि कोई भी इस विशेष त्रुटि मामले में कभी नहीं चलता है क्योंकि आमतौर पर यूएनसी पथ स्थानीय फ़ाइलों और फ़ोल्डरों तक पहुंचने के लिए उपयोग नहीं किए जाते हैं।
उपयोग किए गए आदेशों को और भी बेहतर तरीके से समझने के लिए, कमांड प्रॉम्प्ट विंडो खोलें, वहां निम्नलिखित कमांड निष्पादित करें और प्रत्येक कमांड के लिए प्रदर्शित सहायता को बहुत सावधानी से पढ़ें।
विंडोज बैच फ़ाइल का उपयोग करने वाले कई कमांड के साथ सिंगल लाइन ऑपरेटरों को समझाता है &&
और &
यहां उपयोग किया जाता है।
अगला हमें बैच फ़ाइल समाधान आदेश का उपयोग पर नजर डालते हैं डेल में फ़ाइलों को हटाने के %PathToFolder%
और के लिए और आरडी में उप-फ़ोल्डर को हटाने के लिए %PathToFolder%
।
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Clean the folder for temporary files if environment variable
rem PathToFolder is not defined already outside this batch file.
if not defined PathToFolder set "PathToFolder=%TEMP%"
rem Remove all double quotes from folder path.
set "PathToFolder=%PathToFolder:"=%"
rem Consisted the folder path only of double quotes?
if not defined PathToFolder goto EndCleanFolder
rem Remove a backslash at end of folder path.
if "%PathToFolder:~-1%" == "\" set "PathToFolder=%PathToFolder:~0,-1%"
rem Consisted folder path only of a backslash (with one or more double quotes)?
if not defined PathToFolder goto EndCleanFolder
rem Delete all files in specified folder including files with hidden
rem or read-only attribute set, except the files currently opened by
rem a running process which prevents deletion of the file while being
rem opened by the application, or on which the current user has not
rem the required permissions to delete the file.
del /A /F /Q "%PathToFolder%\*" >nul 2>nul
rem Delete all subfolders in specified folder including those with hidden
rem attribute set recursive with all files and subfolders, except folders
rem being the current directory of any running process which prevents the
rem deletion of the folder and all folders above, folders containing a file
rem opened by the application which prevents deletion of the file and the
rem entire folder structure to this file, or on which the current user has
rem not the required permissions to delete a folder or file in folder tree
rem to delete.
for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul
:EndCleanFolder
endlocal
बैच फ़ाइल पहले यह सुनिश्चित करती है कि पर्यावरण चर PathToFolder
वास्तव में डबल उद्धरण के बिना और अंत में एक बैकस्लैश के बिना एक फ़ोल्डर पथ के साथ परिभाषित किया गया है। अंत में बैकस्लैश एक समस्या नहीं होगी, लेकिन एक फ़ोल्डर पथ में दोहरे उद्धरण समस्याग्रस्त हो सकते हैं क्योंकि PathToFolder
बैच फ़ाइल निष्पादन के दौरान अन्य तारों के साथ समाप्त हो जाता है।
महत्वपूर्ण दो लाइनें हैं:
del /A /F /Q "%PathToFolder%\*" >nul 2>nul
for /F "eol=| delims=" %%I in ('dir "%PathToFolder%\*" /AD /B 2^>nul') do rd /Q /S "%PathToFolder%\%%I" 2>nul
आदेश डेल निर्दिष्ट निर्देशिका में सभी फ़ाइलों को हटाने के लिए किया जाता है।
- विकल्प
/A
वास्तव में सभी फाइलों को संसाधित करने के लिए आवश्यक है जिसमें छिपी विशेषता के साथ फाइलें शामिल हैं जो विकल्प का उपयोग किए बिना DEL को अनदेखा करेगा /A
।
- विकल्प
/F
केवल-पढ़ने के लिए विशेषता सेट के साथ फ़ाइलों को हटाने के लिए आवश्यक है।
/Q
यदि उपयोगकर्ता वास्तव में कई फ़ाइलों को हटा दिया जाना चाहिए, तो उपयोगकर्ता को संकेत दिए बिना कई फ़ाइलों को शांत हटाने के लिए विकल्प आवश्यक है।
>nul
STDOUT डिवाइस NUL को हैंडल करने के लिए लिखे गए फ़ाइल नामों के आउटपुट को पुनर्निर्देशित करना आवश्यक है, क्योंकि वर्तमान में किसी फ़ाइल को खोला नहीं जा सकता है या उपयोगकर्ता के पास फ़ाइल को हटाने की कोई अनुमति नहीं है।
2>nul
प्रत्येक फ़ाइल के लिए त्रुटि संदेश आउटपुट को पुनर्निर्देशित करना आवश्यक है जिसे हैंडल से हटाया नहीं जा सकता है STDERR से डिवाइस NUL ।
निर्दिष्ट निर्देशिका में सभी उपनिर्देशिकाओं को हटाने के लिए आदेश और RD का उपयोग किया जाता है। लेकिन for /D
वजह से नहीं किया जाता है के लिए छिपा विशेषता सेट के साथ इस मामले उपनिर्देशिका में अनदेखी कर रहा है। उस वजह सेfor /F
लिए पृष्ठभूमि में शुरू की गई एक अलग कमांड प्रक्रिया में निम्न कमांड लाइन को चलाने के लिए उपयोग किया जाता है %ComSpec% /c
:
dir "%PathToFolder%\*" /AD /B 2>nul
DIR आउटपुट के /B
साथ निर्देशिका प्रविष्टियों के कारण नंगे प्रारूप में आउटपुट करता है D
, अर्थात किसी पथ के बिना छिपी विशेषता जैसे अन्य विशेषताओं पर स्वतंत्र निर्दिष्ट निर्देशिका में सभी उपनिर्देशिकाओं के नाम। DIR2>nul
द्वारा त्रुटि संदेश आउटपुट को पुनर्निर्देशित करने के लिए उपयोग किया जाता है STDERR से डिवाइस NUL को हैंडल करने पर कोई निर्देशिका नहीं मिली है ।
पुनर्निर्देशन ऑपरेटर >
कैरट चरित्र के साथ भाग जाना चाहिए, ^
, पर के लिए कमांड लाइन शाब्दिक वर्ण के रूप में व्याख्या की जा करने के लिए जब विंडोज कमांड दुभाषिया इस कमांड लाइन आदेश को क्रियान्वित करने से पहले प्रक्रियाओं के लिए जो एम्बेडेड कार्यान्वित dir
एक अलग आदेश की प्रक्रिया में कमांड लाइन शुरू कर दिया पृष्ठभूमि में।
के लिये प्रक्रियाओं पर कब्जा कर लिया उत्पादन को संभालने के लिए लिखा STDOUT एक शुरू कर दिया आदेश प्रक्रिया है जो पथ के बिना उपनिर्देशिका के नाम और डबल उद्धरण में संलग्न कभी नहीं कर रहे हैं।
के लिए विकल्प के साथ /F
खाली लाइनों जो के रूप में यहाँ नहीं होती है पर ध्यान नहीं देता DIR विकल्प के साथ /B
नहीं उत्पादन खाली लाइनों करता है।
के लिए एक अर्धविराम से शुरू होने वाली रेखाओं को भी नजरअंदाज कर दिया जाएगा जो कि पंक्ति वर्ण का डिफ़ॉल्ट अंत है। एक निर्देशिका नाम अर्धविराम से शुरू हो सकता है। उस कारण eol=|
से वर्टिकल बार कैरेक्टर को एंड-ऑफ-लाइन कैरेक्टर के रूप में परिभाषित करने के लिए उपयोग किया जाता है, जिसके नाम में कोई निर्देशिका या फ़ाइल नहीं हो सकती है।
के लिए परिसीमाओं के रूप में अंतरिक्ष और क्षैतिज टैब का उपयोग करके सबस्ट्रिंग में लाइन को विभाजित किया जाएगा और निर्दिष्ट पाश चर के लिए केवल पहला स्थान / टैब सीमांकित स्ट्रिंग असाइन करेगा I
। बंटवारे का यह व्यवहार यहां नहीं है क्योंकि निर्देशिका नाम में एक या अधिक स्थान हो सकते हैं। इसलिए delims=
रेखा बंटवारे के व्यवहार को अक्षम करने और लूप चर I
, हमेशा पूर्ण निर्देशिका नाम के लिए असाइन करने के लिए सीमांकक की एक खाली सूची को परिभाषित करने के लिए उपयोग किया जाता है ।
कमांड फॉर कमांड आरडी चलाता है एक रास्ता जो कारण है कि पर है बिना एक निर्देशिका के नाम के लिए आरडी कमांड लाइन फ़ोल्डर पथ फिर से एक बार निर्दिष्ट किया जाना चाहिए जो सबफ़ोल्डर नाम के साथ concatenated है।
उपयोग की गई कमांड को समझने के लिए और वे कैसे काम करते हैं, कमांड प्रॉम्प्ट विंडो खोलें, वहां निम्नलिखित कमांड निष्पादित करें, और प्रत्येक कमांड के लिए पूरी तरह से प्रदर्शित सभी सहायता पृष्ठों को बहुत सावधानी से पढ़ें।
del /?
dir /?
echo /?
endlocal /?
for /?
goto /?
if /?
rd /?
rem /?
set /?
setlocal /?