2013-02-25 116 views
1

這是我的功能不起作用。它永遠不會進入刪除調用,因爲if語句永遠不會評估爲真,我無法弄清楚原因。刪除年齡大於特定年齡的文件夾

Function DeleteOldFolders(root, maxAgeInDays) 

    Dim fso, ofolder, subFolders 
    Set fso = CreateObject ("Scripting.FileSystemObject") 

    If fso.FolderExists(root) Then 

     Set ofolder = fso.GetFolder(root) 
     Set subFolders = ofolder.SubFolders 

     For Each folder in subFolders 
      createdDate = FormatDateTime(folder.DateCreated, "2") 

      If (DateDiff("d", createdDate, Date) > maxAgeInDays) Then 

       objFSO.DeleteFolder folder, True 

      End If 
     Next 

    End If 

    Set objFSO = Nothing 

End Function 

回答

2

爲什麼沒有被刪除的原因可能是你定義fso

Set fso = CreateObject ("Scripting.FileSystemObject") 

但隨後使用objFSO

objFSO.DeleteFolder folder, True 

,並在您的腳本(永遠,永遠使用有On Error Resume Next別處除非你知道正好你在做什麼有合理的錯誤處理代碼)。

一些側面說明(無關的實際問題,但值得考慮):

  • 始終使用Option Explicit。沒有例外。
  • 您可以直接在DateDiff()中使用folder.DateCreated。不需要格式化該值。
  • 你的函數不返回任何東西,所以你最好使它成爲一個過程。

你的程序的simpified版本看起來是這樣的。

Sub DeleteOldFolders(root, maxAgeInDays) 
    Dim fso, folder 

    Set fso = CreateObject("Scripting.FileSystemObject") 

    If fso.FolderExists(root) Then 
    For Each folder in fso.GetFolder(root).SubFolders 
     If DateDiff("d", folder.DateCreated, Date) > maxAgeInDays Then 
     folder.Delete True 
     End If 
    Next 
    End If 

    Set fso = Nothing 
End Sub 
0

你的陳述

createdDate = FormatDateTime(folder.DateCreated, "2") 

是錯誤的,危險的,也是不必要的。第二個參數 -

NamedFormat可選。指示使用的日期/時間 格式的數字值。如果省略,則使用vbGeneralDate。

數字,並應通過預先定義的常量vbGeneralDate給予,...。

無論所得被正確地轉換成由DateDiff()所需的日期是個懸而未決的問題。因此,使用一貫類型

If (DateDiff("d", folder.DateCreated, Date) > maxAgeInDays) Then 

的問題的另一個可能的原因是DateDiff()'語義學:

如果DATE1指稍後的時間點比date2的,該則DateDiff函數 返回負數。

你作爲maxAgeInDays通過了什麼?