1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.

Скрипт удаления старых файлов в локальной сети

Тема в разделе "Программирование", создана пользователем граф Глюкалоff, 03.11.05.

  1. граф Глюкалоff

    граф Глюкалоff Активный участник

    4.133
    1
    Имеется в локальной сети файлопомойка.
    Хотелось бы поместить в шедулер скритп, который удалял бы все файлы, старше определенного возласта (исходя из даты создания файла)

    Нашел такой скрипт:

    Код:
    '=========================================================
    '
    ' DESC: Delete files in a directory older than the specified 
    '	number of days
    '
    ' USAGE: Call delFiles("SOURCE DIR", #DAYS)
    '
    '
    ' AUTHOR: Todd Woolums ([email protected])
    ' 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
    Работает.
    Но если есть каталоги - скрипт их не видит.

    Посоветуйте, что надо исправить (или может у кого есть готовый скрипт), чтобы удалялись файлы и внутри каталогов. Но каталоги оставались нетронутыми.
     
  2. AlexV

    AlexV Гость

    Одной строкой для 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!
     
  3. граф Глюкалоff

    граф Глюкалоff Активный участник

    4.133
    1
    Почти то, что я хотел... :) (если всё делать вручную - в точности то, что я хотел) :gigi:

    Спасибо за идею, будет над чем в праздники подумать...
     
  4. граф Глюкалоff

    граф Глюкалоff Активный участник

    4.133
    1
    Итак, по итогам праздничных изысканий, прихожу ко мнению, что в нескольких строках в cmd-файле получить дату старше на несколько дней от сегодняшней - невозможно. :(

    P.S. А скрипт AlexV не удаляет файлы, имена которых не соответствуют DOS-формату (длиннее 8 символов).

    P.P.S. Пока получился скрипт, который сравнивает даты "образцового" файла и файла с файлопомойки. Если "образец" новее - сравниваемый файл удаляется. Но это тоже как-то "неаккуратненько" :) Ибо требует ручной модификации даты образцового файла.
     
    Последнее редактирование: 07.11.05
  5. AlexV

    AlexV Гость

    Переставь кавычки в другое место:

    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-файла для работы с датами - уже стоит денег...
     
  6. граф Глюкалоff

    граф Глюкалоff Активный участник

    4.133
    1
    Количество дней устаревания - некритично. Но не сегодняшнее. Пару суток на устаревание пользоваелям всё-таки надо оставить.

    Критично (то есть идеал) - чтобы закинуть cmd (или vbs) файл в шедулер и забыть про него. Но в твоём варианте надо либо руками править YYYYMMDD, либо руками же запускать cmd с %1 :)

    А на ассемблере - наверняка БОЛЬШИХ денег. :gigi:
    Только зачем так извращаться при наличии альтернативных средств создания скриптов? :)

    Я же написал - "прихожу ко мнению, что в нескольких строках в cmd-файле получить дату невозможно"
    Мой cmd-скрипт, работающий с датами, но с умолчанием, что в месяце 30 дней (т.е. надо тестировать, как он поведёт себя в феврале) занимает 43 строки структурированного кода. И цель уже не оправдывает средства. :)
     
  7. граф Глюкалоff

    граф Глюкалоff Активный участник

    4.133
    1
    При помощи отказа от прямого удаления и использования метода копирования-удаления-переименования (а может я просто плохо читал описание команды 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%
    Критика и конструктивные предложения приветствуются :)
     
  8. AlexV

    AlexV Гость

    Конструктивное предложение:

    Хранить историю "помойки" в текстовом файле в таком виде:

    <вес> <дата> <полный путь к файлу1>
    <вес> <дата> <полный путь к файлу2>
    и т.д.

    Пример:

    1 01.01.2000 "\\server\share\path\long file name1.ext"
    0 02.01.2000 "\\server\share\path\long file name2.ext"
    и т.д.

    Запускается скрипт, создает новый исторический файл, походу дела инкрементирует веса или обнуляет, если изменилась дата и "грохает" файлы с любым количеством дней назад.
     
  9. Alex Mart

    Alex Mart Гость

    ForFiles

     
  10. Alex Mart

    Alex Mart Гость

    ForFiles.exe

    Простите, поздновато забрел в эту тему... ИМХО, идеально подходит стандартная утилита из Windows Support Tools - ForFiles.exe
    Компактная и обеспечивает всё, что вы хотели, одной строкой!
     
  11. jek

    jek Активный участник

    5.732
    0
    А добавить строку
    For each folder in oFldr.Folders
    Call delFiles(folder, intAge)
    next
    прямо в скрипт слабо?
     
  12. граф Глюкалоff

    граф Глюкалоff Активный участник

    4.133
    1

    Не смотря на то, что поставленная задача решена, всё же пытаюсь что-то улучшить... И потому иногда проглядываю старые темы... :)

    ForFiles.exe действительно хороша...

    Вот только для моего случая команда, которую необходимо запустить
    "CMD /C del @FILE"
    не срабатывает, если в пути к @FILE есть пробелы...
     
  13. Caleb

    Caleb Участник

    166
    0
    Поставь прогу xStarter и не парься :)