2

这是我的功能不起作用。它永远不会到达 delete 调用,因为 if 语句永远不会评估 true,我不知道为什么。

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
4

2 回答 2

2

什么都没有被删除的原因可能是你定义的fso

Set fso = CreateObject ("Scripting.FileSystemObject")

但随后使用objFSO

objFSO.DeleteFolder folder, True

并且在你的脚本中有一个On Error Resume Next其他地方(永远不要使用它,除非你确切地知道你在做什么并且有合理的错误处理代码)。

一些旁注(与实际问题无关,但值得考虑):

  • 始终使用Option Explicit. 没有例外。
  • 可以folder.DateCreated直接在DateDiff(). 无需格式化值。
  • 你的函数不返回任何东西,所以你最好把它变成一个过程。

您的程序的简化版本可能如下所示。

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
于 2013-02-25T17:27:11.637 回答
0

你的陈述

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

是错误的、有风险的和不必要的。第二个参数——

命名格式 可选。表示使用的日期/时间格式的数值。如果省略,则使用 vbGeneralDate。

数字,应该通过预定义的常量vbGeneralDate, ... 给出。

结果字符串是否正确转换为所需的日期DateDiff()是一个悬而未决的问题。所以使用一致的类型

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

问题的另一个可能原因是DateDiff()'语义:

如果 date1 指的是比 date2 更晚的时间点,则 DateDiff 函数返回一个负数。

你以什么身份通过maxAgeInDays

于 2013-02-25T17:21:54.357 回答