Не удаляйте папку, пока возраст всех файлов в папке не превысит 24 часов

#windows #vbscript

#Windows #vbscript

Вопрос:

У меня проблема с моим файлом vsb. Я пытаюсь создать скрипт, который удаляет все файлы и папки старше 24 часов, но он НЕ должен удалять каталог, пока все файлы в нем не станут старше 24 часов. Проблема с моим скриптом заключается в том, что он удаляет все каталоги, даже если в нем есть файлы моложе 24 часов. Я действительно не могу найти решение своей проблемы, я искал в Google, но ничего не помогло. Это мой сценарий :

     Const strPath = "D:sharedtemp"
Dim objFSO
Set objFSO = CreateObject("Scripting.FileSystemObject")
Call Search (strPath)
Sub Search(str)
 Dim objFolder, objSubFolder, objFile
 Set objFolder = objFSO.GetFolder(str)
 For Each objFile In objFolder.Files
  If objFile.DateCreated < (Now() - 1) Then
   objFile.Delete(True)
  End If
 Next
 For Each objSubFolder In objFolder.Subfolders 
  Flag = ""
  If objSubFolder.DateCreated < (Now() - 1) Then
   For Each Thing in objSubFolder
    If thing.DateCreated > Now() - 1 then Flag="yes"
   Next
   If Flag = "yes" then objSubFolder.Delete(True)
  End If
 Next
End Sub
 

Если кто-нибудь здесь знает, что я могу изменить в своем сценарии, чтобы он заработал, я был бы очень признателен за помощь.

Ответ №1:

Если вы удаляете только файлы старше указанного предела, а папки следует удалять только в том случае, если все файлы внутри соответствуют предыдущему условию, сначала удалите соответствующие файлы, а затем удалите папки, только если они пусты.

 Option Explicit

Dim strPath
    strPath = "d:sharedtemp"

    Call removeOldFiles( strPath, DateAdd("h", -24, Now()), False )

Sub removeOldFiles( ByVal currentFolder, timeLimit, deleteFolder )
    ' Retrieve a reference to currentFolder if it is not a FSO.Folder
    If TypeName( currentFolder ) <> "Folder" Then 
        With WScript.CreateObject("Scripting.FileSystemObject")
            If .FolderExists( currentFolder ) Then 
                Set currentFolder = .GetFolder( currentFolder )
            Else 
                Exit Sub
            End If 
        End With
    End If

    ' Remove files older than timeLimit
    Dim oFile    
    For Each oFile In currentFolder.Files 
        If oFile.DateCreated < timeLimit Then 
            Call oFile.Delete( True )
        End If
    Next 

    ' Recursive call to clean each subfolder
    Dim oSubFolder    
    For Each oSubFolder In currentFolder.Subfolders
        Call removeOldFiles( oSubFolder, timeLimit, True )
    Next 

    ' If the folder is old enough and it is empty, remove it
    If  currentFolder.DateCreated < timeLimit _ 
        And currentFolder.Files.Count = 0 _ 
        And currentFolder.SubFolders.Count = 0 _ 
        And deleteFolder _ 
    Then 
        Call currentFolder.Delete( True )
    End If
End Sub 
 

Если вам нужно сохранить все файлы / папки, пока все не станет старше, а затем удалить все, тогда вам нужно сначала проверить все

 Option Explicit

Dim strPath
    strPath = "d:sharedtemp"

    Call removeOldFolder( strPath, DateAdd("h", -24, Now()) )

Sub removeOldFolder( ByVal currentFolder, timeLimit )
    If recurseCheckOldData( currentFolder, timeLimit ) Then 
        Call currentFolder.Delete( True )
    End If 
End Sub

Private Function recurseCheckOldData( ByRef currentFolder, timeLimit )
    ' Until everything is checked, the data is considered newer than timeLimit
    recurseCheckOldData = False

    ' Retrieve a reference to currentFolder if it is not a FSO.Folder
    If TypeName( currentFolder ) <> "Folder" Then 
        With WScript.CreateObject("Scripting.FileSystemObject")
            If .FolderExists( currentFolder ) Then 
                Set currentFolder = .GetFolder( currentFolder )
            Else 
                Exit Function
            End If 
        End With
    End If

    ' Check current folder time
    If  currentFolder.DateCreated > timeLimit Then 
        Exit Function
    End If 

    ' Check current folder files
    Dim oFile    
    For Each oFile In currentFolder.Files 
        If oFile.DateCreated > timeLimit Then 
            Exit Function
        End If
    Next 

    ' Recursive call to check each subfolder
    Dim oSubFolder
    For Each oSubFolder In currentFolder.Subfolders
        If Not recurseCheckOldData( oSubFolder, timeLimit ) Then 
            Exit Function
        End If 
    Next 

    ' Up to now everything is older than the indicated time
    recurseCheckOldData = True
End Function
 

Комментарии:

1. да! Спасибо! первый сценарий, который вы написали, мне нужен! Но единственная проблема заключается в том, что скрипт удаляет «temp», если в нем нет папок или файлов, чего я не хочу, чтобы он делал. Каталог «temp» всегда должен оставаться там и никогда не удаляться. Есть ли способ это исправить?

2. @E.Karlsson, включите дополнительный аргумент (например deleteFolder ) в removeOldFiles подраздел, чтобы указать, нужно ли удалять папку. Передача False при вызове вложенного модуля и True в рекурсивном вызове из цикла вложенных папок. Измените последнее условие, чтобы включить And deleteFolder . Внутренние вызовы удалят вложенные папки, но первоначальный вызов сохранит их.

3. Извините, я новичок в этом, я не совсем понимаю, где вы хотите, чтобы я поместил это в код, как вы включаете дополнительный аргумент? Где я могу найти последнее условие?

4. @E.Karlsson, первый пример кода обновлен с указанными изменениями

5. ах, я вижу, какие изменения вы внесли. Большое вам спасибо! Теперь он работает отлично!

Ответ №2:

 For Each objSubFolder In objFolder.Subfolders
    Flag = ""   
    If objSubFolder.DateCreated < (Now() - 1) Then
        For Each Thing in objSubFolder
            If thing.DateCreated > Now() - 1 then Flag="yes"
        Next
        If Flag = "yes" then objSubFolder.Delete(True)
    End If
Next
 

Комментарии:

1. Я добавил сценарий, который вы написали, но теперь, когда я пытаюсь запустить скрипт в планировщике задач, он говорит только «Задача выполняется в данный момент. (0x41301)»

2. Щелкните его правой кнопкой мыши в TS и выберите ОСТАНОВИТЬ

3. я сделал это, но это не привело к удалению файлов, которые должны были быть удалены. Возможно, я сделал что-то не так в скрипте, вот как это выглядит :

4. nvm это слишком долго, чтобы вставить комментарий

5. когда я пытаюсь запустить скрипт вручную, он выдает строку: 19 Символ: 4 Ошибка: объект не поддерживает это свойство или метод, код: 800A01B6