Як вирішити помилку "Каталог не порожній" під час запуску команди rmdir у пакетному сценарії?


92

Я створюю пакетний сценарій, і частина сценарію намагається видалити каталог та всі його підкаталоги. Я отримую періодичну помилку про те, що підкаталог не порожній. Я прочитав одну статтю про те, що винуватцем є індексація. Я вимкнув WSearch, але врешті-решт помилку отримав знову. Ось команда:

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

Чи можу я запитати деяку інформацію про тип файлів, про які Windows вас попереджає? Для мене це відбувається лише з файлами PDF незабаром після того, як я їх переміщую / копіюю.
Jake Stevens-Haas

Відповіді:


87

Я відчував ті самі проблеми, про які згадував Гаррі Джонстон. rmdir /s /qпоскаржився б, що каталог не був порожнім, хоча /sвін призначений зробити спорожнення за вас! Я думаю, що це помилка в Windows, особисто.

Моє обхідне рішення полягає у delвсьому, що знаходиться в каталозі, перед тим, як видалити сам каталог:

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

( 1>nulПриховує стандартний вивід, delоскільки в іншому випадку він перераховує кожен окремий файл, який видаляє.)


Я зіткнувся зі сценарієм, коли деякі підкаталоги всередині mydirвидавали ту саму помилку "не пусто". Так що мені довелося cdв mydirі виконувати delнад файлами в кожному з цих каталогів , а також. Зрештою це спрацювало, але якби мені довелося повторити процес втретє на іншому підрівні, я відчув би себе досить переможеним.
gfullam

@gfullam Наскільки я пам’ятаю, мій метод повинен працювати на рекурсивних підкаталогах, на будь-яку глибину. Ось що del /sробить.
BoffinBrain

Використовуючи провідник (можливо, також mkdir => НІ!), Додавши папку (і змінивши ім'я), завершіть роботу з видалення, використовуючи лише rd /s /q mydirкоманду.
Master DJon

1
Гаразд, я думаю, що видалити вікна та перейти на Linux набагато простіше, ніж цей біль :)
RajnishCoder

1
@RajnishCoder Життя з Windows - це, в основному, світ обхідних шляхів. Ця конкретна проблема ніщо в порівнянні з іншими проблемами з Windows 10!
BoffinBrain

46

Я знайома з цією проблемою. Найпростішим обхідним шляхом є умовне повторення операції. Я ніколи не бачив, щоб він провалювався двічі поспіль - окрім випадків, коли насправді існує відкритий файл або проблема з дозволами!

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

11
свята моллі, це не має сенсу, поки це спрацювало. Що за #!%#@! microsoft
Sam B

IF EXISTприховує Access is deniedта інші ситуації. Я додав DIR c:\deletemeщось подібне та перевірку помилок перед усім.
it3xl

Відкриття провідника Windows у підкаталозі або інший перегляд призводить до того, що це не вдається двічі поспіль. Тож переконайтеся, що ви запитуєте це втретє (що насправді спрацювало)
Джейк Стівенс-Хаас,

На насправді це вже двічі відбувалося в ряд для мене без нічого відкритого або видачі дозволів. Мій рекорд - сім разів. Рекомендуйте підхід @ BoffinbraiN.
Джейк Стівенс-Хаас,


20

Я просто зіткнувся з тією ж проблемою, і це пов’язано з втратою чи пошкодженням деяких файлів. Щоб виправити проблему, просто запустіть перевірочний диск:

chkdsk /F e:

Це можна запустити з вікна пошуку вікна або з підказки cmd. /FВиправляє будь-які проблеми , які він знаходить, як відновлення файлів. Після завершення роботи ви можете видалити файли та папки, як зазвичай.


Прекрасно, я намагався з півгодини
trex

Це знайшло кілька прихованих файлів у моїй папці, які потім я зміг видалити. Дійсно неприємно 😑
бив

7

У мене була подібна проблема, я намагався видалити порожню папку через провідник Windows. Показав мені не пусту помилку, тому я подумав, що спробую її через адмін cmd, але жодна з відповідей тут не допомогла.

Після того, як я перемістив файл у порожню папку. Мені вдалося видалити непусту папку


1
Будь ласка, напишіть це в коментарі.
Вірб,

Цікаво. Однак, можливо, це не стосується сценарію операційних програм.
Harry Johnston

Святий молі, це буквально єдина думка, яка спрацювала з усіх цих інших рішень!
Seega

3

Як зазначив @gfullam у коментарі до відповіді @ BoffinbraiN, саме те, що <dir>ви видаляєте, може бути не тим, що містить файли: в них можуть бути підкаталоги, <dir>які отримують повідомлення "Каталог не порожній", і єдиним рішенням тоді буде рекурсивно перебирати каталоги, видаляючи вручну всі файли, що їх містять ... Я в підсумку вирішив використовувати порт rmз UNIX. rm.exeпоставляється з Git Bash, MinGW, Cygwin, GnuWin32 та іншими. Вам просто потрібно мати його батьківський каталог у вашому PATH, а потім виконати, як і в системі UNIX.

Приклад пакетного сценарію:

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 \ Ім'я користувача \ OneDrive \ Шрифти", який був mklink'ed (/ D) до "C: \ Windows \ Fonts", і я отримав ту ж проблему. У моєму випадку

cd "C: \ Users \ Ім'я користувача \ OneDrive"

rd / s шрифти

Y (для підтвердження дії)

мені допомогли. Я сподіваюся, що це допоможе і вам; D


2
Додати / q, щоб уникнути необхідності підтвердження під час запуску пакета.
Джонатан Розен

1

У моєму випадку я просто перемістив папку до кореневого каталогу приблизно так.

move <source directory> c:\

А потім запустив команду на видалення каталогу

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

2
rmdir c:\<moved directory> /s /qце правильна відповідь
lalengua

1
Це НЕ правильна відповідь. видалення папки в кореневій папці може спричинити ті самі повідомлення: папка не порожня.
Gangnus

Я знаю, що це стара тема. Просто хотів сказати, що це спрацювало для мене ...
Мануель Рівера

1

Причина rd /sвідмови у видаленні певних файлів, швидше за все, пов’язана з атрибутами файлів READONLY у файлах каталогу.

Правильний спосіб виправити це - переконатися, що спочатку скинули атрибути всіх файлів:

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

Windows іноді "розбита за дизайном", тому вам потрібно створити порожню папку, а потім дзеркально відобразити "розбиту папку" з "порожньою папкою" в режимі резервного копіювання.

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

Створити порожній каталог так:

mkdir empty

перезаписати розбиту папку порожньою так:

robocopy /copyall /mir /b empty broken

а потім видаліть цю папку

rd broken /s
rd empty /s

Якщо це не допомогло, спробуйте перезапустити в "режимі відновлення за допомогою командного рядка", утримуючи клавішу Shift, натискаючи кнопку перезапуску, і спробуйте знову запустити цю команду в режимі відновлення.


Так, я думаю, що Robocopy працювала б у сценарії OP, оскільки вона автоматично повторює невдалі операції. Можливо, ви хочете вказати, /W:0щоб уникнути зайвих затримок. Можливо, ви не захочете, /bоскільки для цього потрібні адміністративні привілеї. Режим відновлення не має відношення до цього питання, оскільки ми говоримо про пакетний сценарій, а не про те, що хтось вручну намагається видалити каталог.
Гаррі Джонстон,

-1

Я можу думати про такі можливі причини:

  1. є файли або підкаталоги, які потребують вищих дозволів
  2. використовуються файли, не тільки WSearch, але, можливо, і ваш антивірусний сканер, або щось інше

Для 1.) ви можете спробувати runas /user:Administratorотримати більш високі привілеї або запустити пакетний файл як адміністратор через контекстне меню. Якщо це не допомагає, можливо, навіть адміністратор не має прав. Тоді вам потрібно взяти на себе право власності на каталог.

Для 2.) завантажте Process Explorer , клацніть Find/Find handle or DLL...або натисніть Ctrl+F, введіть назву каталогу та з’ясуйте, хто його використовує. Закрийте програму, яка використовує каталог, якщо це можливо.


На машинах вимкнено обліковий запис адміністратора. Я в адміністративній групі, але не знаю пароля адміністратора. Будь-які інші пропозиції, як обійти проблему дозволу? Хтось згадував виклик іншої програми з пакета (наприклад, vba).
Mayhem

@Mayhem: обійти дозволи досить складно ... Напевно, нам знадобиться експлойт для помилки в Windows, щоб зробити це без пароля.
і я впевнений, що мені не вистачає
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.