Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Удаление файлов по сети старше 7 дней, оставлять не менее 10 файлов

Ответить
Настройки темы
VBS/WSH/JS - [решено] Удаление файлов по сети старше 7 дней, оставлять не менее 10 файлов

Новый участник


Сообщения: 29
Благодарности: 2

Профиль | Отправить PM | Цитировать


Изменения
Автор: white155
Дата: 30-12-2011
Задача немного сложнее, нужно удалить все файлы по сети в расшаренной папке,
определённого разрешения, например *.zip в одной папке, старше 7 дней,
при этом оставлять не менее 10 файлов, даже если они старше 7 дней

Отправлено: 17:59, 26-12-2011

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


white155, Вы уверены насчёт «не старше»? Обычно требуется как раз наоборот — оставлять самые свежие файлы.
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:50, 28-12-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 29
Благодарности: 2

Профиль | Отправить PM | Цитировать


исправил

Отправлено: 12:10, 30-12-2011 | #3


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


white155, ясно.

Попробую и Вас приобщить к библиотеке Log Parser (Download: Log Parser 2.2 - Microsoft Download Center - Download Details).

Примерный код:
читать дальше »
Код: Выделить весь код
Option Explicit

Dim strMask

Dim objLogQuery
Dim objFileSystemInputFormat
Dim strQuery

Dim objDictionary
Dim objFSO


strMask = "E:\Песочница\0102\*.zip"

Set objLogQuery              = WScript.CreateObject("MSUtil.LogQuery")
Set objFileSystemInputFormat = WScript.CreateObject("MSUtil.LogQuery.FileSystemInputFormat")

Set objDictionary            = WScript.CreateObject("Scripting.Dictionary")
Set objFSO                   = WScript.CreateObject("Scripting.FileSystemObject")

With objFileSystemInputFormat
	.preserveLastAccTime = True
	.recurse             = False
	.useLocalTime        = True
End With

strQuery = _
	"SELECT TOP 10 LastWriteTime, Path " & _
	"FROM '" & strMask & "' " & _
	"WHERE Attributes NOT LIKE 'D________' " & _
	"ORDER BY LastWriteTime DESC"

With objLogQuery.Execute(strQuery, objFileSystemInputFormat)
	Do Until .atEnd()
		With .getRecord()
			objDictionary.Add .toNativeString(1), .toNativeString(1)
		End With
		
		.moveNext
	Loop
	
	.close
End With

strQuery = _
	"SELECT Path " & _
	"FROM '" & strMask & "' " & _
	"WHERE Attributes NOT LIKE 'D________' " & _
	"ORDER BY Path ASC"

With objLogQuery.Execute(strQuery, objFileSystemInputFormat)
	Do Until .atEnd()
		With .getRecord()
			If Not objDictionary.Exists(.toNativeString(0)) Then
				WScript.Echo .toNativeString(0)
				
				'objFSO.DeleteFile .toNativeString(0), True
			End If
		End With
		
		.moveNext
	Loop
	
	.close
End With

objDictionary.RemoveAll

Set objFSO                   = Nothing
Set objDictionary            = Nothing

Set objFileSystemInputFormat = Nothing
Set objLogQuery              = Nothing

WScript.Quit 0
Здесь:
Код: Выделить весь код
strMask = "E:\Песочница\0102\*.zip"
— путь и маска к сетевому ресурсу;
Код: Выделить весь код
With objFileSystemInputFormat
	…
	.recurse             = False
— не обрабатывать вложенные папки.

По самому алгоритму:
Код: Выделить весь код
strQuery = _
	"SELECT TOP 10 LastWriteTime, Path " & _
	"FROM '" & strMask & "' " & _
	"WHERE Attributes NOT LIKE 'D________' " & _
	"ORDER BY LastWriteTime DESC"
— выбрать поля: дату последней записи и путь (SELECT TOP 10 LastWriteTime, Path) к файлам (Attributes NOT LIKE 'D________') по указанной маске «E:\Песочница\0102\*.zip» (FROM '" & strMask & "'), отсортированным по дате последней записи в обратном порядке (ORDER BY LastWriteTime DESC). Из полученного списка отобрать только первые десять записей (TOP 10). Таким образом, мы получаем пути к файлам, которые нужно будет сохранить (не удалять).

Затем мы перебираем полученный список и заполняем им словарь «objDictionary».

Второй запрос:
Код: Выделить весь код
strQuery = _
	"SELECT Path " & _
	"FROM '" & strMask & "' " & _
	"WHERE Attributes NOT LIKE 'D________' " & _
	"ORDER BY Path ASC"
— тут просто отбираем пути всех подходящих под заданную маску файлов. Полученный список путей файлов мы перебираем и удаляем все, которые не попали в первый запрос и не содержатся в словаре (If Not objDictionary.Exists(.toNativeString(0)) … objFSO.DeleteFile .toNativeString(0), True).

Вот, собственно, и весь алгоритм.

P.S. Для удаления файлов уберите комментарий при:
Код: Выделить весь код
				'objFSO.DeleteFile .toNativeString(0), True
P.P.S. Можно, конечно, не делать два запроса, а убрать «TOP 10» первом запросе и просто пропустить при переборе первые десять файлов, а все оставшиеся файлы полученного набора — удалять.


Если у Вас есть возможность использовать PowerShell — можно попробовать и так:
читать дальше »
Код: Выделить весь код
Get-ChildItem -Path "E:\Песочница\0102\*.zip" | `
    Sort-Object -Property LastWriteTime -Descending | `
        Select-Object -Skip 10 | `
            Remove-Item -WhatIf -Force
Не правда ли, выглядит проще?!

P.S. Для реального удаления уберите параметр «-WhatIf» у команды «Remove-Item».
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:18, 30-12-2011 | #4


Новый участник


Сообщения: 3
Благодарности: 1

Профиль | Отправить PM | Цитировать


Iska, вопрос, вроде бы, несколько по другому сформулирован

оставить все файлы не старше 7дней и если их меньше 10, добавить из тех что старше 7 дней
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:53, 31-12-2011 | #5


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


introvert, осознал свою ошибку: свежих файлов может оказаться куда больше десяти. Подумаем, как и это учесть. Жаль, красоты в коде тут уже не будет .

Отправлено: 16:01, 31-12-2011 | #6


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
' Скрипт оставляет в указанной папке не менее указанного числа свежих файлов с указанным расширением (если они есть)
' Если среди оставшихся файлов имеются старше указанного кол-ва дней, они удаляются

fPath = "E:\DelShare"   ' Полное имя рабочего каталога (без слэжа \ на конце)
fExt = "bat"            ' Расширение файлов
nMin = 10               ' Минимальное число оставляемых файлов
nOld = 7                ' Старше кол-ва дней файлы удаляем

OldDate = DateAdd("d", -nOld, Date)
'   MsgBox CStr(OldDate)

Set FSO = CreateObject("Scripting.FileSystemObject")
Set Folds = FSO.GetFolder(fPath)
Set Files = Folds.Files

N = Files.Count - 1
'   MsgBox CStr(N)

If N < 0 Then
    MsgBox "В папке" + vbCrLf + fPath + vbCrLf + "файлы не найдены"
Else
    ReDim nFiles(N), dFiles(N)
    NN = -1
    For Each jf In Files
        nFiles(NN + 1) = jf.Name
        If LCase(FSO.GetExtensionName(fPath + "\" + nFiles(NN + 1))) = LCase(fExt) Then
            NN = NN + 1
            dFiles(NN) = jf.DateLastModified
        End If
    Next
    If NN < 0 Then
        MsgBox "В папке" + vbCrLf + fPath + vbCrLf + "файлы c расширением " + fExt + vbCrLf + " не найдены"
    Else
        For i = 0 To NN
            For j = i To NN
                If dFiles(i) < dFiles(j) Then
                    df = dFiles(i)
                    dFiles(i) = dFiles(j)
                    dFiles(j) = df
                    nf = nFiles(i)
                    nFiles(i) = nFiles(j)
                    nFiles(j) = nf
                End If
            Next
            '  MsgBox CStr(dFiles(i)) + " " + nFiles(i)
        Next
        If NN > nMin - 1 Then
            For i = nMin To NN
                '  MsgBox CStr(dFiles(i)) + " " + nFiles(i)
                If dFiles(i) < OldDate Then Call FSO.DeleteFile(fPath + "\" + nFiles(i), True)
            Next
        End If
    End If
    
End If
Длинновато.
1. Записываю имена и даты изменения файлов в массивы
2. Сортирую по датам по убыванию
3. Просматриваю в массиве с датами файлов элементы более минимального количества
Старые файлы удаляю

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 04-01-2012 в 00:48.

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:42, 04-01-2012 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Удаление файлов по сети старше 7 дней, оставлять не менее 10 файлов

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Нужно удалить лог файлы старше 30 дней ksv_sergo Скриптовые языки администрирования Windows 14 24-03-2016 15:02
Любой язык - Удаление файлов старше 5 дней кроме указанного по имени. Joni Скриптовые языки администрирования Windows 6 11-07-2012 11:18
[решено] Автоочистка файлов, старше 5 дней. Universal_gr Программное обеспечение Linux и FreeBSD 1 01-10-2010 01:12
Прочее - удаление файлов старше 10 дней admin666 Общий по Linux 1 23-07-2009 19:09
Удаление файлов по сети в карзину Admiral83 Сетевые технологии 1 15-02-2006 14:51




 
Переход