Как удалить файлы / подпапки в определенном каталоге в командной строке в Windows

258

Скажем, есть переменная с именем %pathtofolder%, так как она ясно показывает, что это полный путь к папке.

Я хочу удалить каждый отдельный файл и подпапку в этом каталоге, но не сам каталог.

Но может возникнуть ошибка, например, "этот файл/папка уже используется"... когда это произойдет, оно должно просто продолжить и пропустить этот файл/папку.

Может ли кто-нибудь дать мне команду для этого?

  • 0
    Возможный дубликат того, что когда-либо случалось с дельтри, и что его заменяет?
  • 0
    Это безумие, как трудно в Windows удалить папки ... Или создать папку, начинающуюся с точки ... Слава богу за интеграцию Bash в Windows! rm -rf path\to\folder работает в Windows 10 (или может прийти из Git Bash ... в любом случае, если у вас есть такая попытка!)
Теги:
batch-file
cmd
file-io
folder

15 ответов

202
Лучший ответ

Вы можете использовать эту оболочку script для очистки папки и файлов в C:\Temp источнике:

del /q "C:\Temp\*"
FOR /D %%p IN ("C:\Temp\*.*") DO rmdir "%%p" /s /q

Создайте командный файл (скажем, delete.bat), содержащий указанную выше команду. Перейдите в папку, где находится файл delete.bat, а затем запустите команду: delete.bat

  • 20
    Я пробовал, но, к сожалению, файлы, которые не были удалены, удаляются только подпапки. Например, у меня есть папка с именем Test. Он содержит 2 папки с именами «Ripon» и «Wasim» и содержит файл с именем «riponalwasim.txt». Подпапки Ripon и Wasim были удалены, но riponalwasim.txt не был удален.
  • 13
    Используйте одиночный знак процента, если вы хотите запустить напрямую из командной строки, например %p
Показать ещё 9 комментариев
266

rmdir - моя любимая команда во все времена для задания. Он работает для удаления огромных файлов и папок с подпапками. Резервная копия не создается, поэтому перед выполнением этой команды убедитесь, что вы скопировали файлы.

RMDIR "FOLDERNAME" /S /Q

Это тихо удаляет папку и все файлы и подпапки.

  • 46
    Похоже, это удаляет путь к каталогу, который ОП хотел сохранить.
  • 1
    Это приведет к удалению самой папки, поэтому вам нужно добавить еще одну команду: md FOLDERNAME (см. Ответ от @rakoczyn ниже).
Показать ещё 5 комментариев
78

Самое простое решение, о котором я могу думать, - удалить весь каталог с помощью

RD /S /Q folderPath

Затем снова создайте этот каталог:

MD folderPath
  • 4
    Что делать, если у вас есть разрешение на удаление, но не создание новых папок? Я надеюсь, что это возможно :)
  • 12
    Это плохое решение, поскольку оно приводит к гонке в файловой системе за узел каталога, т. Е. Вторая команда может завершиться ошибкой, если выполняется сразу после нее.
Показать ещё 3 комментария
47

Это позволит удалить папки и файлы и оставить папку позади.

pushd "%pathtofolder%" && (rd /s /q "%pathtofolder%" 2>nul & popd)
  • 2
    Для тех, кто не уверен в этом подходе: он определенно не создает каталог заново. Без 2>nul выводит «Процесс не может получить доступ к файлу, потому что он используется другим процессом».
  • 4
    Я ненавижу, что Windows не может удалить файлы и папки, используемые какой-либо программой. И мне нравится, что вы использовали это в свою пользу в этой строчке.
Показать ещё 4 комментария
34
@ECHO OFF

Set dir=path-to-dir

Echo Deleting all files from %dir%
del %dir%\* /F /Q

Echo Deleting all folders from %dir%
for /d %%p in (%dir%\*) Do rd /Q /S "%%p"
@echo Folder deleted.


exit

... удаляет все файлы и папки под данным каталогом, но не сам каталог.

  • 2
    это должен быть правильный ответ .. просто сделайте простой .. deletemyfoldercontents.bat файл .. поп на вашем пути, и он работает как шарм ..
  • 0
    Это то, что я искал, большое спасибо ...
Показать ещё 4 комментария
21
CD [Your_Folder]
RMDIR /S /Q .

Вы получите сообщение об ошибке, сообщите, что команда RMDIR не может получить доступ к текущей папке, поэтому она не может ее удалить.

Обновление:

Из этого полезного комментария (спасибо Moritz Both) вы можете добавить && между ними, поэтому RMDIR не будет работать, если команда CD завершится неудачно (например, неверное имя каталога):

CD [Your_Folder] && RMDIR /S /Q .

Из справочной системы Windows:

/S: Удаляет дерево каталогов (указанный каталог и все его подкаталоги, включая все файлы).

/Q: задает тихий режим. Не запрашивает подтверждение при удалении дерева каталогов. (Заметим, что /q работает, только если задано /s.)

  • 1
    Это идеально подходит для очистки temp, но этот cd [Your_Folder] очень важен - я должен помнить об этом, чтобы не удалять сам каталог ...
  • 5
    Это правильное решение. Добавьте && между командами вместо разрыва строки, и вы в безопасности от сбойного CD.
Показать ещё 2 комментария
8

RD означает REMOVE Directory.

/S: удаление всех файлов и подпапок        в дополнение к самой папке.        Используйте это, чтобы удалить все дерево папок.

/Q: Тихо - не отображать подтверждение YN

Пример:

RD /S /Q C:/folder_path/here
  • 1
    проголосовал за то, что был единственным, кто объяснил, что означают /S и /Q
  • 2
    Нет. rd эквивалентен rmdir и удаляет сам каталог, а не то, что хочет OP.
6

Я использую Powershell

Remove-Item c:\scripts\* -recurse

Он удалит содержимое папки, а не папку.

  • 0
    Ответ rhellem недавно, но это единственный ответ, который действительно сделает это для меня. (Win 8.1, не по выбору)
  • 1
    Из командной строки пакета: powershell -Command "Remove-Item 'PathToMyDirectory\*' -Recurse -Force"
4

Используйте блокнот для создания текстового документа и скопируйте/вставьте его:

rmdir /s/q "%temp%"
mkdir "%temp%"

Выберите сохранение как, Имя файла:

delete_temp.bat

Сохранить как тип: Все файлы и нажмите кнопку "Сохранить".

Работайте с любым видом аккаунта (администратором или стандартным пользователем), просто запустите его! Я использую переменную temp в этом примере, но вы можете использовать любой другой! постскриптум Только для ОС Windows!

4

Вы можете выполнить следующую команду, чтобы удалить все содержимое и родительскую папку:

RMDIR [/S] [/Q] [drive:]path            
  • 7
    Эта команда удаляет саму папку.
  • 0
    @Baz: вы правы. Извините за мою ошибку. Я исправил это
3

Ни один из ответов, отправленный в 2018-06-01, за исключением единственной командной строки, опубликованной foxidrive, действительно удалил все файлы и все папки/каталоги в %PathToFolder%. Это причина для отправки еще одного ответа с помощью простой простой командной строки для удаления всех файлов и подпапок папки, а также пакетного файла с более сложным решением, объясняющим, почему все остальные ответы, опубликованные в 2018-06-01, используя DEL и FOR с RD не удалось полностью очистить папку.


Простое решение одной командной строки, которое, конечно же, можно использовать и в пакетном файле:

pushd "%PathToFolder%" 2>nul && ( rd /Q /S "%PathToFolder%" 2>nul & popd )

Эта командная строка содержит три команды, выполняемые один за другим.

Первая команда PUSHD подталкивает текущий путь к каталогу в стеке, а затем делает %PathToFolder% текущим каталогом для запуска командного процесса.

Это работает также для UNC- путей по умолчанию из-за того, что расширения команд включены по умолчанию, и в этом случае PUSHD создает временную букву диска, которая указывает на указанный сетевой ресурс, а затем изменяет текущий диск и каталог, используя новую букву диска.

PUSHD выводит следующее сообщение об ошибке для обработки STDERR, если указанный каталог вообще не существует:

Система не может найти указанный путь.

Это сообщение об ошибке подавляется перенаправлением его с помощью 2>nul на устройство NUL.

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

Команда RD с параметрами /Q и /S спокойно удаляет каталог со всеми подкаталогами, даже если указанный каталог содержит файлы или папки со скрытым атрибутом или с атрибутом только для чтения. Системный атрибут никогда не предотвращает удаление файла или папки.

Не удалены:

  1. Папки, используемые в качестве текущего каталога для любого запущенного процесса. Полное дерево папок для такой папки не может быть удалено, если папка используется в качестве текущего каталога для любого запущенного процесса.

  2. Файлы, открываемые в настоящий момент любым запущенным процессом с разрешениями доступа к файлам, установленными в файле, открываются для предотвращения удаления файла при открытии запущенного приложения/процесса. Такой открытый файл предотвращает также удаление всего дерева папок в открытый файл.

  3. Файлы/папки, на которых у текущего пользователя нет необходимых (NTFS) разрешений для удаления файла/папки, который также предотвращает удаление дерева папок в этот файл/папку.

Первая причина не удалять папку используется этой командной строкой для удаления всех файлов и подпапок указанной папки, но не самой папки. Папка временно создается в текущем каталоге для запуска командного процесса, который предотвращает удаление самой папки. Конечно, это приводит к выходу сообщения об ошибке командой RD:

Процесс не может получить доступ к файлу, поскольку он используется другим процессом.

Файл здесь является неправильным термином, так как в реальной папке используется другой процесс, текущий командный процесс, который выполнял команду RD. Ну, в реальной папке для файловой системы есть специальный файл с файловым каталогом атрибутов, который объясняет это сообщение об ошибке. Но я не хочу углубляться в управление файловой системой.

Это сообщение об ошибке, как и все другие сообщения об ошибках, которые могут возникнуть из-за трех причин, описанных выше, подавляется перенаправлением его с помощью 2>nul от дескриптора STDERR к устройству NUL.

Третья команда POPD выполняется независимо от значения выхода команды RD.

POPD выдает путь к каталогу, выталкиваемый PUSHD из стека, и изменяет текущий каталог для запуска процесса обработки в этот каталог, то есть восстанавливает начальный текущий каталог. POPD удаляет временную букву диска, созданную PUSHD, в случае пути UNC-папки.

Примечание. POPD может без проблем восстановить исходный текущий каталог в случае, если исходный текущий каталог был подкаталогом каталога для очистки, который больше не существует. В этом специальном случае %PathToFolder% остается текущим каталогом. Поэтому рекомендуется запустить командную строку выше, а не из подкаталога %PathToFolder%.

Еще один интересный факт:
Я попробовал командную строку также с помощью UNC-пути, поделившись локальным каталогом C:\Temp с общим именем Temp и используя путь UNC \\%COMPUTERNAME%\Temp\CleanTest назначенный переменной окружения PathToFolder в Windows 7. Если текущий каталог запущен командная строка является подкаталог общей локальной папке доступ с помощью UNC - путь, т.е. C:\Temp\CleanTest\Subfolder1, Subfolder1 удаляется по РД, а следующий POPD терпит неудачу молча делает C:\Temp\CleanTest\Subfolder1 снова текущий каталог в результате Z:\CleanTest остается текущим каталогом для запуска команды. Таким образом, в этом очень, очень особенном случае временная буква диска остается до тех пор, пока текущий каталог не будет изменен, например, с помощью cd/D %SystemRoot% в существующий локальный каталог. К сожалению, POPD не выходит со значением больше 0, если ему не удается восстановить исходный текущий каталог, что делает невозможным обнаружение этого особого условия ошибки, используя только код выхода из POPD. Однако можно предположить, что никто не сталкивается с этим особым случаем ошибки, поскольку UNC-пути обычно не используются для доступа к локальным файлам и папкам.

Чтобы лучше понять используемые команды, откройте окно командной строки, выполните там следующие команды и внимательно прочитайте справку, отображаемую для каждой команды.

  • pushd/?
  • popd/?
  • rd/?

Одиночная строка с несколькими командами с использованием командного файла Windows объясняет оператора && и & используется здесь.


Затем давайте посмотрим на решение пакетного файла, используя команду DEL для удаления файлов в %PathToFolder% и FOR и RD для удаления подпапок в %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

Команда DEL используется для удаления всех файлов в указанном каталоге.

  • Опция /A необходима для обработки действительно всех файлов, включая файлы со скрытым атрибутом, которые DEL игнорирует без использования опции /A
  • Опция /F необходима для принудительного удаления файлов с установленным атрибутом только для чтения.
  • Опция /Q необходима для бесшумного удаления нескольких файлов без запроса пользователя, если необходимо удалить несколько файлов.
  • >nul необходимо перенаправить вывод имен файлов, написанных для обработки STDOUT, на устройство NUL, которое невозможно удалить из-за того, что файл открыт или пользователь не имеет права удалять файл.
  • 2>nul необходимо перенаправить вывод сообщения об ошибке для каждого файла, который не может быть удален из дескриптора STDERR на устройство NUL.

Команды FOR и RD используются для удаления всех подкаталогов в указанном каталоге. Но for/D не используется, потому что FOR игнорирует подкаталоги со скрытым набором атрибутов. По этой причине for/F используется для запуска следующей командной строки в отдельном командном процессе, запущенном в фоновом режиме с помощью cmd.exe/C:

dir "%PathToFolder%\*" /AD /B 2>nul

DIR в голом формате из-за /B записей в каталоге с атрибутом D, т.е. Имена всех подкаталогов в указанном каталоге не зависят от других атрибутов, таких как скрытый атрибут без пути. 2>nul используется для перенаправления вывода сообщения об ошибке с помощью DIR по ни одному каталогу, найденному из дескриптора STDERR, на устройство NUL.

Оператор перенаправления > должен быть экранирован с символом каретки ^ в командной строке FOR, чтобы интерпретироваться как буквенный символ, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением команды FOR, которая выполняет встроенную командную строку dir в отдельном командном процессе, запущенном в фоновом режиме.

FOR обрабатывает захваченный вывод, записанный для обработки STDOUT запущенного командного процесса, который является именами подкаталогов без пути и никогда не заключен в двойные кавычки.

FOR с опцией /F игнорирует пустые строки, которые здесь не встречаются, поскольку DIR с опцией /B не выводит пустые строки.

FOR также игнорирует строки, начинающиеся с точки с запятой, которая является символом конца строки по умолчанию. Имя каталога может начинаться с точки с запятой. По этой причине eol=| используется для определения символа вертикальной строки в качестве символа конца строки, который не может иметь ни один каталог или файл в его имени.

FOR разделил бы строку на подстроки, используя пробел и горизонтальную вкладку в качестве разделителей, и назначил бы только строку с ограниченным пространством/табуляцией для указанной переменной цикла I Это поведение расщепления здесь не требуется, поскольку имя каталога может содержать одно или несколько пробелов. Поэтому delims= используется для определения пустого списка разделителей, чтобы отключить поведение разделения строк и получить назначенную переменную цикла. I всегда являюсь полным именем каталога.

Команда FOR запускает команду RD для каждого имени каталога без пути, из-за чего в командной строке RD путь папки должен быть указан еще раз, который объединяется с именем подпапки.

Чтобы понять используемые команды и как они работают, откройте окно командной строки, выполните там следующие команды и тщательно прочитайте все страницы справки, отображаемые для каждой команды.

  • del/?
  • dir/?
  • echo/?
  • endlocal/?
  • for/?
  • goto/?
  • if/?
  • rd/?
  • rem/?
  • set/?
  • setlocal/?
3

Чтобы удалить файл:

del PATH_TO_FILE

Чтобы удалить папку со всеми файлами в ней:

rmdir /s /q PATH_TO_FOLDER

Удаление всех файлов из определенной папки (не удаление самой папки) немного сложнее. del /s *.* не удается удалить папки, но удаляет файлы из всех подпапок. Поэтому необходимы две команды:

del /q PATH_TO_FOLDER\*.*
for /d %i in (PATH_TO_FOLDER\*.*) do @rmdir /s /q "%i"
  • 0
    Да, это правильно. Должно быть два шага. Это заслуживает большего количества голосов, потому что объясняет, почему, по сравнению с более голосуемым ответом выше.
  • 0
    В командной строке DEL пропускается опция /A чтобы удалить также файлы с установленным скрытым атрибутом, и опция /F чтобы удалить также файлы с установленным атрибутом только для чтения и двойными кавычками вокруг последнего аргумента. Так что del /A /F /Q "PATH_TO_FOLDER\*" будет лучше. И командная строка FOR должна быть изменена for /F "eol=| delims=" %%I in ('dir "PATH_TO_FOLDER\*" /AD /B 2^>nul') do rd /Q /S "PATH_TO_FOLDER\%%I" из-за FOR игнорирует каталоги со скрытым набором атрибутов. DIR с параметрами /AD /B выводит все каталоги в PATH_TO_FOLDER только с их именами.
0

Я попробовал несколько из этих подходов, но никто не работал должным образом.
Я нашел этот двухэтапный подход на сайте Windows Command Line:

forfiles /P %pathtofolder% /M * /C "cmd /c if @isdir==FALSE del @file"

forfiles /P %pathtofolder%  /M * /C "cmd /c if @isdir==TRUE rmdir /S /Q @file"

Он работал точно так, как мне было нужно, и, как указано ОП.

  • 0
    Две командные строки можно объединить в одну командную строку: forfiles /P "%pathtofolder%" /M * /C "%SystemRoot%\System32\cmd.exe /C if @isdir==FALSE (del /A /F @file) else rd /Q /S @file" DEL /A добавлен для удаления также файлов с установленным скрытым атрибутом, так как в противном случае DEL выводил бы сообщение об ошибке« not found »для каждого скрытого файла в %pathtofolder% . Параметр DEL /F добавлен для удаления также файлов с атрибутом только для чтения, установленным в %pathtofolder% как в противном случае DEL выдаст сообщение об ошибке отказа в доступе.
  • 0
    Это решение является самым медленным из всех неполных решений, опубликованных здесь, из-за запуска экземпляра cmd.exe для каждого файла и каждого каталога в %pathtofolder% . Преимущество состоит в том, что FORFILES не игнорирует каталоги со скрытым атрибутом, установленным как FOR .
0
@ECHO OFF
rem next line removes all files in temp folder
DEL /A /F /Q /S "%temp%\*.*"
rem next line cleans up the folder content
FOR /D %%p IN ("%temp%\*.*") DO RD "%%p" /S /Q
  • 0
    Несколько коротких комментариев к вашему ответу было бы хорошо.
  • 0
    2-я строка удаляет файлы в каждом файле из всех папок временного каталога Windows, а 3-я строка очищает каталоги, включая их содержимое.
Показать ещё 1 комментарий
-10
del %pathtofolder%\*.*   /s /f  /q

удалить все файлы и подпапки в% pathtofolder%, включая файлы только для чтения, не запрашивать подтверждение

  • 8
    Для меня это оставляет пустые подпапки в% pathtofolder%.
  • 34
    НЕ удаляет подпапки в% pathtofolder%. Так плохо у меня нет репутации, чтобы проголосовать за этот ложный ответ
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню