Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] CMD-скрипт для удаления временных файлов (http://forum.oszone.net/showthread.php?t=185741)

old_nick 17-09-2010 15:29 1497798

CMD-скрипт для удаления временных файлов
 
Задача в следующем. Есть папка, в которой (в самой и в ее подпапках) помимо всего прочего много временных файлов вида *.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 1497985

Цитата:

Цитата old_nick
Проблема 2. Команда del пропускает файлы с атрибутом "скрытый". Если же запускать ее с параметром -a:h, то она будет, наоборот, удалять скрытые файлы и пропускать файлы без атрибута "скрытый". »

Мне разъяснили как: CMD/BAT - [решено] Удаление всех файлов из папки.

megaloman 18-09-2010 15:12 1498530

forfiles.exe -pC:\Tmp\ -m*.tmp -d-14 -s -c"CMD /C del /AR /A ""@FILE"""

Длинные имена при этом не обрезаются. Удаляются все файлы с о всеми атрибутами. Несколько масок одновременно обработать не получилось, если в строке указать несколько ключей -m, обрабатывается последний.

megaloman 19-09-2010 14:10 1499046

Получается обработать список расширений файлов в одну строку, каких-то общих символов в имени файла
Код:

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 1499262

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 1499356

Цитата:

Этот код вместе с временными *.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 1499445

megaloman, спасибо! Действительно, по той ссылке, что Вы дали, лежит версия файла 5.0.2010.1 размером 12048 байт. У меня же была версия 5.2.3790.0, весившая 48640 байт. С сайта Microsoft почему-то скачать не получалось и, погуглив, я взял отсюда.
Проблемы 1 и 2 решены. А 3-я по сути даже не проблема, просто хотелось сделать скрипт компактнее и изящнее. Но если кто-то знает и ее решение - будет интересно узнать.
Будем считать тему закрытой.
Большое спасибо за помощь! :)

DemoN911 23-09-2010 12:59 1502443

Народ, всем драсте, нужен простой батник, ищущий и удаляющий все временные файлы (tmp) в определенной папке без всяких там изысков =) Поделитесь? Спасибо! :)

El Sanchez 23-09-2010 13:26 1502458

DemoN911,
Код:

Del /F /Q "path to folder\*.tmp" 1>nul 2>&1
Подробности: del /?

DemoN911 23-09-2010 14:17 1502481

El Sanchez, спасибо :) еще вопрос - если по тому пути есть еще и подпапки? как заставить поискать и в них? :)

El Sanchez 23-09-2010 14:36 1502495

DemoN911, добавить еще ключ /S.
И все это есть в del /?

rv3wu 05-12-2010 21:17 1559052

Народ подскажите тупому чайнику как сделать чтобы при первом входе после инсталляции удалялась папка инсталл автоматически. Использовался метод $OEM$>$1>INSTALL

Bond01 05-12-2010 22:12 1559099

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

sov44 04-09-2013 15:22 2212638

Как поправить скрипт, чтобы считалась сумма файлов, которые реально удаляются. Файлы, занятые системой не считать.
Код:

@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 2212864

Немного поправил скрипт, но всё равно не удаётся добиться нуля при повторном запуске. Есть идеи?
Код:

@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 2212942

Не проверялось:
Код:

@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 2212987

Iska, проверил, при повторном запуске сумма не ноль.

Iska 05-09-2013 09:25 2212998

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%.

Можно пойти ещё дальше и хранить значение в реестре, в разделе текущего пользователя. И аналогичным образом извлекать значение в начале работы пакетного файла и записывать вобрат в конце работы.

Цитата:

Цитата sov44
Iska, проверил, при повторном запуске сумма не ноль. »

Так, стоп. Дошло, о чём вопрос. Я же его понял с точностью до наоборот ;). Забудьте предыдущий текст.

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

sov44 05-09-2013 10:00 2213016

Цитата:

Цитата Iska
временные файлы или лог-файлы?! Почему они не могут создаваться и уже в момент его работы?! »

Наверное могут. Однако при отключении @echi off я вижу, что скрипт обращается к одним и тем-же файлам, их считает но не удаляет, т.к. они заняты системой. Выловить и исключить их из арифметики через errorlevel не удаётся.

Iska 05-09-2013 11:07 2213043

Цитата:

Цитата sov44
Выловить и исключить их из арифметики через errorlevel не удаётся. »

Вы правы. Память уже подводит: CMD/BAT - [решено] Как отследить ERRORLEVEL, если файл не удаляется.

Тогда давайте попробуем так (не проверялось):
Код:

@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

Конечно, если файл постоянно воссоздаётся — будет погрешность на его предыдущий размер..

sov44 05-09-2013 11:18 2213052

Iska, интересный подход. Работает :up

Денис_Гальцов@fb 19-02-2015 12:26 2473394

Добрый день! Прошу помощи, т.к. сам не силен.

Задача: удалить все файлы по определенной маске в определенной папке.

Имею такой код, выполняется правильно. Все файлы, содержащие T920 удаляются.
Код:

@echo off
forfiles /p d:\1\ /m *T920*.pc3 /c "cmd /c del /q /f @file"

Как только путь имеет пробелы, то я его заключаю в кавычки.
Код:

@echo off
forfiles /p "d:\1\" /m *T920*.pc3 /c "cmd /c del /q /f @file"

После этого ругается:
Код:

ОШИБКА: Неправильный параметр или аргумент - '/q'.
Введите "FORFILES /?" для получения справки по использованию.

Реальный же путь будет такой c:\Users\%USERNAME%\AppData\Roaming\Autodesk\AutoCAD 2014\R19.1\rus\Plotters\

Не знаю как это побороть. Гугл не помог :(

Iska 19-02-2015 14:22 2473457

Денис_Гальцов@fb, сделайте «pushd "Путь"» до вызова forfiles.exe, и «popd» — после. В самом «forfiles.exe» воспользуйтесь:
Цитата:

/p <Path>
Specifies the path from which to start the search. By default, searching starts in the current working directory.

Денис_Гальцов@fb 20-02-2015 08:46 2473722

Вчера почитал про pushd, с ней заработало, иначе никак не получалось у меня. Про popd не знал, спасибо!


Время: 10:16.

Время: 10:16.
© OSzone.net 2001-