1 (изменено: Ivan, 2012-03-30 16:31:38)

Тема: CMD/BAT: Удаление файлов и папок из списка

Есть файл например 5.txt, в котором записаны пути файлов и папок которые необходимо удалить, а результат выести в файл. В сети нашел следующее:

@echo off
FOR /F "eol=; tokens=*" %%i IN (*.txt) DO (
if exist "%%i" (
  del /q "%%i"
  if exist "%%i" (
    rmdir /s /q "%%i"
  )
)
)

Проблема в том, что bat, не удаляет пустые папки, даже в папке Temp. Вообщем как то не очень корректно работает, да и в файл не выводит. Может необходимо что то подправить. Помогите.

2

Re: CMD/BAT: Удаление файлов и папок из списка

Ivan пишет:

не удаляет пустые папки, даже в папке Temp.

Удаляет. Если не удаляет — значит, папка заблокирована.

Ivan пишет:

да и в файл не выводит.

А должен?

3 (изменено: Ivan, 2012-03-30 18:41:19)

Re: CMD/BAT: Удаление файлов и папок из списка

В содержимом bat вывод в файл не прописан, но было бы желательно. У меня вопрос, как она может быть заблокирована, когда вручную спокойно удаляется? Например в C:\WINDOWS\Installer\MSI5F.tmp-. Эту папку не удаляет (хотя пустая).
Хотя вы правы, удаляет, в bat по невнимательности не тот файл прописал извиняюсь. Только иногда папки со случайным именем создаются как эта выделено C:\WINDOWS\Installer\MSI5F.tmp-. Что сделать чтобы bat ее удалял? Пробовал *.tmp-, MSI*.tmp-. Удалить все содержимое папки нельзя.

4

Re: CMD/BAT: Удаление файлов и папок из списка

Пробуйте, запустите без параметров - скрипт покажет справку, как его использовать.


@echo off
setlocal enableextensions
if "%2" == "" (call :help) else (call :cln %*)
endlocal & exit /b

:cln
del /f/q %~dp0*.tmp
set logfile=%~dp0%~n0.log
call :log "%date% %time% %0 запущена с параметрами %*"
for /f "eol=# delims=^: tokens=*" %%a in ('type %1') do (dir /a-d /b /s %2\*%%a* && dir /a-d /b /s %2\*%%a*>> %~dp0files.tmp)
for /f "eol=# delims=^: tokens=*" %%a in ('type %1') do (dir /ad /b /s %2\*%%a* && dir /ad /b /s %2\*%%a* >> %~dp0dirs.tmp)
call :log "%date% %time% удаляю файлы..."
call :clean
call :log "%date% %time% удаляю папки..."
call :clean 0
:: del %~dp0*.tmp
exit /b

:log
echo %~1 >> %logfile%
exit /b

:clean
:: здесь устанавливаются программы для удаления rd для каталогов, del для файлов
if "%1" == "" (set rm=echo && set tmpf=%~dp0files.tmp) else (set rm=echo && set tmpf=%~dp0dirs.tmp)
:: чтобы скрипт удалял файлы и папки - закомментируйте строчку выше и раскомментируйте строчку ниже
:: if "%1" == "" (set rm=del /f/q && set tmpf=%~dp0files.tmp) else (set rm=rd /s/q && set tmpf=%~dp0dirs.tmp)
for /f %%b in ('type %tmpf%') do (
	%rm% %%b && (call :log "%date% %time% удалён(а) %%b.") || (call :log "%date% %time% не могу удалить %%b.")
)
exit /b

:help
echo ---------------------------------------------------
echo %~n0 20120406 
echo очищает папку по шаблону
echo.
echo Usage:
echo     %~n0 "файл_шаблона" "папка_для_очистки"
echo ---------------------------------------------------
exit /b

содержимое файла шаблонов

# можно писать комментарии после решётки
# Удалятся все (!!!) файлы и папки в названии (и расширении - для файлов) которых
# встречаются tmp или TMP, log или LOG, в любой части названия в начале, середине, конце и в любой части расширения файла
tmp
log

Получилось немного громоздко, "бетатест" показал, что работает. Также можно "поиграться" с обработкой файлов-шаблонов, т.о. пространство для полёта мысли, надеюсь, я вам дал.