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

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

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

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

Есть ли какая-то команда для этого?

Ответ 1

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

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

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

Ответ 2

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

RMDIR "FOLDERNAME" /S /Q

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

Ответ 3

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

RD /S /Q folderPath

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

MD folderPath

Ответ 4

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

pushd "%pathtofolder%" && (rd /s /q "%pathtofolder%" 2>nul & popd)

Ответ 5

@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

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

Ответ 6

CD [Your_Folder]
RMDIR /S /Q .

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

Обновление:

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

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

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

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

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

Ответ 7

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

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

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

Пример:

RD /S /Q C:/folder_path/here

Ответ 8

Я использую Powershell

Remove-Item c:\scripts\* -recurse

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

Ответ 9

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

RMDIR [/S] [/Q] [drive:]path            

Ответ 10

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

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"

Ответ 11

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

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

Выберите Сохранить как и имя файла:

delete_temp.bat

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

Он работает на любой учетной записи (администратор или обычный пользователь). Просто запустите!

В этом примере я использую временную переменную, но вы можете использовать любую другую! PS: только для ОС Windows!

Ответ 12

Ни один из ответов, опубликованных в 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 удаляется RD, а следующая 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 в этом случае игнорирует подкаталоги с установленным атрибутом hidden. По этой причине for /F используется для запуска следующей командной строки в отдельном командном процессе, запущенном в фоновом режиме с помощью %ComSpec% /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 /?

Ответ 13

Я попробовал несколько из этих подходов, но ни один из них не работал должным образом.

Я нашел этот двухэтапный подход на сайте Командная строка Windows:

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"

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

Ответ 14

@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

Ответ 15

Использование:

del %pathtofolder%\*.*   /s /f  /q

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