Войти

Показать полную графическую версию : [решено] CMD-скрипт для удаления временных файлов


Страниц : [1] 2

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\""

Как написать корректно? И возможно ли это вообще?

Буду благодарен за любую помощь.

Iska
17-09-2010, 18:59
Проблема 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 /?

rv3wu
05-12-2010, 21:17
Народ подскажите тупому чайнику как сделать чтобы при первом входе после инсталляции удалялась папка инсталл автоматически. Использовался метод $OEM$>$1>INSTALL

Bond01
05-12-2010, 22:12
Можно создать дерево папок $OEM$\$1\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
и в нее положить файл dell.cmd для удаления папок

sov44
04-09-2013, 15:22
Как поправить скрипт, чтобы считалась сумма файлов, которые реально удаляются. Файлы, занятые системой не считать.
@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

sov44
04-09-2013, 22:35
Немного поправил скрипт, но всё равно не удаётся добиться нуля при повторном запуске. Есть идеи?
@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

Iska
05-09-2013, 03:16
Не проверялось:
@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

sov44
05-09-2013, 08:58
Iska, проверил, при повторном запуске сумма не ноль.

Iska
05-09-2013, 09:25
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, проверил, при повторном запуске сумма не ноль. »
Так, стоп. Дошло, о чём вопрос. Я же его понял с точностью до наоборот ;). Забудьте предыдущий текст.

А почему Вы полагаете, что в промежутке между двумя запусками пакетного файла не могут создаваться никакие временные файлы или лог-файлы?! Почему они не могут создаваться и уже в момент его работы?!

sov44
05-09-2013, 10:00
временные файлы или лог-файлы?! Почему они не могут создаваться и уже в момент его работы?! »
Наверное могут. Однако при отключении @echi off я вижу, что скрипт обращается к одним и тем-же файлам, их считает но не удаляет, т.к. они заняты системой. Выловить и исключить их из арифметики через errorlevel не удаётся.

Iska
05-09-2013, 11:07
Выловить и исключить их из арифметики через 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