VB Script Files Коллекция - PullRequest
0 голосов
/ 03 мая 2011

Я работаю над некоторой логикой, которая удалит файлы из определенной папки, если дисковое пространство достигнет определенной максимальной емкости, у меня есть следующий код:

    'Remove files if disk space falls below 100GB
        While hDisk.FreeSpace < 100000000000
            Set Directory = Fso.GetFolder("C:\backups")
            Set Files = Directory.Files
            Dim file1
            Dim file2
            For n = Files.Count - 1 to 0 Step - 1
            If IsEmpty(file1) or IsNull(file1) Then
ERROR Here -->Set file1 = Files.Item(n)
            ElseIf n > 0 Then
                Set file2 = Files.Item(n)
                If hDisk.FreeSpace > 100000000000 Then 
                    Exit For
                ElseIf file2.DateLastModified < file1.DateLastModified And DateDiff("D", file2.DateLastModified, Now) > 7 Then 
                    file2.Delete
                ElseIf file1.DateLastModified < file2.DateLastModified And DateDiff("D", file1.DateLastModified, Now) > 7 Then 
                    file1.Delete
                    Set file1 = Files.Item(n)
                Else
                    'Nothing
                End If
            Else
                'Nothing
            End If
           Next
        Wend 'End loop when drive is below max capacity

То, что он должен сделать, это перебрать коллекцию файлов в папке и удалить самые старые файлы, пока дисковое пространство не превысит емкость. Таким образом, есть некоторое сравнение файлов, которое должно быть сделано. Я обнаружил ошибку Недопустимый вызов процедуры или аргумент в строке выше (см. Комментарий). Я также хотел бы знать, если это лучший подход, я открыт для лучших предложений, предпочтительно те, которые будут сокращать код.

UPDATE:

Пробовал добавлять Set перед оператором присваивания, но все равно получал ту же ошибку.

ОБНОВЛЕНИЕ 2 (РАБОЧИЙ СЦЕНАРИЙ !!):

Поиграл с ним немного больше и смог заставить скрипт работать, здесь он полностью на тот случай, если кто-то еще захочет его использовать. Я добавил комментарии, чтобы указать пользовательские значения, можно смело предположить, что любое другое подобное значение также можно настраивать, то есть размер диска определяется в нескольких местах.

Dim Fso
Dim hDisk
Dim Directory
Dim Files
Dim myArray()

Set Fso = CreateObject("Scripting.FileSystemObject")
Set hDisk = Fso.GetDrive("c:") 'Custom Value - drive to monitor

If hDisk.FreeSpace < 100000000000 Then
    'Delete files until free space is below max capacity (defined here as 100GB)
    While hDisk.FreeSpace < 100000000000 'Custom Value - disk size in bytes
        Set Directory = Fso.GetFolder("C:\backups") 'Custom Value - Directory to monitor
        Set Files = Directory.Files
        Redim myArray(Files.Count)
        i=0
        For Each fl in Files
          Set myArray(i)=fl
          i=i+1
        Next

        Dim file1
        Dim file2
        For n = Files.Count - 1 to 0 Step - 1
            '1st PASS: Instantiate first file
            If IsEmpty(file1) or IsNull(file1) Then
                Set file1 = myArray(n)
            'Compare 1st file with next file and current date, remove oldest if it's older than a week
            ElseIf n > 0 Then
                Set file2 = myArray(n)
                If hDisk.FreeSpace > 100000000000 Then 
                    Exit For
                ElseIf file2.DateLastModified < file1.DateLastModified And DateDiff("D", file2.DateLastModified, Now) > 7 Then 'Custom Value - File age in number of days
                    file2.Delete
                ElseIf file1.DateLastModified < file2.DateLastModified And DateDiff("D", file1.DateLastModified, Now) > 7 Then 
                    file1.Delete
                    Set file1 = myArray(n)
                Else
                    'Nothing
                End If
            'Remove remaining file if it's older than a week
            Else
                Set file1 = myArray(n)
                If DateDiff("D", file1.DateLastModified, Now) > 7 Then
                file1.Delete
                End If
            End If
        Next
    Wend 'End loop when drive is below max capacity
End If

ОБНОВЛЕНИЕ 3:

Чтобы пояснить, что делается, псевдокод выглядит следующим образом:

If disk space is maxed
    While disks space is maxed
    For each file
     If 1st File is empty
      Get 1st File
      If disk space is below max
         Exit
      Else Get Next File
         If Next File is older than 1st File and older than a week
         Delete Next File
         Continue
      Else if 1st File is older  and older than a week
         Delete current 1st File
         Set 1st File to Next File
         Continue
      Else if 1st file is the only file and is older than a week
         Delete 1st File

1 Ответ

1 голос
/ 04 мая 2011

Изобретая колесо. Вы пытаетесь создать сценарий для выполнения задачи, которая уже существует в Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...