it-swarm.com.ru

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

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

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

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

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

274
Deniz Zoeteman

Вы можете использовать этот скрипт для очистки папки и файлов в C:\Tempsource :

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

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

228
Iain

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

RMDIR "FOLDERNAME" /S /Q

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

314
Suresh

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

RD /S /Q folderPath

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

MD folderPath
81
wojciech_rak

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

pushd "%pathtofolder%" && (rd /s /q "%pathtofolder%" 2>nul & popd)
49
foxidrive
@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

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

35
thepip3r
CD [Your_Folder]
RMDIR /S /Q .

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

Update :

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

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

От Справочник по командной строке Windows :

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

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

24
O.Badr

RD расшифровывается как REMOVE Directory.

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

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

Пример :

RD /S /Q C:/folder_path/here
9
Sireesh Yarlagadda

Я использую Powershell

Remove-Item c:\scripts\* -recurse

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

7
rhellem

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

RMDIR [/S] [/Q] [drive:]path            
4
Ripon Al Wasim

Ни один из ответов, опубликованных в 2018-06-01 , за исключением единственной командной строки, опубликованной - foxidrive действительно удалил все файлы и все папки/каталоги в %PathToFolder%. По этой причине необходимо опубликовать еще один ответ с очень простой единой командной строкой для удаления всех файлов и подпапок папки, а также пакетный файл с более сложным решением, объясняющим, почему все остальные ответы, опубликованные в 2018-06-01 с использованием DEL и ДЛЯ с 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. Ну, в действительности папка для файловой системы - это специальный файл с атрибутом file каталог , который объясняет это сообщение об ошибке. Но я не хочу углубляться в управление файловой системой.

Это сообщение об ошибке, как и все другие сообщения об ошибках, которые могут возникнуть из-за трех указанных выше причин, подавляется путем перенаправления его с помощью 2>nul из handle 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% и ДЛЯ и 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.

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

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

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

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

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

ДЛЯ с параметром /F игнорирует пустые строки, которые здесь не встречаются как DIR с параметром /B не выводит пустые строки.

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

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

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

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

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

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

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

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

delete_temp.bat

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

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

4
Filip Gjorgjevikj

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

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"
3
Maxim Suslov

Я попробовал несколько из этих подходов, но ни один не работал должным образом.
Я нашел этот двухэтапный подход на сайте Командная строка 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"

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

0
Paul Haan
@ECHO OFF
rem next line removes all files in temp folder
DEL /A /F /Q /S "%temp%\*.*"
rem next line cleans up the folder's content
FOR /D %%p IN ("%temp%\*.*") DO RD "%%p" /S /Q
0
Robie