Имеется в локальной сети файлопомойка. Хотелось бы поместить в шедулер скритп, который удалял бы все файлы, старше определенного возласта (исходя из даты создания файла) Нашел такой скрипт: Код: '========================================================= ' ' DESC: Delete files in a directory older than the specified ' number of days ' ' USAGE: Call delFiles("SOURCE DIR", #DAYS) ' ' ' AUTHOR: Todd Woolums (twoolums@toddwoolums.com) ' DATE : 05/29/2004 ' VERSION: 1.0 '========================================================= Dim strCurrentDate Dim objFSO Set objFSO = CreateObject("Scripting.FileSystemObject") Call delFiles("\\server\share\archive", 30) Set objFSO = Nothing Sub delFiles(strFolderPath, intAge) Dim oFldr Dim oFile Set oFldr = objFSO.GetFolder(strFolderPath) For Each oFile in oFldr.Files if datediff("d", oFile.DateLastModified, Now ()) > intAge Then oFile.Delete End if Next Set oFldr = Nothing End Sub Работает. Но если есть каталоги - скрипт их не видит. Посоветуйте, что надо исправить (или может у кого есть готовый скрипт), чтобы удалялись файлы и внутри каталогов. Но каталоги оставались нетронутыми.
Одной строкой для cmd.exe Ну или в бат-файле: for /r "\\server\share" %%a in (*.*) do for %%b in (%%a) do for /f "tokens=1,2,3 delims=. " %%c in ('echo %%~tb') do if %%e%%d%%c LSS YYYYMMDD del "%%b" Замечания: 1. Код - одна строка! 2. Формат даты в Windows: DD.MM.YYYY 3. YYYYMMDD - заменить на необходимые или на %1 4. Enjoy!
Почти то, что я хотел... (если всё делать вручную - в точности то, что я хотел) Спасибо за идею, будет над чем в праздники подумать...
Итак, по итогам праздничных изысканий, прихожу ко мнению, что в нескольких строках в cmd-файле получить дату старше на несколько дней от сегодняшней - невозможно. P.S. А скрипт AlexV не удаляет файлы, имена которых не соответствуют DOS-формату (длиннее 8 символов). P.P.S. Пока получился скрипт, который сравнивает даты "образцового" файла и файла с файлопомойки. Если "образец" новее - сравниваемый файл удаляется. Но это тоже как-то "неаккуратненько" Ибо требует ручной модификации даты образцового файла.
Переставь кавычки в другое место: for /r "\\server\share" %%a in (*.*) do for %%b in ("%%a") do for /f "tokens=1,2,3 delims=. " %%c in ('echo %%~tb') do if %%e%%d%%c LSS YYYYMMDD del %%b И зачем с датами так извращаться? Можно "грохать" файлы за два месяца назад: YYYYMM01 или это так критично? PS: Кусок cmd-файла для работы с датами - уже стоит денег...
Количество дней устаревания - некритично. Но не сегодняшнее. Пару суток на устаревание пользоваелям всё-таки надо оставить. Критично (то есть идеал) - чтобы закинуть cmd (или vbs) файл в шедулер и забыть про него. Но в твоём варианте надо либо руками править YYYYMMDD, либо руками же запускать cmd с %1 А на ассемблере - наверняка БОЛЬШИХ денег. Только зачем так извращаться при наличии альтернативных средств создания скриптов? Я же написал - "прихожу ко мнению, что в нескольких строках в cmd-файле получить дату невозможно" Мой cmd-скрипт, работающий с датами, но с умолчанием, что в месяце 30 дней (т.е. надо тестировать, как он поведёт себя в феврале) занимает 43 строки структурированного кода. И цель уже не оправдывает средства.
При помощи отказа от прямого удаления и использования метода копирования-удаления-переименования (а может я просто плохо читал описание команды del? ) удалось сократить скрипт вдвое. Плюсы скрипта: можно задавать возраст "устаревания" файлов Минусы: файлы удаляются исходя из допущения о 30 днях в любом месяце (можно, конечно, поправить, но, повторюсь, цель не оправдывает средства). Получившийся код: Код: set link=C:\test set p01=%DATE:~0,+5% set p02=%p01:~-2% set p03=%p02:~0,+1% set p04=%p01:~-2% set p05=%DATE:~0,+1% set p06=%DATE:~0,+2% if %p03% equ 0 set p04=%p04:~-1% if %p05% equ 0 set p06=%p06:~-1% set p07=%DATE:~-4% set /A p08=%p06%-7 if %p08% LEQ 0 goto err1 set /A p06=%p08% goto next :err1 set /A p06=30+%p08% set /A p04=%p04%-1 if %p04% LEQ 0 goto err2 goto next :err2 set /A p04=12 set /A p07=%p07%-1 :next xcopy %link%\*.* /y /s /h /i /D:%p04%-%p06%-%p07% %link%2\ rd /Q /S %link%\ move /Y %link%2 %link% Критика и конструктивные предложения приветствуются
Конструктивное предложение: Хранить историю "помойки" в текстовом файле в таком виде: <вес> <дата> <полный путь к файлу1> <вес> <дата> <полный путь к файлу2> и т.д. Пример: 1 01.01.2000 "\\server\share\path\long file name1.ext" 0 02.01.2000 "\\server\share\path\long file name2.ext" и т.д. Запускается скрипт, создает новый исторический файл, походу дела инкрементирует веса или обнуляет, если изменилась дата и "грохает" файлы с любым количеством дней назад.
ForFiles.exe Простите, поздновато забрел в эту тему... ИМХО, идеально подходит стандартная утилита из Windows Support Tools - ForFiles.exe Компактная и обеспечивает всё, что вы хотели, одной строкой!
А добавить строку For each folder in oFldr.Folders Call delFiles(folder, intAge) next прямо в скрипт слабо?
Не смотря на то, что поставленная задача решена, всё же пытаюсь что-то улучшить... И потому иногда проглядываю старые темы... ForFiles.exe действительно хороша... Вот только для моего случая команда, которую необходимо запустить "CMD /C del @FILE" не срабатывает, если в пути к @FILE есть пробелы...