Удаление папок из командного файла
Удаление пустых папок:
Вариант 1.
Удаляем пустые папки, возраст которых старше 20 дней:
Код: Выделить всё
forfiles /p C:\DeletingUpFolder\ /s /m * /d -20 /C "cmd /c if @isdir==TRUE RD /Q @file"
Здесь командой "forfiles /p ... /s /m * /d -20" мы отбираем объекты, старше 20 дней, затем, если объект является папкой "if @isdir==TRUE", мы удаляем его "RD /Q @file". Команда "RD" не удаляет непустые папки, поэтому у нас удалятся только пустые.
Вариант 2.
Удаляем все пустые папки:
Код: Выделить всё
for /f %%D in ('DIR cd C:\DeletingUpFolder\ /AD/B/S ^| sort /r') do RD "%%D"
Здесь командой "Dir ... /AD/B/S" мы получаем список папок, сортируем его "sort /r", делаем разбор получаемых результатов "for /f %%D in", и, для каждого результата (папки в нашем случае) выполняем ее удаление "do RD "%%D"". Команда "RD" не удаляет непустые папки, поэтому у нас удалятся только пустые.
Вариант 3.
Удаляем все пустые папки рекурсивно:
Код: Выделить всё
for /R I:\Archives\ %%F in (.) DO RD %%F
В этом примере удалятся все пустые папки из папки "I:\Archives\" и ее подпапок.
Вариант 4.
Удаляем все пустые папки:
Код: Выделить всё
for /F %%F in (I:\Archives\*) DO RD %%F
В этом примере удалятся все пустые папки только из папки "I:\Archives\".
Удаление всех папок (и пустых и непустых):
Способы те же, что и для удаления пустых папок, но для команды RD указываем два параметра S - удалять непустые папки и Q - не спрашивать подтверждение при удалении.
Пример 1:
Удаляем все папки рекурсивно:
Код: Выделить всё
for /R I:\Archives\ %%F in (.) DO RD /S /Q %%F
В этом примере удалятся все папки из папки "I:\Archives\" и ее подпапок.
Пример 2:
Удаляем все папки:
Код: Выделить всё
for /F %%F in (I:\Archives\*) DO RD /S /Q %%F
В этом примере удалятся все папки только из папки "I:\Archives\".
Удаление всех папок (и пустых и непустых), не трогая родительскую папку:
Собственно, тоже ничего нового, - просто добавляем условие проверки, и, если это родительская папка, то оставляем ее на месте, удаляя только файлы.
Пример 1:
Удаляем из командной строки все файлы заданной папки и все ее подпапки рекурсивно, не трогая саму папку:
Код: Выделить всё
for /R "C:\WINDOWS\Temp\" %F in (.) DO IF NOT "%F"=="C:\WINDOWS\Temp\." (RD /S /Q "%F") ELSE (Del /F /S /Q "C:\WINDOWS\Temp\*")
Пример 2:
Все то же самое делаем из командного файла:
Код: Выделить всё
@echo off
SET Path2Del=C:\WINDOWS\Temp
for /R "%Path2Del%" %%F in (.) DO IF NOT "%%F"=="%Path2Del%." (RD /S /Q "%%F") ELSE (Del /F /S /Q "%Path2Del%*")
Пример 3:
То же самое, но с передачей параметра из командной строки:
Код: Выделить всё
@echo off
SET Path2Del=%~1
for /R "%Path2Del%" %%F in (.) DO IF NOT "%%F"=="%Path2Del%." (RD /S /Q "%%F") ELSE (Del /F /S /Q "%Path2Del%*")
EXIT
Назовем этот командный файл, например CleaningFolder.bat и будем вызывать его с параметром "C:\WINDOWS\Temp\":
Код: Выделить всё
CleaningFolder.bat "C:\WINDOWS\Temp\"
Пример 4:
Чистим временные папки, создаваемые ПО 1С 8.2, а именно - полностью удаляем содержимое папок \Application Data\1C\1Cv82\ и \Local Settings\Application Data\1C\1Cv82\, расположенных в профиле каждого пользователя (%userprofile%).
Для этого создаем командный файл с именем, например, CleaningUsersFolder.bat и следующим содержанием:
Код: Выделить всё
@echo off
REM ********************************************************
REM Чистим папку \Application Data\1C\1Cv82
SET Path2Del=%~1\Application Data\1C\1Cv82
for /R "%Path2Del%" %%F in (.) DO IF NOT "%%F"=="%Path2Del%." (RD /S /Q "%%F") ELSE (Del /F /S /Q "%Path2Del%*")
REM ********************************************************
REM Чистим папку \Local Settings\Application Data\1C\1Cv82
SET Path2Del=%~1\Local Settings\Application Data\1C\1Cv82
for /R "%Path2Del%" %%F in (.) DO IF NOT "%%F"=="%Path2Del%." (RD /S /Q "%%F") ELSE (Del /F /S /Q "%Path2Del%*")
REM ********************************************************
И запускаем его из командной строки:
Код: Выделить всё
for /D %F in ("C:\Documents and Settings\*") DO Call CleaningUsersFolder.bat "%F"
Получается, что из командной строки мы запускаем перебор папок профилей пользователей и для каждого профиля запускаем батник CleaningUsersFolder.bat, который в свою очередь перебирает и очищает от подпапок и файлов содержимое папок профиля пользователя \Application Data\1C\1Cv82\ и \Local Settings\Application Data\1C\1Cv82\.
Если же нужно очистить не полностью содержимое папок \Application Data\1C\1Cv82\ и \Local Settings\Application Data\1C\1Cv82\, а лишь только подпапки кэша, то есть подпапки формата ????????-????-????-????-????????????, то батник для запуска из этой строки будет такой:
Код: Выделить всё
@echo off
REM ********************************************************
REM Чистим папку \Application Data\1C\1Cv82
SET Path2Del=%~1\Application Data\1C\1Cv82
FOR /D %%I IN ("%Path2Del%????????-????-*") DO RD /S /Q "%%I"
REM ********************************************************
REM Чистим папку \Local Settings\Application Data\1C\1Cv82
SET Path2Del=%~1\Local Settings\Application Data\1C\1Cv82
FOR /D %%I IN ("%Path2Del%????????-????-*") DO RD /S /Q "%%I"
REM ********************************************************
В отличие от предыдущей версии bat-файла, в котором используется конструкция for /R Путь %%F in (.) DO, в последней версии будем использовать конструкцию FOR /D %%I IN (Путь с маской папки) DO, так как FOR /R при указании маски отлично от «.» рекурсивно просматривает только файлы, а значит она не умеет делать выборку по маске папок.
Либо еще один модифицированный вариант последнего батника. Здесь добавлены различные проверки и запись в лог файл (файл журнала C:\Soft\Bat\CleaningUsersFolder_log.txt):
Код: Выделить всё
@echo off
IF "%~1" EQU "" (Set ErrorParam=1) Else (Set ErrorParam=0)
Echo. >>C:\Soft\Bat\CleaningUsersFolder_log.txt
Echo *********************** Starting ********************************* >>C:\Soft\Bat\CleaningUsersFolder_log.txt
Date /T >>C:\Soft\Bat\CleaningUsersFolder_log.txt
Time /T >>C:\Soft\Bat\CleaningUsersFolder_log.txt
If %ErrorParam%==0 GoTo NoError
Echo Внимание! ОШЫЫЫЫЫБКА!!!! >>C:\Soft\Bat\CleaningUsersFolder_log.txt
Echo Пропущен параметр командной строки вызова! >>CleaningUsersFolder_log.txt
Echo Не задана папка для очистки! >>CleaningUsersFolder_log.txt
GoTo Ending
:NoError
SET Path2Del=%~1\Application Data\1C\1Cv82
:LocalSett
If NOT EXIST "%Path2Del%????????-????-*" Echo Нет подпапок для удаления в папке %Path2Del% >>C:\Soft\Bat\CleaningUsersFolder_log.txt
FOR /D %%I IN ("%Path2Del%????????-????-*") DO (RD /S /Q "%%I" & Echo "%%I" >>C:\Soft\Bat\CleaningUsersFolder_log.txt)
If "%Path2Del%"=="%~1\Application Data\1C\1Cv82\" (SET Path2Del=%~1\Local Settings\Application Data\1C\1Cv82\& GOTO LocalSett)
:Ending
Date /T >>C:\Soft\Bat\CleaningUsersFolder_log.txt
Time /T >>C:\Soft\Bat\CleaningUsersFolder_log.txt
Echo *********************** End ********************************* >>C:\Soft\Bat\CleaningUsersFolder_log.txt
Echo. >>C:\Soft\Bat\CleaningUsersFolder_log.txt