#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