Как решить ошибку «Каталог не пустой» при запуске команды rmdir в пакетном скрипте?

92

Я создаю пакетный сценарий, и часть сценария пытается удалить каталог и все его подкаталоги. Я периодически получаю сообщение о том, что подкаталог не пуст. Я прочитал одну статью о том, что виновато индексирование. Я отключил WSearch, но в конце концов снова получил ошибку. Вот команда:

rmdir /S /Q "C:\<dir>\"
Погром
источник
Могу я спросить некоторую информацию о типах файлов, о которых Windows предупреждает? Для меня это происходит только с файлами PDF вскоре после их перемещения / копирования.
Джейк Стивенс-Хаас

Ответы:

88

Я испытал те же проблемы, о которых упоминал Гарри Джонстон. rmdir /s /qбудет жаловаться, что каталог не пуст, хотя /sон предназначен для очистки за вас! Лично я считаю, что это ошибка Windows.

Мое решение - delвсе в каталоге перед удалением самого каталога:

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

( 1>nulСкрывает стандартный вывод, delпотому что в противном случае он перечисляет каждый файл, который он удаляет.)

BoffinBrain
источник
Я столкнулся со сценарием, когда некоторые подкаталоги внутри mydirвыдавали ту же ошибку «не пусто». Так что мне пришлось cdв mydirи выполнять delнад файлами в каждом из этих каталогов , а также. В конечном итоге это сработало, но если бы мне пришлось повторить процесс в третий раз на другом подуровне, я бы почувствовал себя довольно побежденным.
gfullam
@gfullam Насколько я помню, мой метод должен работать и с рекурсивными подкаталогами, любой глубины. Вот что del /sзначит.
BoffinBrain
Используя проводник (возможно, также mkdir => NO!), Добавив папку (и изменив имя), завершите удаление, используя только rd /s /q mydirкоманду.
Master DJon
1
Хорошо, я думаю, что удалить окна и перейти на Linux намного проще, чем эта боль :)
RajnishCoder
1
@RajnishCoder Жизнь с Windows - это, по сути, мир обходных путей. Эта проблема ничто по сравнению с другими проблемами Windows 10!
BoffinBrain
47

Я знаком с этой проблемой. Самый простой обходной путь - условно повторить операцию. Я никогда не видел, чтобы он выходил из строя дважды подряд - если на самом деле нет открытого файла или проблемы с разрешениями, очевидно!

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.
Джейк Стивенс-Хаас,
Я запустил только первую команду. Затем щелкните папку правой кнопкой мыши> «Свойства»> «Снимите флажок с атрибута« Только для чтения »»> «Применить». Виола !, папка окончательно исчезла.
steven7mwesigwa
21

введите командную строку от имени администратора и запустите

rmdir /s <FOLDER>
Адилсон Кабрал
источник
2
Это не отличается от того, что делал OP.
Гарри Джонстон
20

Я только что столкнулся с той же проблемой, и это было связано с потерей или повреждением некоторых файлов. Чтобы исправить проблему, просто запустите check disk:

chkdsk /F e:

Это можно запустить из окна поиска или из командной строки. /FИсправляет любые проблемы , которые он находит, как восстановление файлов. После завершения работы вы можете удалить файлы и папки как обычно.

Джроуз
источник
Отлично, я пытался так получаса
Trex
В моей папке были обнаружены скрытые файлы, которые я затем удалил. Really nasty 😑
победить
7

У меня была аналогичная проблема, пытался удалить пустую папку через проводник Windows. Показал мне непустую ошибку, поэтому я подумал, что попробую через admin cmd, но ни один из ответов здесь не помог.

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

Грису118
источник
1
Напишите, пожалуйста, в комментарии.
Вирб
Интересно. Однако, вероятно, не имеет отношения к сценарию OP.
Гарри Джонстон
Боже мой, это была буквально единственная мысль, которая сработала из всех остальных решений!
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>"
Gobe
источник
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
user7432246
источник
2

У меня был «C: \ Users \ User Name \ OneDrive \ Fonts», который был 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
)
BuvinJ
источник
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, чтобы сделать это без пароля.
Томас Веллер