嗨,Scripting Guy!

嗨,Scripting Guy!

歡迎蒞臨 TechNet 專欄,Microsoft Scripting Guys 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

還有,別忘了瞧瞧全新經過改良的嗨,Scripting Guy!過往文件

今天的問題:每天我們都會有個程式建立類似下列名稱的檔案:backup_20050607.bak。要如何刪除前一天建立的檔案?


如何刪除前一天建立的備份檔案?

嗨,Scripting Guy!每天我們都會有個程式建立類似下列名稱的檔案:backup_20050607.bak。要如何刪除前一天建立的檔案?

-- JC

JC,您好。嗯,能夠在執行後自動刪除前一天所產生結果的指令碼。幾個禮拜以前,我們還真需要這麼一段指令碼呢!

是的,我們很了解。不過,我們大概不應該在這裡談這種事情。

況且這裡還有專欄等著我們寫呢!您需要一段指令碼,以便刪除類似 backup_20050607.bak 這種名稱的檔案,其中 20050607 代表前一天的日期 (在本範例中是 2005 年 6 月 7 日),對吧?那說一聲就行了:

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

這樣就完成了!昨日已逝,我們可以假裝一切從未發生過。對吧,老闆?

 

附註。我們不是也可以省去一大堆麻煩,而直接刪除建立/修改日期等於前一天日期的所有檔案嗎?是的,如果該資料夾中不會儲存任何日期相同的其他檔案,而不至於在無意中被刪除時,是可以這樣做。但考慮過一切因素以後,上述這種作法似乎是最安全的。

如需詳細資訊

查看嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首