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

Показать сообщение отдельно

Ветеран


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

Профиль | Отправить 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