dtmYesterday = Date - 1
strYear = Year(dtmYesterday)
strMonth = Month(dtmYesterday)
If Len(strMonth) = 1 Then
strMonth = "0" & strMonth
End If
strDay = Day(dtmYesterday)
If Len(strDay) = 1 Then
strDay = "0" & strDay
End If
strYesterday = strYear & strMonth & strDay
strFileName = "C:\Backups\backup_" & strYesterday & ".bak"
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFile(strFileName)
您可能已經猜到了,麻煩的部份就在於建構檔名,一旦有了檔名,那刪除檔案就易如反掌了。那麼,要如何建構這種檔名呢?
嗯,檔名中每天都不同的部份之一是代表所產生備份檔日期的部份。也就是說,我們只需要建構檔名的這部份,其餘的就可以全部明確寫成程式碼,因此,一開始我們要先決定前一天的日期,所以就從當前的日期減去一天,然後儲存在 dtmYesterday 變數之中:
dtmYesterday = Date - 1
接著我們就使用 Year 函式,從 dtmYesterday 之中抓取四位數的年份值 (例如 2005),該值會被儲存在變數 strYear 之中。然後,使用 Month 函式從 dtmYesterday 之中抓取月份值。
不過,請注意,在抓取月份值時,我們必須再多作點程式編碼工作 (日期值也是一樣)。原因何在?那,假設我們要處理六月。此時,Month 函式會傳回值 6。這個值沒問題,只是在我們的檔名中,分配了兩個位數給月份,所以月份必須以 06 的形式列出。因此,我們必須判斷是單位數月份,還是二位數月份。如果是單位數月份,就必須在數字之前加一個零。下面的程式碼就是執行這個步驟:
If Len(strMonth) = 1 Then
strMonth = "0" & strMonth
End If
其實這是個相當簡單明瞭的程式碼。Len (長度) 函式會告訴我們 strMonth 變數中的月份是幾位數。如果就是 1,則在前面加上 0:
strMonth = "0" & strMonth
如果長度等於 1 以外數字,則不作任何處理。
抓取月份值之後,我們再重複完全相同的程序,使用 Day 函式,讓我們能夠擷取日期的部份。日期是存放在變數 strDay 之中,變數命名很聰明吧!
這樣就能提供我們建構檔名時所需要的各個部份。建構檔名時,首先使用下面這行程式碼,將年份、月份和日期串在一起 (我們就會得到像 20050607 這樣的字串):
strYesterday = strYear & strMonth & strDay
接下來,只要再加上其餘的路徑資訊 (在本範例中,我們假設檔案是儲存在 C:\Backups 資料夾中) 就行了:
strFileName = "C:\Backups\backup_" & strYesterday & ".bak"
您可以看到,我們只是將字串 C:\Backups\backup_、所建構的日期 (20050607) 和 .bak 結合在一起而已。這幾個部份合在一起就變成如下的字串:
C:\Backups\backup_20050607.bak
酷吧!
然後再使用下列兩行程式碼,建立 FileSystemObject 的執行個體,並刪除檔案:
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFile(strFileName)
由於我們是使用 FileSystemObject,這段程式碼只能用在本機電腦上。要是備份檔是位於遠端電腦上呢?沒有問題,這時候可以使用 WMI 來尋找檔案,然後加以移除。那,我們幹嘛不一開始就直接使用 WMI 呢?因為 FileSystemObject 可以在不到一秒鐘的時間找出檔案並加以刪除,而 WMI 就需要比較長的時間。我們決定遷就速度和效率。
但是,剛剛也說過,如果檔案是在遠端電腦上,速度和效率也沒什麼大用。還好在這種情況下,您可以使用 WMI 指令碼來刪除檔案。這段指令碼 (我們今天暫不討論) 會從遠端電腦 atl-fs-01 刪除備份檔:
dtmYesterday = Date - 1
strYear = Year(dtmYesterday)
strMonth = Month(dtmYesterday)
If Len(strMonth) = 1 Then
strMonth = "0" & strMonth
End If
strDay = Day(dtmYesterday)
If Len(strDay) = 1 Then
strDay = "0" & strDay
End If
strYesterday = strYear & strMonth & strDay
strFileName = "C:\\Backups\\backup_" & strYesterday & ".bak"
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colFiles = objWMIService.ExecQuery _
("Select * from CIM_DataFile where Name = '" & strFileName & "'")
For Each objFile in colFiles
objFile.Delete
Next
這樣就完成了!昨日已逝,我們可以假裝一切從未發生過。對吧,老闆?
附註。我們不是也可以省去一大堆麻煩,而直接刪除建立/修改日期等於前一天日期的所有檔案嗎?是的,如果該資料夾中不會儲存任何日期相同的其他檔案,而不至於在無意中被刪除時,是可以這樣做。但考慮過一切因素以後,上述這種作法似乎是最安全的。 |
|