Консультация № 185290
24.01.2012, 19:28
0.00 руб.
25.01.2012, 05:41
0 4 1
Здравствуйте! У меня возникли сложности с таким вопросом:
В предыдущем вопросе я интересовался, как можно в Bat-файле удалить в папке все файлы, кроме нескольких наиболее свежих. Ответ я получил. Спасибо! Но меня на работе раскритиковали за то, что я использую такое устаревшее средство, как батники. А нельзя ли эту же задачу решить посредством скрипта vbs?

Обсуждение

Неизвестный
24.01.2012, 19:57
общий
Батники - вполне разумное средство для Ваших целей. И это лучше, чем vbs, на мой взгляд.
Неизвестный
27.01.2012, 13:59
общий
это ответ
Здравствуйте, Петрович!

Переношу свой дополненный ответ из форума. В приложении символ "" отображается некорректно.
Код работоспособен - проверил.

ps. исправил ошибку в закомментированной строке удаления файла.

С уважением.

Приложение:
option explicit
dim fso
dim dso

dim spis
dim dat

dim tekkatalog, tekfile

dim tempfile, teknom
dim i,i1,i2

'это константа текущего пути и количества оставляемых файлов
tekkatalog="I:\Jiteli\Mail\2"
tekfile=3

'создаем список файлов в текущем каталоге
Set fso = CreateObject("Scripting.FileSystemObject")
set dso=fso.getfolder(tekkatalog)

'количество файлов заносим в переменную
teknom=dso.files.count

'создаем массивы имен и дат
redim spis(teknom)
redim dat(teknom)
i=1
for each tempfile in dso.files
'для каждого файла из списка заносим его имя и дату создания в массивы
spis(i)=tempfile.name
dat(i)=tempfile.datecreated
'кроме даты создания ( DateCreated ) можно сравнивать по дате модификации ( DateLastModified ) или доступа ( DateLastAccess )
i=i+1
next

'сортировка в массиве по дате создания
'первым идет самый свежий файл
for i=teknom to 2 step -1
for i1=2 to i
if dat(i1-1) < dat(i1) then
i2=spis(i1-1)
spis(i1-1)=spis(i1)
spis(i1)=i2
i2=dat(i1-1)
dat(i1-1)=dat(i1)
dat(i1)=i2
end if
next
next

' на выходе имеем массив имен, отсортированный по уменьшению дат

for each tempfile in dso.files
'проверяем каждый файл из списка на разрешение для удаления
for i=(tekfile+1) to teknom
if spis(i)=tempfile.name then
'можно поставить проверку аттрибутов и снятие признаков "для чтения" "системный" "скрытый"
'и удалить файл - следующие 4 команды
' if tempfile.attributes and 1 then tempfile.attributes=tempfile.attributes-1
' if tempfile.attributes and 2 then tempfile.attributes=tempfile.attributes-2
' if tempfile.attributes and 4 then tempfile.attributes=tempfile.attributes-4
' tempfile.deletefile (tekkatalog & "" & spis(i))
'а можно сразу удалять
fso.deletefile (tekkatalog & "" & spis(i)),true
exit for
end if
next
next
5
Спасибо большое! Буду разбираться! Но по сравнению с bat-файлом как-то сложновато :-(
Неизвестный
27.01.2012, 16:13
общий
27.01.2012, 20:14
Цитата: Петрович
...Но по сравнению с bat-файлом как-то сложновато :-(


на самом деле больше мудрено в bat-файле. там это все делается через параметры, содержимое констант и прочее. причем сама запись переменных и их значений довольно сложная. и полные справочники по командам сложно найти.

в VBScript делается за большее количество действий, но каждое действие полностью описывается и интуитивно понятно.
давно
Модератор
137394
1850
27.01.2012, 20:19
общий
27.01.2012, 20:22
В утилитах командной строки хоть хелп есть ( команда /?). А попробуйте быстро получить справку по по WSH ... И не дай бог не предусмотреть обработку возможных ошибок. Чтобы не выбрасывать в корзину для общего доступа приведу и своё решение. По методике == с Вашим, чуть сортировку по другому делаю - мне кажется, у меня экономнее
Код:
MyFolder = "E:\DelTmp\Тестовая папка"
nNew = 6

Set FSO = CreateObject("Scripting.FileSystemObject")
Set Folder = FSO.GetFolder(MyFolder)
Set Files = Folder.Files

N = Files.Count 'Определяем кол-во файлов в директории
ReDim fName(N - 1), fDttm(N - 1)

i = -1
For Each f In Files
i = i + 1
fName(i) = f.Name 'Заносим имена файлов в массив
fDttm(i) = f.DateLastModified 'Заносим дату-время последней модификации файлов в массив
Next

If nNew < N Then

For i = 0 To nNew - 1 'Сортируем имена файлов дате-времени последней модификации
For j = i To N - 1
If fDttm(i) < fDttm(j) Then
fD = fDttm(i)
fDttm(i) = fDttm(j)
fDttm(j) = fD
fN = fName(i)
fName(i) = fName(j)
fName(j) = fN
End If
Next
Next

For i = nNew To N - 1
FSO.DeleteFile MyFolder + "" + fName(i), True ' Удаляем файлы, с именами не попавшими в первые nNew элементов массива
Next

End If

MsgBox "Обработка папки" + vbCrLf + MyFolder + vbCrLf + "завершена"

Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Форма ответа