none
[VBS]刪除第二層目錄以下的檔案 RRS feed

  • 一般討論

  • 各位好~目前有個需求是要刪除第二層以下的檔案

    檔案架構類似如下

    D:\SCRIPT\FIRSTFLODER
    ├─SecondFloder1
    │  └─TestFloder-2
    │      └─Test-1
    ├─SecondFloder2
    │  └─TestFloder-2
    │      └─Test-1
    ├─SecondFloder3
    │  └─TestFloder-2
    │      └─Test-1
    ├─SecondFloder4
    │  └─TestFloder-2
    │      └─Test-1
    └─SecondFloder5
        └─TestFloder-2
            └─Test-1

    目的需要刪除SecondFloder?以下的檔案與目錄(不包含SecondFloder?)

    因為VBA的功力實在是不好
    所以我試著搭配 批次檔 取得路徑呼叫VBA 刪除
    希望能由一個VBA達成 請各位幫幫忙 謝謝!!

    目前搜尋有找到 http://www.devx.com/tips/Tip/27130 可是不知道要怎麼應用進去

     DeleteF.cmd

    @echo off 
    set DelFloder=D:\Script\FirstFloder\
    for /f "delims==" %%i in ('"dir %DelFloder%*. /b" ') do echo DeleteFolder.vbs /tag:%DelFloder%%%i
    pause

    DeleteFolder.vbs

        ' 指定所有變數必須事先宣告才能使用  
        Option Explicit  
         
        'WScript.Echo("作業開始執行:" & Date & " " & Time)  
    
        Dim LogFSO, LogFile, FileName, MyDate     '宣告LOG FILE 變數
        MyDate = Replace(Date, "/", "-") '修改日期符號
        Set LogFSO = CreateObject("Scripting.FileSystemObject")
        FileName = mydate & "-Log.txt"
        Set LogFile = LogFSO.OpenTextFile(FileName, 8, True) '不覆蓋檔案
          
        Dim FSO, agoDays, CreatedDate, delFolder    ' 宣告變數  
        Dim myArgs    ' 宣告變數
      
        agoDays = 7  ' 指定 n 天前的檔案,現在是 7 天前  
        'delFolder = "D:\Script\FirstFloder"      ' 欲刪除檔案所在之目錄  
        
        '//將刪除指定目錄 抽出為可自訂//
        Set myArgs = WScript.Arguments     ' 欲刪除檔案所在之目錄  
        delFolder = myArgs.Named("tag")     ' 欲刪除檔案名稱 ???.vbs /tag:"????"
        '//結束//
    
        Set FSO = CreateObject("Scripting.FileSystemObject")      ' 建立檔案系統物件(File System Object)  
        CreatedDate = DateAdd("d", -agoDays, Date)   ' 取得資料夾的建立日期
        DelFilesInFolder FSO.GetFolder(delFolder)  ' 呼叫刪除資料夾的子程序  
        
        Sub DelFilesInFolder(folder)   ' 刪除檔案的子程序  
            Dim Folders, subFolder     ' 宣告變數  
            For Each Folders In folder.SubFolders               ' 找出目前所在目錄內所有的目錄  
                If ((Folders.DateCreated <= CreatedDate)) Then ' 檢查資料夾建立日期是否符合條件,若符合,就刪除  
                On Error Resume Next
                
                LogFile.WriteLine("刪除" & ";" & Folders.name & ";" &" 修改日期: " & Folders.DateLastModified & ";" &" 建立日期: " & Folders.DateCreated & ";" &"執行時間:" & Date & " " & Time)  '把將要刪除的資料夾紀錄
                FSO.DeleteFolder Folders '刪除目錄 
                If Err Then
                 err.Clear
                 'Msgbox "不能刪除目錄,請檢查錯誤" 
                LogFile.WriteLine("!ERR" & ";" & Folders.name & ";" & " 修改日期: " & Folders.DateLastModified & ";" &" 建立日期: " & Folders.DateCreated & ";" &"執行時間:" & Date & " " & Time)  '把將無法刪除的資料夾
                End If       
                End If  
            Next  
        End Sub  
          
        'WScript.Echo("作業執行完畢:" & Date & " " & Time)  
        
        
    '==========================================================================    
    '代碼:
    'demo.vbs /id:123 "Good morning" /name:peter 192.168.0.1
    '
    '那麼在 demo.vbs 中就可以使用以下指令取得參數:
    '代碼:
    'Wscript.Arguments.Named("id")   ->  "123"
    'Wscript.Arguments.Named("name")   ->  "peter"
    'Wscript.Arguments.Unnamed(0)      ->  "Good morning"
    'Wscript.Arguments.Unnamed(1)      ->  "192.168.0.1"
    '
    'Wscript.Arguments.Item(0)      ->  "/id:123"
    'Wscript.Arguments.Item(1)      ->  "Good morning"
    'Wscript.Arguments.Item(2)      ->  "/name:peter"
    'Wscript.Arguments.Item(3)      ->  "192.168.0.1"
    '
    'Wscript.Arguments.Count      -> 4 (參數個數)
    'Wscript.Arguments.Named.Count      -> 2 (具名參數個數)
    'Wscript.Arguments.Unnamed.Count   -> 2 (不具名參數個數)
    'Wscript.Arguments.Named.Exists("id")   -> True (檢查具名參數是否存在)
    'Wscript.Arguments.Named.Exists("no")   -> False 
    '==========================================================================





    • 已編輯 X Z 2012年8月31日 上午 01:10 努力中
    • 已變更類型 X Z 2012年9月2日 下午 03:27 有大概的結果
    2012年8月30日 下午 04:40

所有回覆

  • 您好,

    我的方式是判斷,如果Path有2個/以上,就表示要刪除,然後就一直把目錄刪掉,給您參考看看,您再依您的需求調整吧!

    Dim LogFSO, LogFile, FileName, MyDate     '宣告LOG FILE 變數
    Dim FSO, agoDays, CreatedDate, delFolder    ' 宣告變數  
    
    MyDate = Replace(Date, "/", "-") '修改日期符號
    Set LogFSO = CreateObject("Scripting.FileSystemObject")
    FileName = mydate & "-Log.txt"
    Set LogFile = LogFSO.OpenTextFile(FileName, 8, True) '不覆蓋檔案
      
    
    Dim myArgs    ' 宣告變數
    
    agoDays = 7  ' 指定 n 天前的檔案,現在是 7 天前  
    'delFolder = "D:\Script\FirstFloder"      ' 欲刪除檔案所在之目錄  
    
    '//將刪除指定目錄 抽出為可自訂//
    Set myArgs = WScript.Arguments     ' 欲刪除檔案所在之目錄  
    delFolder = myArgs.Named("tag")     ' 欲刪除檔案名稱 ???.vbs /tag:"????"
    '//結束//
    
    Set FSO = CreateObject("Scripting.FileSystemObject")      ' 建立檔案系統物件(File System Object)  
    CreatedDate = DateAdd("d", -agoDays, Date)   ' 取得資料夾的建立日期
    DelFilesInFolder FSO.GetFolder(delFolder)  ' 呼叫刪除資料夾的子程序
    
    '取得Path的層級
    Function GetPathLevel(path)
        Dim result
        result = 0
        Dim pos
        pos = 0
        Do
            pos = InStr(pos + 1, path, "\")
            If pos > 0 Then
                result = result + 1
            End If
        Loop Until pos = 0
        GetPathLevel = result
    End Function
     
    '要刪除某個目錄下某一層的檔案及目錄
    Sub DelFilesInFolder(folder)
        Dim subFolder     ' 宣告變數
        ' 找出目前所在目錄內所有的目錄
        For Each subFolder In folder.SubFolders
            Dim folderPath
            folderPath = subFolder.path
            '如果目錄大於KillPathCount層就刪掉
            Dim pathLevel
            pathLevel = GetPathLevel(folderPath)
            If pathLevel > KillPathCount Then
                '先把目錄的檔案刪除
                '如果下面還有subFolder要先刪掉
                If subFolder.SubFolders.Count > 0 Then
                    Call DelFilesInFolder(subFolder)
                End If
                If FSO.FolderExists(folderPath) Then
                    Call FSO.DeleteFolder(folderPath)
                End If
                
            ElseIf pathLevel = KillPathCount Then
                '要刪除檔案
                 FSO.DeleteFile subFolder & "\*.*"
                 Call DelFilesInFolder(subFolder)
            Else
                Call DelFilesInFolder(subFolder)
            End If
        Next
    End Sub



    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/



    • 已編輯 亂馬客 2012年8月31日 上午 01:47
    2012年8月31日 上午 01:27
  • 您好~

    這樣子的寫法感覺上(只是感覺上 因為還沒拿到實際環境只有模擬)
    要是子目錄有好多層的話 感覺好刪除好久好久

        ' 找出目前所在目錄內所有的目錄
        For Each subFolder In folder.SubFolders
            Dim folderPath
            folderPath = subFolder.path
            '如果目錄大於KillPathCount層就刪掉
    
    
    我的目的只有判斷第三層的建立日期大於七天,就把從第三層算起的內容(檔案與子目錄)全部刪除

    2012年8月31日 上午 05:55
  • 您好,
    那您再將日期的判斷加入就可以了!

    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年8月31日 上午 10:48
  • 刪了再建就是空目錄,這樣會不會比較輕鬆?

    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年8月31日 下午 01:27
  • 您好 ~

    請問要家在哪一段才不會產生我 猜想的 列出全部才去比對 第二層狀態呢?

    謝謝

    2012年8月31日 下午 05:16
  • 您好~

    對不起~~這樣不行耶
    因為第三層資料匣有可能不是所有的都在七天前建立的資料匣,,有些是七天內
    謝謝!!

    2012年8月31日 下午 05:17
  • 各位好
    ~我亂試 有試出來 不過不確定這樣是否算是正確的寫法(雖然結目前看起來正常,不過怕實際RUN的時候砍錯檔案)
    請幫我看看 謝謝

    語法中註解有  'Add *** 部分是我測試後加上去的(一共四行)

        ' 指定所有變數必須事先宣告才能使用  
        Option Explicit  
         
        'WScript.Echo("作業開始執行:" & Date & " " & Time)  
    
        Dim LogFSO, LogFile, FileName, MyDate     '宣告LOG FILE 變數
        MyDate = Replace(Date, "/", "-") '修改日期符號
        Set LogFSO = CreateObject("Scripting.FileSystemObject")
        FileName = mydate & "-Log.txt"
        Set LogFile = LogFSO.OpenTextFile(FileName, 8, True) '不覆蓋檔案
          
        Dim FSO, agoDays, CreatedDate, delFolder    ' 宣告變數  
        Dim myArgs    ' 宣告變數
      
        agoDays = 7  ' 指定 n 天前的檔案,現在是 7 天前  
        'delFolder = "D:\Script\FirstFloder"      ' 欲刪除檔案所在之目錄  
        
        '//將刪除指定目錄 抽出為可自訂//
        Set myArgs = WScript.Arguments     ' 欲刪除檔案所在之目錄  
        delFolder = myArgs.Named("tag")     ' 欲刪除檔案名稱 ???.vbs /tag:"????"
        '//結束//
    
        Set FSO = CreateObject("Scripting.FileSystemObject")      ' 建立檔案系統物件(File System Object)  
        CreatedDate = DateAdd("d", -agoDays, Date)   ' 取得資料夾的建立日期
        
        DelFilesInFolder FSO.GetFolder(delFolder)  ' 呼叫刪除資料夾的子程序  
        
        Sub DelFilesInFolder(folder)   ' 刪除檔案的子程序  
            Dim Folders, subFolder     ' 宣告變數  
            For Each subFolder In folder.SubFolders  ' Add *** 取得目錄內得資料匣 取得的即為第二層
            'MsgBox  subFolder                       ' Add *** 秀出取得的資料夾名稱
            'For Each Folders In folder.SubFolders               ' 找出目前所在目錄內所有的目錄  
            For Each Folders In subFolder.SubFolders             ' Add *** 找出第二層目錄內所有的目錄  
                If ((Folders.DateCreated <= CreatedDate)) Then ' 檢查資料夾建立日期是否符合條件,若符合,就刪除  
                On Error Resume Next
                
                LogFile.WriteLine("刪除" & ";" & Folders.name & ";" &" 修改日期: " & Folders.DateLastModified & ";" &" 建立日期: " & Folders.DateCreated & ";" &"執行時間:" & Date & " " & Time)  '把將要刪除的資料夾紀錄
                FSO.DeleteFolder Folders '刪除目錄 
                If Err Then
                 err.Clear
                 'Msgbox "不能刪除目錄,請檢查錯誤" 
                LogFile.WriteLine("!ERR" & ";" & Folders.name & ";" & " 修改日期: " & Folders.DateLastModified & ";" &" 建立日期: " & Folders.DateCreated & ";" &"執行時間:" & Date & " " & Time)  '把將無法刪除的資料夾
                End If       
                End If  
            Next 
            Next ' Add *** 第二層資料匣回圈結束
        End Sub  
          
        'WScript.Echo("作業執行完畢:" & Date & " " & Time)  
        
        
    '==========================================================================    
    '代碼:
    'demo.vbs /id:123 "Good morning" /name:peter 192.168.0.1
    '
    '那麼在 demo.vbs 中就可以使用以下指令取得參數:
    '代碼:
    'Wscript.Arguments.Named("id")   ->  "123"
    'Wscript.Arguments.Named("name")   ->  "peter"
    'Wscript.Arguments.Unnamed(0)      ->  "Good morning"
    'Wscript.Arguments.Unnamed(1)      ->  "192.168.0.1"
    '
    'Wscript.Arguments.Item(0)      ->  "/id:123"
    'Wscript.Arguments.Item(1)      ->  "Good morning"
    'Wscript.Arguments.Item(2)      ->  "/name:peter"
    'Wscript.Arguments.Item(3)      ->  "192.168.0.1"
    '
    'Wscript.Arguments.Count      -> 4 (參數個數)
    'Wscript.Arguments.Named.Count      -> 2 (具名參數個數)
    'Wscript.Arguments.Unnamed.Count   -> 2 (不具名參數個數)
    'Wscript.Arguments.Named.Exists("id")   -> True (檢查具名參數是否存在)
    'Wscript.Arguments.Named.Exists("no")   -> False 
    '==========================================================================


    2012年8月31日 下午 05:23