बैच स्क्रिप्ट में rmdir कमांड को चलाने के दौरान "निर्देशिका खाली नहीं है" त्रुटि को हल करने के लिए कैसे?


92

मैं एक बैच स्क्रिप्ट बना रहा हूं और स्क्रिप्ट का एक हिस्सा एक निर्देशिका और उसके सभी उप-निर्देशिकाओं को हटाने की कोशिश कर रहा है। मुझे एक उप-निर्देशिका खाली नहीं होने के बारे में एक आंतरायिक त्रुटि मिल रही है। मैंने अपराधी होने के बारे में एक लेख पढ़ा। मैंने WSearch को अक्षम कर दिया था, लेकिन मुझे अंततः त्रुटि फिर से मिल गई। यहाँ आदेश है:

rmdir /S /Q "C:\<dir>\"

क्या मैं उन फ़ाइलों के प्रकार के बारे में कुछ जानकारी पूछ सकता हूं जिनके बारे में विंडोज़ आपको सचेत करती है? मेरे लिए, यह केवल पीडीएफ फाइलों के साथ होता है जब मैं उन्हें स्थानांतरित / कॉपी करता हूं।
जेक स्टीवंस-हास

जवाबों:


87

मैंने उन्हीं मुद्दों का अनुभव किया जैसा कि हैरी जॉनसन ने उल्लेख किया है। rmdir /s /qशिकायत करेंगे कि एक निर्देशिका खाली नहीं थी, भले ही /sआप के लिए खाली करने का मतलब है! मुझे लगता है कि यह व्यक्तिगत रूप से विंडोज में एक बग है।

delनिर्देशिका को हटाने से पहले निर्देशिका में मेरा सब कुछ है:

del /f /s /q mydir 1>nul
rmdir /s /q mydir

( क्योंकि, अन्यथा 1>nulके मानक उत्पादन को छुपाता है del, यह हर एक फ़ाइल को हटाता है जिसे सूचीबद्ध करता है।)


मैं एक ऐसे परिदृश्य में भाग गया जहाँ कुछ उप निर्देशिकाओं mydirने "खाली नहीं" त्रुटि का उत्पादन किया। तो मैं ही था cdमें mydirऔर प्रदर्शन delउन निर्देशिकाओं में से प्रत्येक के रूप में अच्छी तरह फाइलों पर। अंतत: यह काम कर गया, लेकिन अगर मुझे तीसरी बार किसी अन्य उपशीर्ष में प्रक्रिया को दोहराना पड़ा होता, तो मुझे लगता है कि वह हार गया है।
गफलम

@gfullam जहां तक ​​मुझे याद है, मेरी विधि को किसी भी गहराई के लिए पुनरावर्ती उपनिर्देशिका पर भी काम करना चाहिए। वही del /sकरता है।
बोफिनब्रेन

एक्सप्लोरर का उपयोग करना (शायद mkdir => NO!), एक फ़ोल्डर जोड़कर (और नाम बदलकर) केवल rd /s /q mydirकमांड का उपयोग करके हटाने का कार्य समाप्त करें ।
मास्टर डीजेऑन

1
ठीक है, मुझे लगता है कि खिड़कियों को हटाना और लिनक्स पर जाना इस दर्द की तुलना में बहुत आसान है :)
रजनीशकोडर

1
@ रजनीशकोडर विंडोज के साथ रहना मूल रूप से वर्कअराउंड की दुनिया है। यह विशेष मुद्दा विंडोज 10 के साथ अन्य समस्याओं की तुलना में कुछ भी नहीं है!
बोफिनब्रेन

46

मैं इस समस्या से परिचित हूं। सबसे सरल वर्कअराउंड ऑपरेशन को सशर्त रूप से दोहराना है। मैंने कभी भी इसे लगातार दो बार विफल नहीं देखा है - जब तक कि वास्तव में एक खुली फ़ाइल या एक अनुमति मुद्दा नहीं है, जाहिर है!

rd /s /q c:\deleteme
if exist c:\deleteme rd /s /q c:\deleteme

11
पवित्रा मौली, यह कोई मतलब नहीं अभी तक यह काम किया है। क्या #!%#@! microsoft
सैम B

IF EXISTछुपाता है Access is deniedऔर अन्य स्थितियों। मैंने DIR c:\deletemeसब कुछ करने से पहले कुछ की तरह जाँच और इरोस जाँच को जोड़ा है ।
it3xl

उपनिर्देशिका या अन्यथा ब्राउज़िंग में विंडोज़ एक्सप्लोरर खुला होने से यह लगातार दो बार विफल होता है। तो यह सुनिश्चित करें कि आप इसे तीसरी बार पूछें (जो वास्तव में काम किया है)
जेक स्टीवंस-हास

वास्तव में यह है कुछ भी खुला है या एक अनुमतियाँ मुद्दा बिना मेरे लिए एक पंक्ति में दो बार हुई। मेरा रिकॉर्ड सात बार है। @ BoffinbraiN के दृष्टिकोण की सिफारिश करें।
जेक स्टीवंस-हास


20

मुझे बस एक ही समस्या का सामना करना पड़ा और इसे कुछ फाइलों के खो जाने या दूषित होने के साथ करना पड़ा। समस्या को ठीक करने के लिए, बस चेक डिस्क चलाएं:

chkdsk /F e:

यह खोज विंडो बॉक्स से या किसी cmd प्रॉम्प्ट से चलाया जा सकता है। /Fकिसी भी मुद्दे यह पाता है, फ़ाइलों को उबरने की तरह ठीक करता है। एक बार जब यह चालू हो जाता है, तो आप सामान्य की तरह फ़ाइलों और फ़ोल्डरों को हटा सकते हैं।


बिल्कुल सही, मैं आधे घंटे से कोशिश कर रहा था
t

इससे मेरे फ़ोल्डर में कुछ छिपी हुई फाइलें मिलीं, जिन्हें तब मैं हटा सकता था। वास्तव में बुरा 😑
मारो

7

मुझे एक समान समस्या थी, विंडोज़ एक्सप्लोरर के माध्यम से एक खाली फ़ोल्डर को हटाने की कोशिश की। मुझे खाली त्रुटि नहीं दिखाई दी, इसलिए मैंने सोचा कि मैं इसे व्यवस्थापक cmd के माध्यम से आज़माता हूं, लेकिन यहां किसी भी उत्तर ने मदद नहीं की।

मैं खाली फ़ोल्डर में एक फ़ाइल ले जाने के बाद। मैं गैर खाली फ़ोल्डर को हटाने में सक्षम था


1
कृपया इसे टिप्पणी में लिखें।
वीरबल

दिलचस्प। शायद ओपी परिदृश्य के लिए प्रासंगिक नहीं है, हालांकि।
हैरी जॉनसन

पवित्र मोली, यह शाब्दिक एकमात्र ऐसा विचार था जो इन सभी अन्य समाधानों का काम करता था!
Seega

3

जैसा कि @gfullam ने @ BoffinbraiN के उत्तर में एक टिप्पणी में कहा है, <dir>आप खुद को हटा रहे हैं वह नहीं हो सकता है जिसमें फ़ाइलें हैं: इसमें उपनिर्देशिकाएँ हो सकती हैं <dir>"संदेश रिक्त नहीं है" संदेश प्राप्त करें और केवल तब ही होगा पुनरावर्ती निर्देशिकाओं पर पुनरावृत्ति, मैन्युअल रूप से उनकी सभी युक्त फ़ाइलों को हटा रहा है ... मैंने rmUNIX के एक पोर्ट का उपयोग करने का निर्णय लिया । rm.exeGit Bash, MinGW, Cygwin, GnuWin32 और अन्य के साथ आता है। आपको बस अपने पैथ निर्देशिका में अपनी पैरेन्ट्री निर्देशिका की आवश्यकता है और फिर जैसे ही आप एक यूनिक्स प्रणाली में निष्पादित करेंगे।

बैच स्क्रिप्ट उदाहरण:

set PATH=C:\cygwin64\bin;%PATH%
rm -rf "C:\<dir>"

2

मेरे लिए जो काम किया वह निम्नलिखित है। मुझे ऐसा प्रतीत होता है कि RMDir कमांड "निर्देशिका खाली नहीं है" लगभग हर समय जारी करेगा ...

:Cleanup_Temporary_Files_and_Folders

Erase /F /S /Q C:\MyDir

RMDir /S /Q C:\MyDir
If  Exist  C:\MyDir  GoTo Cleanup_Temporary_Files_and_Folders

2

मेरे पास "C: \ Users \ User Name \ OneDrive \ Fonts" था, जो कि "C: \ Windows \ Fonts" के लिए mklink'ed (/ D) था, और मुझे भी यही समस्या मिली। मेरे मामले में

cd "C: \ Users \ उपयोगकर्ता नाम \ OneDrive"

rd / s फ़ॉन्ट्स

वाई (कार्रवाई की पुष्टि करने के लिए)

मेरी मदद की। मुझे आशा है, कि यह आपकी भी मदद करता है;


2
बैच चलाते समय पुष्टि की आवश्यकता से बचने के लिए / q जोड़ें।
जोनाथन रोज़ेने

1

Im मेरा मामला मैं सिर्फ इतना निर्देशिका निर्देशिका रूट करने के लिए ले जाया गया।

move <source directory> c:\

और फिर डायरेक्टरी को हटाने के लिए कमांड चलाया

rmdir c:\<moved directory> /s /q

2
rmdir c:\<moved directory> /s /qइसका सही उत्तर है
लालनगुआ

1
यह सही उत्तर नहीं है। रूट में किसी फ़ोल्डर को हटाने से समान संदेश हो सकते हैं: फ़ोल्डर खाली नहीं है।
गंगानुस

मुझे पता है कि यह एक पुराना धागा है। बस यह कहना चाहता था कि यह मेरे लिए काम करता है ...
मैनुअल रिवेरा

1

rd /sकुछ फ़ाइलों को हटाने के लिए कारण को अस्वीकार करने के लिए सबसे अधिक संभावना है क्योंकि निर्देशिका में फ़ाइलों पर फ़ाइल विशेषताएँ हैं।

इसे ठीक करने का उचित तरीका, यह सुनिश्चित करना है कि आप पहले सभी फाइलों पर मौजूद विशेषताओं को रीसेट कर दें:

attrib -r %directory% /s /d
rd /s %directory%

कुछ अन्य हो सकते हैं जैसे छिपी हुई या सिस्टम फाइलें, इसलिए यदि आप इसे सुरक्षित खेलना चाहते हैं:

attrib -h -r -s %directory% /s /d
rd /s %directory%

0

हैरी जॉन्सटन के जवाब के समान, मैं तब तक लूप करता हूं जब तक यह काम नहीं करता।

set dirPath=C:\temp\mytest
:removedir
if exist "%dirPath%" (
    rd /s /q "%dirPath%" 
    goto removedir
)

0

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

robocopy - cmd copy utility

/copyall - copies everything
/mir deletes item if there is no such item in source a.k.a mirrors source with
destination
/b works around premissions shenanigans

इस तरह से रिक्त dir बनाएँ:

mkdir empty

खाली फ़ोल्डर को इस तरह से ओवरराइट करें:

robocopy /copyall /mir /b empty broken

और फिर उस फ़ोल्डर को हटा दें

rd broken /s
rd empty /s

यदि यह मदद नहीं करता है, तो पुनः आरंभ करने पर क्लिक करके शिफ्ट पकड़कर "रिकवरी मोड में कमांड प्रॉम्प्ट" के साथ पुनर्प्राप्ति मोड में इन कमांड को चलाने की कोशिश करें।


हां, मुझे लगता है कि रोबोकॉपी ओपी परिदृश्य में काम करेगी, क्योंकि यह स्वचालित रूप से विफल संचालन को पीछे हटा देती है। आप संभवतः /W:0अनावश्यक देरी से बचने के लिए निर्दिष्ट करना चाहते हैं । आप शायद /bइसलिए नहीं चाहते क्योंकि इसके लिए प्रशासनिक विशेषाधिकार चाहिए। पुनर्प्राप्ति मोड इस प्रश्न के लिए प्रासंगिक नहीं है, क्योंकि हम एक बैच स्क्रिप्ट के बारे में बात कर रहे हैं, न कि कोई व्यक्ति मैन्युअल रूप से एक निर्देशिका को हटाने की कोशिश कर रहा है।
हैरी जॉनसन

-1

मैं निम्नलिखित संभावित कारणों के बारे में सोच सकता हूं:

  1. ऐसी फाइलें या उपनिर्देशिकाएँ हैं, जिन्हें उच्च अनुमतियों की आवश्यकता होती है
  2. केवल WSearch द्वारा ही नहीं, बल्कि शायद आपके वायरस स्कैनर या अन्य किसी चीज़ के उपयोग में भी फाइलें हैं

1.) आप कोशिश कर सकते हैं runas /user:Administrator उच्चतर विशेषाधिकार प्राप्त करने या संदर्भ मेनू के माध्यम से व्यवस्थापक के रूप में बैच फ़ाइल शुरू करने के लिए । यदि वह मदद नहीं करता है, तो शायद व्यवस्थापक के पास भी अधिकार नहीं है। फिर आपको निर्देशिका का स्वामित्व संभालने की आवश्यकता है।

2 के लिए) प्रक्रिया एक्सप्लोरर डाउनलोड करें , क्लिक करें Find/Find handle or DLL...या दबाएं Ctrl+F, निर्देशिका का नाम टाइप करें और पता करें कि इसका उपयोग कौन करता है। यदि संभव हो तो निर्देशिका का उपयोग करने वाले एप्लिकेशन को बंद करें।


मशीनों में व्यवस्थापक खाता अक्षम है। मैं एडमिन ग्रुप में हूं लेकिन मुझे एडमिनिस्ट्रेटर के पासवर्ड की कोई जानकारी नहीं है। अनुमति मुद्दे के आसपास पाने के लिए कोई अन्य सुझाव? किसी ने बैच (जैसे vba) से दूसरे कार्यक्रम को कॉल करने का उल्लेख किया।
तबाही

@ मय्यम: आसपास की अनुमति प्राप्त करना काफी कठिन है ... हमें विंडोज में बग के लिए एक पासवर्ड के बिना एक शोषण की आवश्यकता होगी।
और मुझे यकीन है कि मैं
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.