以下的程式可以包裝成 .vbs 檔, 然後設定到每日排程去執行.
Dim oFS
Dim oFSFolder
Dim sPath, sFlagPath, nExpireDays
Dim dFlagDate
' 根目錄
sPath = "D:\test"
' 用來比對資料是否過期的 flag 檔案
sFlagPath = sPath & "\flag"
' 預設3天前的資料夾算是過期的資料夾
nExpireDays = -3
Set oFS = CreateObject("Scripting.FileSystemObject")
' 判斷根目錄是否存在
If Not oFS.FolderExists(sPath) Then
Set oFS = Nothing
WScript.Quit 0
End If
' 讀取後續要做日期判斷的設定值
dFlagDate = ReadDateFlag(sFlagPath)
Set oFSFolder = oFS.GetFolder(sPath)
' 取得根目錄下所有的子目錄
Set fDates = oFSFolder.SubFolders
For Each fDateItem in fDates
If fDateItem.DateLastModified <= dFlagDate Then
' 利用遞迴的方式刪除不要(空)的資料夾
DeleteEmptyFolder(fDateItem)
End If
Next
Set oFSFolder = Nothing
Set oFS = Nothing
Sub DeleteEmptyFolder(oFolder)
Set oFSFolder = oFS.GetFolder(oFolder.Path)
Set fItems = oFSFolder.SubFolders
' 這邊是判斷檔案和資料夾都為空的情況, 如果是要刪過期的資料, 可再另外判斷
If (oFSFolder.SubFolders.Count + oFSFolder.Files.Count)=0 Then
' 如果此資料夾底下無資料, 刪除此資料夾
oFS.DeleteFolder oFSFolder.Path
Else
' 如果有檔案或是資料夾, 繼續往下進行刪除的動作
For Each fItem in fItems
DeleteEmptyFolder(fItem)
Next
End If
End Sub
Function ReadDateFlag(sFlagPath)
Dim fFlag, dFlagDate, strDate
strDate = ""
If Not oFS.FileExists(sFlagPath) Then
' 如果 flag 檔不存在, 將預設的日期資料寫入 flag 檔
dFlagDate = DateAdd("d", nExpireDays, Date)
' 日期格式為: yyyy-MM-dd
strDate = Year(dFlagDate) & "-" & Month(dFlagDate) & "-" & Day(dFlagDate)
Set fFlag = oFS.OpenTextFile(sFlagPath, 8, True)
fFlag.Write strDate
fFlag.Close
ReadDateFlag = CDate(strDate)
Else
' 如果 flag 檔已存在, 讀取上次執行的日期戳記
Set fFlag = oFS.OpenTextFile(sFlagPath, 1)
If strDate="" Then
If Not fFlag.AtEndOfStream Then
strDate = fFlag.ReadLine
dFlagDate = DateAdd("d", 1, CDate(strDate))
strDate = Year(dFlagDate) & "-" & Month(dFlagDate) & "-" & Day(dFlagDate)
End If
End If
fFlag.Close
' 用覆寫的方式寫回 flag 檔
Set fFlag = oFS.OpenTextFile(sFlagPath, 2, True)
fFlag.Write strDate
fFlag.Close
ReadDateFlag = CDate(strDate)
End If
End Function
相關參考資料:
- Scripting.FileSystemObject
- Scripting.FileSystemObject 的 OpenTextFile
沒有留言:
張貼留言