Kastrulya0001
@Kastrulya0001

Как написать скрипт (.bat) для удаления файлов кроме последнего?

В папку раз в час падают bakи, которые сервер поднимает и надо скриптик который бы подчищал все файлы в папке, кроме последнего. Последнее, что удалось, это скрипт который чистит все старше одного дня, но это не годится, надо оставлять только один файл, в крайнем случае за последние 2 часа. Вот скрипт:

@ECHO OFF
REM Удаляем файлы (@isdir==FALSE) старше одного дня (-d -1)
FORFILES -p "D:\AutoBackup" -s -m * -d -1 -c "CMD /C if @isdir==FALSE DEL /f /q @path"
EXIT /B 0


Указать время кратное часу там не выходит, поэтому ищу другое решение.
  • Вопрос задан
  • 9916 просмотров
Пригласить эксперта
Ответы на вопрос 2
На первом шаге запустить FOR или FORFILES с сортировкой по возрастанию времени модификации файла; в теле этого FOR-а присваивать какой-то переменной найденное имя.

После прохождения первого цикла в переменной будет имя последнего файла.

На втором шаге запустить FOR или FORFILES по всем файлам; в теле этого FOR-а удалять все файлы, если их имя не совпадает с переменной-результатом из первого шага.
Ответ написан
Комментировать
Kastrulya0001
@Kastrulya0001 Автор вопроса
В итоге сваяли vbs скрипт выполняющий данную процедуру, время запуска прописали в виндовом шедулере.
Прилагаю код, наверняка пригодится кому-нибудь, в первой строчке надо прописать свою папку которую надо очищать:

WorkDir="D:\AutoBackup"
set fso = createobject("scripting.filesystemobject")  
set sha = createobject("shell.application")  
set dir = sha.namespace(WorkDir)  

' Определяем файл с максимальной датой
set arr = dir.items  
arr.filter 192, "*.bak"  
for i = 0 to arr.count - 1  
   if i = 0 then
      set fnewest = fso.getfile(arr.item(i).path)
   else
      if fnewest.datecreated < fso.getfile(arr.item(i).path).datecreated then  
         set fnewest = fso.getfile(arr.item(i).path)  		'получаем последний полный бэкап
      end if  
   end if  
next

''''''''''''''''''''''''''''''''''

' Удаляем файлы, кроме последнего
Set filesys = CreateObject("Scripting.FileSystemObject")
Set objFolder = filesys.GetFolder(WorkDir)
For Each File in objFolder.Files

'If LCase(filesys.GetExtensionName(File)) = "bak" AND _
'DateDiff("D", File.DateLastModified, Now) > 7 Then
'File.Delete true
'End If
If fnewest = File Then
	d1 = File.Name
	'MsgBox "Последний файл: " &d1
else
	d2 = File.Name
	File.Delete true
end if

Next
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы