Удаление папок из командного файла

Все об администрировании Windows NT/2000/2003/2008/2012 Server (в т.ч. R2) серверов. Групповые политики, домены, безопасность и пр. То, чего не найдешь в бескрайних просторах Интернета. Решения тех проблем, которые не решаются типовыми ответами, которые можно получить в техподдержке Майкрософта - а именно: переустановить продукт или купить какой-ть другой лицензионный диск.


Модератор: UncleFather

Аватара пользователя
UncleFather
Site Admin
Сообщения: 1505
Зарегистрирован: 17 авг 2004 16:20, Вт
Контактная информация:

Удаление папок из командного файла

Сообщение UncleFather »

Удаление пустых папок:


Вариант 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

Alexander A. Manaeff©

Понравилась статья? Будем крайне признательны за репосты в соцсетях! Материально поддержать проект можно здесь

Мои странички:
ВКонтакте
Одноклассники
Youtube
Facebook
Instagram

Изображение
Изображение
Изображение
Изображение

Аватара пользователя
Bibigool
Сообщения: 41
Зарегистрирован: 17 авг 2004 23:13, Вт

Сообщение Bibigool »

Скрипт VBS для удаления пустых папок всех уровней вложенности:

Код: Выделить всё

Set fso = CreateObject("Scripting.FileSystemObject")
 
Set arg = WSH.Arguments
If arg.Count > 0 Then
    If Descend(arg(0)) = 0 Then              
    Set f = fso.GetFolder(arg(0))
        WSH.Echo f.Path & " delete.."
        f.Delete(True)
    End if
Else
    Descend(".")
End if
  
Function Descend(spec)
On Error Resume Next
 
    Set d = fso.GetFolder(spec)
 
    For Each f in d.SubFolders
        If Descend(f) = 0 Then              
            WSH.Echo f.Path & " delete.."
            f.Delete(True)
        End if
    Next
 
    Descend = (d.Subfolders.Count + d.Files.Count)
 
End Function

Скрипт удаляет все пустые папки из текущей. Если необходимо изменить путь для удаления папок, в строке запуска указываем необходимый путь:

Код: Выделить всё

cscript filename.vbs c:\Temp\
Дмитрий

Re: Удаление папок из командного файла

Сообщение Дмитрий »

подскажите если код

Код: Выделить всё

for /R D:\ %%F in (.) DO RD /S /Q %%F

удаляет папку там где лежит сам бат-файл
а этот код исключает удаление папки

Код: Выделить всё

Set NoDelete=001

как их совместить по условию?

Ответить