Alexander A Manaeff -

 
 

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

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

Модератор: UncleFather

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

Сообщение UncleFather » 20 янв 2010 17:44, Ср

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



Вариант 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
Аватара пользователя
UncleFather
Site Admin
 
Сообщения: 1256
Зарегистрирован: 17 авг 2004 17:20, Вт

Сообщение Bibigool » 20 янв 2010 17:56, Ср

Скрипт 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\
Аватара пользователя
Bibigool
 
Сообщения: 41
Зарегистрирован: 18 авг 2004 00:13, Ср


Вернуться в Администрирование Windows Server

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Alexander A Manaeff -
@Mail.ru .