Последнее время я обретаюсь в материях, имеющих мало общего со скриптовыми технологиями. Однако когда ко мне обратился товарищ с просьбой написать скрипт для удаления файлов старше недели, я не раздумывая принял решение потратить на это несколько минут - мелочь, а приятно, казалось бы...
Ни разу не напрягаясь пишу несколько строчек кода и с чувством глубокого удовлетворения отправляю листинг заказчику.
Минут через 15 он вспоминает, что нужно удалять только файлы с определенным расширением - резервные копии какой-то базы данных. Нет проблем - еще пара минут и слегка подрихтованный код повторно отправляется в путешествие по просторам сети.
Спустя еще некоторое время товарищ обращается с очередной просьбой - не мешало бы удалять файлы не только из указанного каталога, но и из подкаталогов. ОК - чашка чаю, немного рекурсии - получите и распишитесь.
Как оказалось, с распиской в получении я сильно поспешил. Вскоре легенда в очередной раз обновилась. Резервные копии внезапно оказались настолько дороги заказчику, что он отказался расставаться с ними любым иным способом, кроме как через корзину. Что ж, назвался клизмой - полезай... :).
Пробираюсь к корзине через Shell.Application, перемещаю файлы в корзину с помощью метода MoveHere...Никакого эффекта.
Не засек на какой минуте недоумения мне пришла мысль проверить с помощью MsgBox какой путь получает метод MoveHere, но после добавления строчки MsgBox oFile.Path сразу за проверкой даты модификации и расширения файла, и последующего запуска скрипта я начал что-то подозревать. Скрипт переместил все файлы кроме одного. В завершение, заменив MsgBox на WScript.Sleep и переместив эту строку на этаж ниже я получил рабочий код.
Позже я вспомнил, что уже встречался с подобным поведением методов Shell.Application - в скрипте создания zip-архивов.
- методы Shell.Application (по крайней мере некоторые из них) выполняются асинхронно, поэтому следует принимать во внимание, что скрипт может завершить свою работу прежде, чем они успеют отработать
- в процессе планирования решения казалось бы самых несложных задач следует делать по возможности максимальный "ефрейторский зазор" :)
Ни разу не напрягаясь пишу несколько строчек кода и с чувством глубокого удовлетворения отправляю листинг заказчику.
Минут через 15 он вспоминает, что нужно удалять только файлы с определенным расширением - резервные копии какой-то базы данных. Нет проблем - еще пара минут и слегка подрихтованный код повторно отправляется в путешествие по просторам сети.
Спустя еще некоторое время товарищ обращается с очередной просьбой - не мешало бы удалять файлы не только из указанного каталога, но и из подкаталогов. ОК - чашка чаю, немного рекурсии - получите и распишитесь.
Как оказалось, с распиской в получении я сильно поспешил. Вскоре легенда в очередной раз обновилась. Резервные копии внезапно оказались настолько дороги заказчику, что он отказался расставаться с ними любым иным способом, кроме как через корзину. Что ж, назвался клизмой - полезай... :).
Пробираюсь к корзине через Shell.Application, перемещаю файлы в корзину с помощью метода MoveHere...Никакого эффекта.
Не засек на какой минуте недоумения мне пришла мысль проверить с помощью MsgBox какой путь получает метод MoveHere, но после добавления строчки MsgBox oFile.Path сразу за проверкой даты модификации и расширения файла, и последующего запуска скрипта я начал что-то подозревать. Скрипт переместил все файлы кроме одного. В завершение, заменив MsgBox на WScript.Sleep и переместив эту строку на этаж ниже я получил рабочий код.
'''''''''''''''''''''''''''''''''''''''''''''''' ' Удаляем файлы в корзину по дате и расширению '''''''''''''''''''''''''''''''''''''''''''''''' sFolderPath = "c:\temp\" 'каталог с файлами 'текущая дата минус количество дней = дата, старше которой надо удалять dDateDif = DateAdd("d", -7, Date) sExt = "vbs" 'расширение Set fso = CreateObject("Scripting.FileSystemObject") Set recyclebin = CreateObject("Shell.Application").Namespace(10) DeleteOlderThan sFolderPath Function DeleteOlderThan(sPath) For Each oFile In fso.GetFolder(sPath).Files If oFile.DateLastModified < dDateDif And LCase(fso.GetExtensionName(oFile.Name)) = LCase(sExt) Then 'перемещаем файлы в корзину recyclebin.MoveHere(oFile.Path) 'без Sleep - никак, если файлы большого размера - добавляем миллисекунд WScript.Sleep 10 End If Next For Each oFolder In fso.GetFolder(sPath).SubFolders DeleteOlderThan oFolder.Path Next End FunctionОтправляю листинг по известному адресу с наилучшими пожеланиями. Ракетные шахты открыты - несколько минут превратились чуть ли не в час времени :).
Позже я вспомнил, что уже встречался с подобным поведением методов Shell.Application - в скрипте создания zip-архивов.
'''''''''''''''''''''''''''''''''''''''''''''''' ' Архивируем все файлы текущего каталога '''''''''''''''''''''''''''''''''''''''''''''''' sZipFolderPath = "c:\temp" 'каталог для zip-архивов With CreateObject("Scripting.FileSystemObject") 'путь к текущему каталогу sFolderPath = .GetParentFolderName(WScript.ScriptFullName) 'путь к zip-архиву sZipPath = sZipFolderPath & "\" & .GetBaseName(sFolderPath) & ".zip" 'создаем пустой zip-файл .CreateTextFile(sZipPath, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar) End With 'копируем файлы в архив With CreateObject("Shell.Application") .NameSpace(sZipPath).CopyHere .NameSpace(sFolderPath).Items End With 'без Sleep - никак, если размер каталога большой - добавляем секунд WScript.Sleep 1000Вывод:
- методы Shell.Application (по крайней мере некоторые из них) выполняются асинхронно, поэтому следует принимать во внимание, что скрипт может завершить свою работу прежде, чем они успеют отработать
- в процессе планирования решения казалось бы самых несложных задач следует делать по возможности максимальный "ефрейторский зазор" :)
Комментариев нет:
Отправить комментарий
Комментарий будет опубликован после модерации