Добрый день.
Francyz пишет:Сейчас выдалась опять эта ошибка, в текстовый записался пусть, на котором он остановился
C:\Documents and Settings\All Users\Application Data\Kaspersky Lab\AVP60MP4\Data\Updater\Temporary Files\temporaryFolder\bases\ids\ForDiff
Непонятно почему он прервался и отобразилась ошибка. В скрипте же вроде указано чтобы он игнорировал ошибки и продолжал работу.
Ошибка 800A0035, как и указано в описании, сообщает об отутствии файла. В стр. 40 происходит попытка удаления файла - лучше в лог писать именно полное имя файла(strFullMask) а не папки. У меня уже KES, но пути те же и в данной папке расположен единственный файл ah-0607g.xml.dif. Это имя не подпадает ни под одну из указанных при первом вызове процедуры масок. Что-то мне подсказывает, что ошибка происходит при
strFullMask = "C:\Documents and Settings\All Users\Application Data\Kaspersky Lab\AVP60MP4\Data\Updater\Temporary Files\temporaryFolder\bases\ids\ForDiff\*.log", т.е. ошибка при первом вызове процедуры(когда удаляются не все файлы, а по конкретной маске).
Возникновение ошибки вполне закономерно. Странно что игнорируется "On Error Resume Next"... Похожее поведение описано при использовании обработчика ошибок, но к "On Error Resume Next", как мне кажется, это не подходит. Однако, может быть стоит отключать игнорирование ошибок перед рекурсивным вызовом? Могу ошибаться, в "искусственных" условиях имитировать такое поведение для "On Error Resume Next" я не смог, но вдруг поможет?
Не пойму смысла этого фрагмента:
Err.Clear
For Each objSubFolder In objFolder.SubFolders
If Err.Number = 0 Then
RecourseDeleteByMask objSubFolder, strMasks
Else
Err.Clear
End If
Next
Сначала сбросили все ошибки, а потом проверяем "если ошибок нет, то ..." - зачем? objFolder у нас имеется, и даже если подпапок там нет objFolder.SubFolders вернёт Folders а не ошибку.
Может быть заменить этот кусок на такой?
Err.Clear
On Error GoTo 0
For Each objSubFolder In objFolder.SubFolders
RecourseDeleteByMask objSubFolder, strMasks
Next
Francyz пишет:сделал так чтобы записывался путь, который в данный момент обрабатывается, но проблема в том, что в текстовом он заменяется
Чтобы логфайл не перезаписывался, нужно всё-таки использовать fso.OpenTextFile(как Вы изначально и писали), а не CreateTextFile(с учётом второго параметра он естественно создаётся поверх имеющегося). И наверное лучше открыть файл один раз, при старте скрипта, а дальше уже только писать туда. В конце работы скрипта файл закрыть.
Вместо "ts.Write sData & chr(13) & chr(10)" проще будет "ts.WriteLine sData". Также вместо "chr(13) & chr(10)" можно использовать vbCrLf.
pushok.88 пишет:Честно, всю голову сломал, но так и не понял каким образом воплотить данную идею.
Я понимаю, что надо использовать DateLastModified, но как это реализовать в данном коде не имею понятия.
Пример работы с "возрастом" файла:
Dim fso
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Dim File
For Each File in fso.GetFolder("d:\aScripts\vbs\tmp\").Files
If DateDiff("d", File.DateLastModified, Now) > 7 then 'если возраст более 7 дней
'удаляем/копируем/покоряем мир
End If
Next
Разницу между "d" и "y" не понял - для файла 2009-го года и для файла текущего года оба варианта дают одинаковый результат. Похоже разницы нет:
To calculate the number of days between date1 and date2, you can use either Day of year ("y") or Day ("d").
С предложением alexii я согласен - лучше перебирать файлы в папке и обрабатывать каждый по необходимым критериям.
P.S. Учитывая вызов процедуры для конкретных папок профиля, я не вижу смысла в рекурсивной чистке начиная с корня диска. Лучше натравливать скрипт на известные места скопления временных файлов, чем обрабатывать весь диск, рискуя удалить что-то, что удалять не следует.
P.P.S. Наткнулся на сайт с описанием ошибок - Code 800 Errors in VBScript / WSH, может кому-то будет полезен. Ну и MSDN:Core Visual Basic Language Errors(это VB6, но думаю и для VBS они же будут).