Показать полную графическую версию : [решено] CMD-скрипт для удаления временных файлов
old_nick
17-09-2010, 15:29
Задача в следующем. Есть папка, в которой (в самой и в ее подпапках) помимо всего прочего много временных файлов вида *.tmp и ~$*.*
Нужно, чтобы эти временные файлы автоматически удалялись, если становятся старше 14 дней.
Хочу решить эту задачу с помощью CMD-скрипта и утилиты forfiles.exe.
На данный момент код такой:
CLS
@ECHO OFF
forfiles.exe /P D:\Folder\ /S /M *.tmp /D -14 /C "cmd if @isdir==FALSE /C del \"@file\""
forfiles.exe /P D:\Folder\ /S /M ~$*.* /D -14 /C "cmd if @isdir==FALSE /C del \"@file\""
Проблема 1. Если имя файла содержит пробелы, то все, что после первого пробела, отсекается (при этом имена папок с пробелами обрабатываются корректно).
Например, файл D:\Folder\My SubFolder1\My SubFolder2\My Temp File.tmp будет выглядеть как D:\Folder\My SubFolder1\My SubFolder2\My
Проблема 2. Команда del пропускает файлы с атрибутом "скрытый". Если же запускать ее с параметром -a:h, то она будет, наоборот, удалять скрытые файлы и пропускать файлы без атрибута "скрытый". Пробовал также del /f /q /a:h-h, чтобы удалялись и скрытые, и не скрытые файлы. Не помогло. Аналогичная ситуация с файлами, у которых атрибут "системный". Хотелось бы узнать: есть ли возможность удаления файлов с ЛЮБЫМИ атрибутами?
Проблема 3. Не могу задать несколько масок файлов для forfiles.exe (параметр /M). Хотелось бы объединить 3 и 4 строки скрипта в одну и получить что-то вроде этого:
CLS
@ECHO OFF
forfiles.exe /P D:\Folder\ /S /M *.tmp;~$*.* /D -14 /C "cmd if @isdir==FALSE /C del \"@file\""
Как написать корректно? И возможно ли это вообще?
Буду благодарен за любую помощь.
Проблема 2. Команда del пропускает файлы с атрибутом "скрытый". Если же запускать ее с параметром -a:h, то она будет, наоборот, удалять скрытые файлы и пропускать файлы без атрибута "скрытый". »
Мне разъяснили как: CMD/BAT - [решено] Удаление всех файлов из папки (http://forum.oszone.net/post-1489804.html#post1489804).
megaloman
18-09-2010, 15:12
forfiles.exe -pC:\Tmp\ -m*.tmp -d-14 -s -c"CMD /C del /AR /A ""@FILE"""
Длинные имена при этом не обрезаются. Удаляются все файлы с о всеми атрибутами. Несколько масок одновременно обработать не получилось, если в строке указать несколько ключей -m, обрабатывается последний.
megaloman
19-09-2010, 14:10
Получается обработать список расширений файлов в одну строку, каких-то общих символов в имени файла FOR %%i IN (doc xls tmp) Do forfiles.exe -pC:\Tmp\ -m*.%%i -d-14 -s -c"CMD /C del /AR /A ""@FILE"""
FOR %%i IN (~$ ~~) DO forfiles.exe -pC:\Tmp\ -m%%i*.* -d-14 -s -c"CMD /C del /AR /A ""@FILE"""
А вот задать список типа *.tmp ~*.* мне не удалось. Вероятно, гуру Amel27 смог бы победить эту проблему :search:
old_nick
19-09-2010, 19:37
Iska, Спасибо, проблема 2 решена. Метод del *.* /AR /A /Q работает!
megaloman
По поводу поста #3. Между параметром и его значением надо ставить пробел, иначе выскакивает ошибка "Неправильный параметр или аргумент" (т.е. надо писать не -pC:\Tmp\, а p C:\Tmp\) К сожалению, длинные имена по-прежнему обрезаются (см. вложение screenshot1.gif)
По поводу поста #4.
FOR %%i IN (doc xls tmp) Do forfiles.exe -p C:\Tmp\ -m *.%%i -d -14 -s -c "CMD /C del /AR /A ""@FILE"""
Этот код вместе с временными *.tmp-файлами также будет вычищать из папки документы Word (*.doc) и таблицы Excel (*.xls). А это мне не надо. У меня НЕ временная папка, а папка с файлами пользователей, в которой вместе с нужными документами лежат временные файлы.
megaloman
19-09-2010, 21:32
Этот код вместе с временными *.tmp-файлами также будет вычищать из папки документы Word (*.doc) и таблицы Excel (*.xls) - это только пример применения нескольких расширений, не более, Вы вольны ставить любые свои расширения. Мне же на чём-то надо было тестировать батник.Между параметром и его значением надо ставить пробел - похоже, у нас разные версии forfiles.exe. То что скачал я, у меня полностью отрабатывает в соответствии с Вашими требованиями, и пробелы я не ставил.И длинные имена не режутся. Я без тестирования ничего не демонстрирую. ftp://ftp.microsoft.com/ResKit/y2kfix/x86/forfiles.exe Как видите, этот файл не из "левого" источника.
Здесь список файлов, с которыми мой батник успешно справилсяPrinter Command Language.doc
Использование _тегов.doc
Лазерные-цветные-принтеры.doc
Мебель-Борисов.doc
Может ли человек делать то.doc
Требования к компьютерной технике.doc
Уважаемые господа.doc
Вот хелп от "моего" forfiles.exe FORFILES v 1.1 - emmanubo@microsoft.com - 4/98
Syntax : FORFILES [-pPath] [-mSearch Mask] [-ccommand] [-d<+|-><DDMMYYYY|DD>] [-s]
-pPath Path where to start searching
-mSearch Mask Search files according to <Search Mask>
-cCommand Command to execute on each file(s)
-d<+|-><DDMMYYYY|DD> Select files with date >= or <=DDMMYYYY (UTC)
or files having date >= or <= (current date - DD days)
-s Recurse directories
-v Verbose mode
The following variables can be used in Command :
@FILE, @FNAME_WITHOUT_EXT, @EXT, @PATH, @RELPATH, @ISDIR, @FSIZE, @FDATE,
@FTIME
To include special hexa characters in the command line : use 0xHH
Default : <Directory : .> <Search Mask : *.*> <Command : "CMD /C Echo @FILE">
Examples :
FORFILES -pc:\ -s -m*.BAT -c"CMD /C Echo @FILE is a batch file"
FORFILES -pc:\ -s -m*.* -c"CMD /C if @ISDIR==TRUE echo @FILE is a directory"
FORFILES -pc:\ -s -m*.* -d-100 -c"CMD /C Echo @FILE : date >= 100 days"
FORFILES -pc:\ -s -m*.* -d-01011993 -c"CMD /C Echo @FILE is quite old!"
FORFILES -pc:\ -s -m*.* -c"CMD /c echo extension of @FILE is 0x22@EXT0x22"
P.S. Похоже, нашел я и Ваш вариант FORFILES.exe Там в хелпе параметры через /
Похоже, с длинными именами он работать не хочет. Да и вообще, лучше бы обходится без нестандартных средств, что поставляются с системой.
old_nick
20-09-2010, 00:13
megaloman, спасибо! Действительно, по той ссылке, что Вы дали, лежит версия файла 5.0.2010.1 размером 12048 байт. У меня же была версия 5.2.3790.0, весившая 48640 байт. С сайта Microsoft почему-то скачать не получалось и, погуглив, я взял отсюда (http://rm-rf.ucoz.ru/load/skachat_forfiles_exe/7-1-0-14).
Проблемы 1 и 2 решены. А 3-я по сути даже не проблема, просто хотелось сделать скрипт компактнее и изящнее. Но если кто-то знает и ее решение - будет интересно узнать.
Будем считать тему закрытой.
Большое спасибо за помощь! :)
DemoN911
23-09-2010, 12:59
Народ, всем драсте, нужен простой батник, ищущий и удаляющий все временные файлы (tmp) в определенной папке без всяких там изысков =) Поделитесь? Спасибо! :)
El Sanchez
23-09-2010, 13:26
DemoN911,
Del /F /Q "path to folder\*.tmp" 1>nul 2>&1
Подробности: del /?
DemoN911
23-09-2010, 14:17
El Sanchez, спасибо :) еще вопрос - если по тому пути есть еще и подпапки? как заставить поискать и в них? :)
El Sanchez
23-09-2010, 14:36
DemoN911, добавить еще ключ /S.
И все это есть в del /?
Народ подскажите тупому чайнику как сделать чтобы при первом входе после инсталляции удалялась папка инсталл автоматически. Использовался метод $OEM$>$1>INSTALL
Можно создать дерево папок $OEM$\$1\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
и в нее положить файл dell.cmd для удаления папок
Как поправить скрипт, чтобы считалась сумма файлов, которые реально удаляются. Файлы, занятые системой не считать.
@Echo Off
SetLocal enabledelayedexpansion
set Rash=*.log;*.temp;*.tmp;
For /F "Delims=" %%I In ('Dir c:\%Rash% /B/S/A:-D-H 2^>nul') Do (
2>&1 del /q "%%I" | 1>nul findstr "."
if errorlevel 1 (set /a iSumL +=%%~zI)
)
Set /A Cnt +=!iSumL!
echo !cnt!
pause
Немного поправил скрипт, но всё равно не удаётся добиться нуля при повторном запуске. Есть идеи?
@Echo Off
SetLocal enabledelayedexpansion
for %%a in (log temp tmp) do (
for /f "delims=" %%i in ('dir /b /s /a-d-h "c:\*.%%a" 2^>nul') do (
2>&1 del /q "%%i" | 1>nul findstr "."
if errorlevel 1 (set /a iSumL+=%%~zi)
))
echo %iSumL%
Set /A Cnt +=!iSumL!
echo !cnt!
pause
Не проверялось:
@echo off
setlocal enableextensions enabledelayedexpansion
set /a iSumL = 0
for /f "usebackq delims=" %%i in (`dir /b /s /a:-d /a:-h "c:\*.log" "c:\*.temp" "c:\*.tmp" 2^>nul`) do (
2>nul del /f /q "%%i" && set /a iSumL += %%~zi
)
echo %iSumL%
endlocal
exit /b 0
Iska, проверил, при повторном запуске сумма не ноль.
sov44, Вы хотите, чтобы шло некое накопление, доступное между сеансами? Можно, например, хранить значение в файле, связанном с именем и местоположением пакетного файла, наподобие (тоже не проверялось):
@echo off
setlocal enableextensions enabledelayedexpansion
set sSaveFile=%~dpn0.sav
if exist "%sSaveFile%" (
<"%sSaveFile%" set /p iSumL=
) else (
set /a iSumL = 0
)
for /f "usebackq delims=" %%i in (`dir /b /s /a:-d /a:-h "c:\*.log" "c:\*.temp" "c:\*.tmp" 2^>nul`) do (
2>nul del /f /q "%%i" && set /a iSumL += %%~zi
)
>"%sSaveFile%" echo %iSumL%
echo %iSumL%
endlocal
exit /b 0
Совсем же правильным будет использовать папку и файл в %AppData%.
Можно пойти ещё дальше и хранить значение в реестре, в разделе текущего пользователя. И аналогичным образом извлекать значение в начале работы пакетного файла и записывать вобрат в конце работы.
Iska, проверил, при повторном запуске сумма не ноль. »
Так, стоп. Дошло, о чём вопрос. Я же его понял с точностью до наоборот ;). Забудьте предыдущий текст.
А почему Вы полагаете, что в промежутке между двумя запусками пакетного файла не могут создаваться никакие временные файлы или лог-файлы?! Почему они не могут создаваться и уже в момент его работы?!
временные файлы или лог-файлы?! Почему они не могут создаваться и уже в момент его работы?! »
Наверное могут. Однако при отключении @echi off я вижу, что скрипт обращается к одним и тем-же файлам, их считает но не удаляет, т.к. они заняты системой. Выловить и исключить их из арифметики через errorlevel не удаётся.
Выловить и исключить их из арифметики через errorlevel не удаётся. »
Вы правы. Память уже подводит: CMD/BAT - [решено] Как отследить ERRORLEVEL, если файл не удаляется (http://forum.oszone.net/thread-210821.html).
Тогда давайте попробуем так (не проверялось):
@echo off
setlocal enableextensions enabledelayedexpansion
set /a iSumL = 0
for /f "usebackq delims=" %%i in (`dir /b /s /a:-d /a:-h "c:\*.log" "c:\*.temp" "c:\*.tmp" 2^>nul`) do (
set /a iSize = %%~zi
2>nul del /f /q "%%i"
if not exist "%%i"set /a iSumL += !iSize!
)
echo %iSumL%
endlocal
exit /b 0
Конечно, если файл постоянно воссоздаётся — будет погрешность на его предыдущий размер..
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.