none
Скрипт для удаления старых файлов RRS feed

  • Вопрос

  • Добрый день!

    Вопрос может и простой, но тем не менее.

    Нужен батник для удаления файлов из каталога с датой отличной от сегодяшней для автоматизации процедуры очистки каталога от старых файлов.

    Заранее спасибо.

Ответы

  • Вот решение этой задачи на WSH:

    http://www.microsoft.com/technet/scriptcenter/resources/qanda/nov04/hey1104.mspx

    Модератор
  • Можно обойтись командой robocopy  Посмотрите ключи /MOV и /MINAGE:n  Копировать файлы нужно в null

     

    Модератор
  • Есть вот такой замечательный скриптик
     
    Code Snippet
    'данный скрипт удаляет в директори все файлы, у которых
    'дата последней модификации старше определенного количества дней
    'синтаксис таков
    'killdateparam.vbs /path:<folder> /killdate:<days> /recur:<true of false>
    '<folder> - папка над которой будут производиться действия
    '<days> - указывает старше скольки дней файлы будут удаляться
    '<true of false> - использовать или нет рекурсию
    'например
    'killdateparam.vbs /path:c:\0\ /killdate:8 /recur:true
    'Отмечу также, что если параметры содержат пробелы,
    'в нашем случае это может быть путь к папке, то его надо
    'брать в кавычки
    '
    'ISA
    '
    set objNamedArgs=Wscript.Arguments.Named
     
    path=objNamedArgs.item("path")
    killdate=date() - objNamedArgs.item("killdate")
    recur=objNamedArgs.item("recur")
     
    wscript.echo path, killdate, recur
     
    arFiles = Array()
    set fso = createobject("scripting.filesystemobject")
     
    'Ничего не удаляем, пока пробегаем по возвращенному набору файлов.
    'Набор может быть перемешан.
    'Создаём массив файловых объектов, чтобы этого избежать
     

    SelectFiles path, killdate, arFiles, recur
     
    nDeleted = 0
    for n = 0 to ubound(arFiles)
     
    on error resume next 'in case of 'in use' files...
    arFiles(n).delete true
    if err.number = 0 then
    nDeleted = nDeleted + 1
     
    end if
    on error goto 0
    next
     
    sub SelectFiles(sPath,vKillDate,arFilesToKill,bIncludeSubFolders)
    on error resume next
    ' добавляем файлы на удаление в массив
    '
     
    set folder = fso.getfolder(sPath)
    set files = folder.files
    for each file in files
    ' на всякий случай отслеживаем ошибки доступа к
    ' свойству Date
    '
    dtlastmodified = null
    on error resume Next
    dtlastmodified = file.datelastmodified
    on error goto 0
    if not isnull(dtlastmodified) Then
    if dtlastmodified < vKillDate then
    count = ubound(arFilesToKill) + 1
    redim preserve arFilesToKill(count)
    set arFilesToKill(count) = file
    end if
    end if
    next
     
    if bIncludeSubFolders then
    for each fldr in folder.subfolders
    SelectFiles fldr.path,vKillDate,arFilesToKill,true
    next
    end if
    end sub

     

     
    26 июня 2007 г. 5:35
  • Такой скрипт все когдато писали :-) Мои 5 коп:

     

    DelByDate.wsf

    <job>
        <runtime>
            <description>
                        Delete (or show) files older on date
            </description>
            <named
                name = "FileMask"
                helpstring = "Files to delete. Default=*.bak"
                type = "string"
                required = "false"    
            />
            <named
                name = "DateOld"
                helpstring = "Date to old (in hours). Default=72"
                type = "string"
                required = "false"    
            />
            <named
                name = "Dir"
                helpstring = "Directory. Default=current"
                type = "string"
                required = "false"    
            />
            <named
                name = "DateType"
                helpstring = "Date type ( [Created] | Acc[essed] | Mod[ified] | Old (by Oldes date) | New (by newes date)). Default=Created"
                type = "string"
                required = "false"    
            />
            <named
                name = "SubDir"
                helpstring = "Include subdirectory. Default=no."
                type = "simple"
                required = "false"    
            />
            <named
                name = "Show"
                helpstring = "Show deleted files plus show size (if need) in M,K,b. May used as simple parameter. Default=no."
                type = "string"
                required = "false"    
            />
            <named
                name = "DED"
                helpstring = "Delete empty directorys. Default=no."
                type = "simple"
                required = "false"    
            />
            <named
                name = "DER"
                helpstring = "Delete empty root directory.  Default=no."
                type = "simple"
                required = "false"    
            />
            <named
                name = "Demo"
                helpstring = "actualy not delete files (need show parameter).  Default=delete."
                type = "simple"
                required = "false"    
            />
            <named
                name = "Rev"
                helpstring = "Reverse. Delete files NOT old by date."
                type = "simple"
                required = "false"    
            />
            <example>
          Example: DelByDate.wsf /FileMask:*.log /DateOld:24
            </example>
        </runtime>
    <script language="VBScript">

       if WScript.Arguments.Named.Item("FileMask") <> "" then
          FileMask = WScript.Arguments.Named.Item("FileMask")
       Else
          FileMask = "*.bak"
       end if

       if WScript.Arguments.Named.Item("DateOld") <> "" then
          DateOld = WScript.Arguments.Named.Item("DateOld")
       Else
          DateOld = 72
       end if

       if WScript.Arguments.Named.Item("Dir") <> "" then
          CurDir = WScript.Arguments.Named.Item("Dir")
       Else
          CurDir = "."
       end if

       if WScript.Arguments.Named.Item("DateType") = "" then
          DateType = "Created"
       Elseif LCase(Mid(WScript.Arguments.Named.Item("DateType"),1,3)) = "acc" Then
          DateType = "Accessed"
       ElseIf LCase(Mid(WScript.Arguments.Named.Item("DateType"),1,3)) = "mod" Then
          DateType = "Modified"
       ElseIf LCase(Mid(WScript.Arguments.Named.Item("DateType"),1,3)) = "old" Then
          DateType = "Old"
       ElseIf LCase(Mid(WScript.Arguments.Named.Item("DateType"),1,3)) = "new" Then
          DateType = "New"
       end if

       SubDir = WScript.Arguments.Named.Exists("SubDir")
     
       if WScript.Arguments.Named.Exists("Show") then
           ShowParam = "/FileMask:" & FileMask& " /DateOld:" & DateOld & " /Dir:" & CurDir & " /DateType:" & DateType
           If SubDir Then ShowParam = ShowParam & " /SubDir"
           if WScript.Arguments.Named.Exists("Demo") then  ShowParam = ShowParam & " /Demo"
           if WScript.Arguments.Named.Exists("Rev") then  ShowParam = ShowParam & " /Rev"
           if WScript.Arguments.Named.Exists("DED") then  ShowParam = ShowParam & " /DED"
           if WScript.Arguments.Named.Exists("DER") then  ShowParam = ShowParam & " /DER"
           Size = ""
           If LCase(WScript.Arguments.Named.Item("Show")) = "m" Then Size = ":M"
           If LCase(WScript.Arguments.Named.Item("Show")) = "k" Then Size = ":K"
           If LCase(WScript.Arguments.Named.Item("Show")) = "b" Then Size = ":b"
           Wscript.Echo "Running parameters:" & vbcrlf & ShowParam & " /Show" & Size & vbcrlf
       End If

       Set regEx = New RegExp
       regEx.IgnoreCase = True
       regEx.Global     = False
       ' To regular file mask a'la : "*.bak" "*.lo?"
       regEx.Pattern    = "\."
       FileMask = regEx.Replace(FileMask,"\.")
       regEx.Pattern    = "\?"
       FileMask = regEx.Replace(FileMask,".")
       regEx.Pattern    = "\*"
       FileMask = regEx.Replace(FileMask,".*")

       If Subdir Then
          Set fsoSubs=CreateObject("Scripting.FileSystemObject")
          Set RootDir=fsoSubs.GetFolder(CurDir)
          For each SubFold in RootDir.SubFolders
              Call DelInSubFolders ( SubFold.Path, FileMask, DateOld, DateType )
          Next
       End if
       Call DelFilesInFolder ( CurDir, FileMask, DateOld, DateType )
       Set fso=CreateObject("Scripting.FileSystemObject")
       Set MyDir=fso.GetFolder(CurDir)
       if MyDir.Files.Count = 0 AND MyDir.SubFolders.Count = 0 AND WScript.Arguments.Named.Exists("DER") Then
          If WScript.Arguments.Named.Exists("Show") Then
             WScript.Echo "Delete empty root directory " & MyDir.Path
          End if
          if Not WScript.Arguments.Named.Exists("Demo") then MyDir.Delete (True)
       End if   


    ' =======================================================================

    Sub DelInSubFolders ( Folder, FileMask, Hours, TimeType)
       Set fso=CreateObject("Scripting.FileSystemObject")
       Set MyDir=fso.GetFolder(Folder)

       Call DelFilesInFolder ( Folder, FileMask, Hours, TimeType)
      
       For each SubFold in MyDir.SubFolders
          Call DelInSubFolders ( SubFold.Path, FileMask, Hours, TimeType)
       Next

       if WScript.Arguments.Named.Exists("DED") AND MyDir.Files.Count = 0 AND MyDir.SubFolders.Count = 0 Then
          If WScript.Arguments.Named.Exists("Show") Then
             WScript.Echo "dir  - " & MyDir.Path
          End if
          if Not WScript.Arguments.Named.Exists("Demo") then MyDir.Delete (True)
       End if
    End Sub


    ' =======================================================================

    Sub DelFilesInFolder ( Folder, FileMask, Hours, TimeType)

       Set fso=CreateObject("Scripting.FileSystemObject")
       Set MyDir=fso.GetFolder(Folder)
       Set regEx = New RegExp
       regEx.IgnoreCase = True
       regEx.Global     = False
       regEx.Pattern    = FileMask

       For Each DFile in MyDir.Files
           If regEx.Test(DFile.Name) Then
                if TimeType = "Accessed" Then
                   TimeToCheck = DFile.DateLastAccessed
                ElseIf TimeType = "Modified" Then
                   TimeToCheck = DFile.DateLastModified
                ElseIf TimeType = "Old" Then
                   TimeToCheck = DFile.DateLastModified
                   if TimeToCheck > DFile.DateLastAccessed Then
                      TimeToCheck = DFile.DateLastAccessed
                   End if
                   if TimeToCheck > DFile.DateCreated Then
                      TimeToCheck = DFile.DateCreated
                   End if
                ElseIf TimeType = "New" Then
                   TimeToCheck = DFile.DateLastModified
                   if TimeToCheck < DFile.DateLastAccessed Then
                      TimeToCheck = DFile.DateLastAccessed
                   End if
                   if TimeToCheck < DFile.DateCreated Then
                      TimeToCheck = DFile.DateCreated
                   End if
                Else
                   TimeToCheck = DFile.DateCreated
                end If
                if TimeToCheck < (now()-timeserial(Hours,0,0)) XOR WScript.Arguments.Named.Exists("Rev") Then
                   If WScript.Arguments.Named.Exists("Show") Then
                      Size = ""
                      If LCase(WScript.Arguments.Named.Item("Show")) = "m" Then Size = " ( " & Int(Dfile.Size/1024/10.24)/100 & " M)"
                      If LCase(WScript.Arguments.Named.Item("Show")) = "k" Then Size = " ( " & Int(Dfile.Size/10.24)/100 & " K)"
                      If LCase(WScript.Arguments.Named.Item("Show")) = "b" Then Size = " ( " & Dfile.Size & " )"
                      WScript.Echo "file - " & DFile.Path & Size
                   End if
                   if Not WScript.Arguments.Named.Exists("Demo") then Dfile.Delete(True)
                end if
           End if
       Next

    End Sub

    </script>
    </job>

     

     

    15 ноября 2007 г. 9:58
  • PowerShell

     

    Если просто с датой отличной от сегодняшней:

     

    dir | where {$_.lastwritetime.date -ne (get-date).date} | del -whatif

     

    Если старше 7 дней например:

     

    $timex = get-date

    $timex = $timex.AddDays(-7)

    dir | where {$_.lastwritetime -le $timex} | del -whatif

    29 ноября 2007 г. 5:25
    Модератор
  •  VyacheslavNi написано:

    Добрый день!

    Вопрос может и простой, но тем не менее.

    Нужен батник для удаления файлов из каталога с датой отличной от сегодяшней для автоматизации процедуры очистки каталога от старых файлов.

    Заранее спасибо.

     

    Это не совсем скрипт. Но для автоматизации файловых операций есть очень интересная утилита XXCopy.

    http://www.xxcopy.com/index.htm#summary

     

    2 декабря 2007 г. 10:24
  • @echo off

    :: Рекурсивно удаляет все файлы старше 15 дней

    for
    /f "tokens=*" %%i in ('forfiles /s /d-15') do del /q /f /s %%i

    forfiles:
    http://www.dynawell.com/reskit/microsoft/win2000/forfiles.zip
    2 декабря 2007 г. 12:47
  • Вставлю и свой вариант для коллекции

     

    Сценарий состоит из двух .cmd файлов.

     

    Первый файл (собственно запускаемый):

     

    Образец кода

    @echo off

    rem   Скрипт удаляет в определенной папке файлы и каталоги старше определенного времени
    rem   и выводит протокол последних удаленных файлов в файл delete_log.log в папке запуска скрипта
    rem
    rem   Принимает два параметра:
    rem   - первый - путь к папке, подлежащей чистке
    rem   - второй - время давности для файлов и папок
    rem   Внимание !!! Для корректной работы скрипта требуется утилита forfiles
    rem   (входит в стандартный комплект поставки MS Windows 2003 Server)

    set Directory_To_Clean=%1%
    set Number_Of_Days_Ago=%2%

    del %CD%\delete_log.log /q

    forfiles /p %Directory_To_Clean% /s /c "cmd /c call %CD%\delete_and_log.cmd @file %Directory_To_Clean% %CD% " /d -%Number_Of_Days_Ago%

     

    Он вызывает второй файл (delete_and_log.cmd):

     

    Образец кода

    @echo off

    set file_name=%1%
    set Directory_To_Clean=%2%
    set log_file_path=%3%

    cd %CD%


    rem Снимаем атрибуты (del не удалит файл с атрибутом system) и удаляем файлы и папки...

    attrib -r-a-s-h %file_name% /d

    del %file_name% /q /f
    rmdir %file_name% /q


    rem Выводим логи

    @echo The file %file_name% was deleted >> %log_file_path%\delete_log.log

     

     

    Схема с разбиением сценария на два файла была выбрана для удоства логирования удаленных файлов (у нас сценарии побольше, я привел сокращенный вариант).

     

    Сценарий также работает на базе утилиты forfiles.Как правильно указывал ранее коллега - данная утилита отбирает файлы по дате их модификации.

    Поэтому использовать данный сценарий для чистки папок файлообмена между пользователями нецелесообразно. Можно нарваться на ситуацию, когда пользователь скопирует в такую папку файл с датой старше положенного по параметру сценария и тогда сценарий просто прибьет файл при следующем своем запуске (файл не пролежит на диске положенный срок).

     

    Но, как говорится, As Is...

    10 декабря 2007 г. 12:51
  • скрипт DelOdLogs.ps1

    #---------------------------------------------------------------

    Param 
    (
           [
    int]     $Period     = 365, #период в днях старше которого файл считается

                          #пригодным к удалению

           [String]$PATH     = $env: systemdrive + \Logs, #каталог для просмотра

           [bool$recurse   = $true                               #включать ли вложенные каталоги
    )
     
    filter Get-OldFiles
    {
        Param
        (
            [
    int]$Period     =      365
        )
       
    if    (
                (
    $_.Attributes -ne "Directory") `
               
    -and `
                (([
    DateTime]::Now.Subtract($_.CreationTime)).Days -gt $Period)
            ) 
            {
                   
    return $_
            }
    }

    if ($recurse

            {dir -path $PATH -recurse -force | Get-OldFiles -Period $Period | Remove-Item}

    else

            {dir -path $PATH -force | Get-OldFiles -Period $Period | Remove-Item}

    #-----------------------------------------------------------------

     

    Пример запуска удалить все файлы в папке c:\App\Logs не включая рекурсивный поиск в поддиректориях все файлы старше 10 дней:

    .\deloldLogs.ps1 -Period 10 -Path "c:\App\Logs" -recurse $false

     

    11 декабря 2007 г. 10:38

Все ответы

  • Вот решение этой задачи на WSH:

    http://www.microsoft.com/technet/scriptcenter/resources/qanda/nov04/hey1104.mspx

    Модератор
  • Можно обойтись командой robocopy  Посмотрите ключи /MOV и /MINAGE:n  Копировать файлы нужно в null

     

    Модератор
  • Есть вот такой замечательный скриптик
     
    Code Snippet
    'данный скрипт удаляет в директори все файлы, у которых
    'дата последней модификации старше определенного количества дней
    'синтаксис таков
    'killdateparam.vbs /path:<folder> /killdate:<days> /recur:<true of false>
    '<folder> - папка над которой будут производиться действия
    '<days> - указывает старше скольки дней файлы будут удаляться
    '<true of false> - использовать или нет рекурсию
    'например
    'killdateparam.vbs /path:c:\0\ /killdate:8 /recur:true
    'Отмечу также, что если параметры содержат пробелы,
    'в нашем случае это может быть путь к папке, то его надо
    'брать в кавычки
    '
    'ISA
    '
    set objNamedArgs=Wscript.Arguments.Named
     
    path=objNamedArgs.item("path")
    killdate=date() - objNamedArgs.item("killdate")
    recur=objNamedArgs.item("recur")
     
    wscript.echo path, killdate, recur
     
    arFiles = Array()
    set fso = createobject("scripting.filesystemobject")
     
    'Ничего не удаляем, пока пробегаем по возвращенному набору файлов.
    'Набор может быть перемешан.
    'Создаём массив файловых объектов, чтобы этого избежать
     

    SelectFiles path, killdate, arFiles, recur
     
    nDeleted = 0
    for n = 0 to ubound(arFiles)
     
    on error resume next 'in case of 'in use' files...
    arFiles(n).delete true
    if err.number = 0 then
    nDeleted = nDeleted + 1
     
    end if
    on error goto 0
    next
     
    sub SelectFiles(sPath,vKillDate,arFilesToKill,bIncludeSubFolders)
    on error resume next
    ' добавляем файлы на удаление в массив
    '
     
    set folder = fso.getfolder(sPath)
    set files = folder.files
    for each file in files
    ' на всякий случай отслеживаем ошибки доступа к
    ' свойству Date
    '
    dtlastmodified = null
    on error resume Next
    dtlastmodified = file.datelastmodified
    on error goto 0
    if not isnull(dtlastmodified) Then
    if dtlastmodified < vKillDate then
    count = ubound(arFilesToKill) + 1
    redim preserve arFilesToKill(count)
    set arFilesToKill(count) = file
    end if
    end if
    next
     
    if bIncludeSubFolders then
    for each fldr in folder.subfolders
    SelectFiles fldr.path,vKillDate,arFilesToKill,true
    next
    end if
    end sub

     

     
    26 июня 2007 г. 5:35
  •  sie написано:

    Можно обойтись командой robocopy  Посмотрите ключи /MOV и /MINAGE:n  Копировать файлы нужно в null

     



    Что значит в "null"? Когда я этот дистиннейшн указываю - робокопи начинает тупо искать в ресурсах каталог null, цифрой обозначить?


    Туплю однако, как много забывается по неиспользовании... >NULL - это-ж элементарно...
    15 ноября 2007 г. 5:39
  • Такой скрипт все когдато писали :-) Мои 5 коп:

     

    DelByDate.wsf

    <job>
        <runtime>
            <description>
                        Delete (or show) files older on date
            </description>
            <named
                name = "FileMask"
                helpstring = "Files to delete. Default=*.bak"
                type = "string"
                required = "false"    
            />
            <named
                name = "DateOld"
                helpstring = "Date to old (in hours). Default=72"
                type = "string"
                required = "false"    
            />
            <named
                name = "Dir"
                helpstring = "Directory. Default=current"
                type = "string"
                required = "false"    
            />
            <named
                name = "DateType"
                helpstring = "Date type ( [Created] | Acc[essed] | Mod[ified] | Old (by Oldes date) | New (by newes date)). Default=Created"
                type = "string"
                required = "false"    
            />
            <named
                name = "SubDir"
                helpstring = "Include subdirectory. Default=no."
                type = "simple"
                required = "false"    
            />
            <named
                name = "Show"
                helpstring = "Show deleted files plus show size (if need) in M,K,b. May used as simple parameter. Default=no."
                type = "string"
                required = "false"    
            />
            <named
                name = "DED"
                helpstring = "Delete empty directorys. Default=no."
                type = "simple"
                required = "false"    
            />
            <named
                name = "DER"
                helpstring = "Delete empty root directory.  Default=no."
                type = "simple"
                required = "false"    
            />
            <named
                name = "Demo"
                helpstring = "actualy not delete files (need show parameter).  Default=delete."
                type = "simple"
                required = "false"    
            />
            <named
                name = "Rev"
                helpstring = "Reverse. Delete files NOT old by date."
                type = "simple"
                required = "false"    
            />
            <example>
          Example: DelByDate.wsf /FileMask:*.log /DateOld:24
            </example>
        </runtime>
    <script language="VBScript">

       if WScript.Arguments.Named.Item("FileMask") <> "" then
          FileMask = WScript.Arguments.Named.Item("FileMask")
       Else
          FileMask = "*.bak"
       end if

       if WScript.Arguments.Named.Item("DateOld") <> "" then
          DateOld = WScript.Arguments.Named.Item("DateOld")
       Else
          DateOld = 72
       end if

       if WScript.Arguments.Named.Item("Dir") <> "" then
          CurDir = WScript.Arguments.Named.Item("Dir")
       Else
          CurDir = "."
       end if

       if WScript.Arguments.Named.Item("DateType") = "" then
          DateType = "Created"
       Elseif LCase(Mid(WScript.Arguments.Named.Item("DateType"),1,3)) = "acc" Then
          DateType = "Accessed"
       ElseIf LCase(Mid(WScript.Arguments.Named.Item("DateType"),1,3)) = "mod" Then
          DateType = "Modified"
       ElseIf LCase(Mid(WScript.Arguments.Named.Item("DateType"),1,3)) = "old" Then
          DateType = "Old"
       ElseIf LCase(Mid(WScript.Arguments.Named.Item("DateType"),1,3)) = "new" Then
          DateType = "New"
       end if

       SubDir = WScript.Arguments.Named.Exists("SubDir")
     
       if WScript.Arguments.Named.Exists("Show") then
           ShowParam = "/FileMask:" & FileMask& " /DateOld:" & DateOld & " /Dir:" & CurDir & " /DateType:" & DateType
           If SubDir Then ShowParam = ShowParam & " /SubDir"
           if WScript.Arguments.Named.Exists("Demo") then  ShowParam = ShowParam & " /Demo"
           if WScript.Arguments.Named.Exists("Rev") then  ShowParam = ShowParam & " /Rev"
           if WScript.Arguments.Named.Exists("DED") then  ShowParam = ShowParam & " /DED"
           if WScript.Arguments.Named.Exists("DER") then  ShowParam = ShowParam & " /DER"
           Size = ""
           If LCase(WScript.Arguments.Named.Item("Show")) = "m" Then Size = ":M"
           If LCase(WScript.Arguments.Named.Item("Show")) = "k" Then Size = ":K"
           If LCase(WScript.Arguments.Named.Item("Show")) = "b" Then Size = ":b"
           Wscript.Echo "Running parameters:" & vbcrlf & ShowParam & " /Show" & Size & vbcrlf
       End If

       Set regEx = New RegExp
       regEx.IgnoreCase = True
       regEx.Global     = False
       ' To regular file mask a'la : "*.bak" "*.lo?"
       regEx.Pattern    = "\."
       FileMask = regEx.Replace(FileMask,"\.")
       regEx.Pattern    = "\?"
       FileMask = regEx.Replace(FileMask,".")
       regEx.Pattern    = "\*"
       FileMask = regEx.Replace(FileMask,".*")

       If Subdir Then
          Set fsoSubs=CreateObject("Scripting.FileSystemObject")
          Set RootDir=fsoSubs.GetFolder(CurDir)
          For each SubFold in RootDir.SubFolders
              Call DelInSubFolders ( SubFold.Path, FileMask, DateOld, DateType )
          Next
       End if
       Call DelFilesInFolder ( CurDir, FileMask, DateOld, DateType )
       Set fso=CreateObject("Scripting.FileSystemObject")
       Set MyDir=fso.GetFolder(CurDir)
       if MyDir.Files.Count = 0 AND MyDir.SubFolders.Count = 0 AND WScript.Arguments.Named.Exists("DER") Then
          If WScript.Arguments.Named.Exists("Show") Then
             WScript.Echo "Delete empty root directory " & MyDir.Path
          End if
          if Not WScript.Arguments.Named.Exists("Demo") then MyDir.Delete (True)
       End if   


    ' =======================================================================

    Sub DelInSubFolders ( Folder, FileMask, Hours, TimeType)
       Set fso=CreateObject("Scripting.FileSystemObject")
       Set MyDir=fso.GetFolder(Folder)

       Call DelFilesInFolder ( Folder, FileMask, Hours, TimeType)
      
       For each SubFold in MyDir.SubFolders
          Call DelInSubFolders ( SubFold.Path, FileMask, Hours, TimeType)
       Next

       if WScript.Arguments.Named.Exists("DED") AND MyDir.Files.Count = 0 AND MyDir.SubFolders.Count = 0 Then
          If WScript.Arguments.Named.Exists("Show") Then
             WScript.Echo "dir  - " & MyDir.Path
          End if
          if Not WScript.Arguments.Named.Exists("Demo") then MyDir.Delete (True)
       End if
    End Sub


    ' =======================================================================

    Sub DelFilesInFolder ( Folder, FileMask, Hours, TimeType)

       Set fso=CreateObject("Scripting.FileSystemObject")
       Set MyDir=fso.GetFolder(Folder)
       Set regEx = New RegExp
       regEx.IgnoreCase = True
       regEx.Global     = False
       regEx.Pattern    = FileMask

       For Each DFile in MyDir.Files
           If regEx.Test(DFile.Name) Then
                if TimeType = "Accessed" Then
                   TimeToCheck = DFile.DateLastAccessed
                ElseIf TimeType = "Modified" Then
                   TimeToCheck = DFile.DateLastModified
                ElseIf TimeType = "Old" Then
                   TimeToCheck = DFile.DateLastModified
                   if TimeToCheck > DFile.DateLastAccessed Then
                      TimeToCheck = DFile.DateLastAccessed
                   End if
                   if TimeToCheck > DFile.DateCreated Then
                      TimeToCheck = DFile.DateCreated
                   End if
                ElseIf TimeType = "New" Then
                   TimeToCheck = DFile.DateLastModified
                   if TimeToCheck < DFile.DateLastAccessed Then
                      TimeToCheck = DFile.DateLastAccessed
                   End if
                   if TimeToCheck < DFile.DateCreated Then
                      TimeToCheck = DFile.DateCreated
                   End if
                Else
                   TimeToCheck = DFile.DateCreated
                end If
                if TimeToCheck < (now()-timeserial(Hours,0,0)) XOR WScript.Arguments.Named.Exists("Rev") Then
                   If WScript.Arguments.Named.Exists("Show") Then
                      Size = ""
                      If LCase(WScript.Arguments.Named.Item("Show")) = "m" Then Size = " ( " & Int(Dfile.Size/1024/10.24)/100 & " M)"
                      If LCase(WScript.Arguments.Named.Item("Show")) = "k" Then Size = " ( " & Int(Dfile.Size/10.24)/100 & " K)"
                      If LCase(WScript.Arguments.Named.Item("Show")) = "b" Then Size = " ( " & Dfile.Size & " )"
                      WScript.Echo "file - " & DFile.Path & Size
                   End if
                   if Not WScript.Arguments.Named.Exists("Demo") then Dfile.Delete(True)
                end if
           End if
       Next

    End Sub

    </script>
    </job>

     

     

    15 ноября 2007 г. 9:58
  • PowerShell

     

    Если просто с датой отличной от сегодняшней:

     

    dir | where {$_.lastwritetime.date -ne (get-date).date} | del -whatif

     

    Если старше 7 дней например:

     

    $timex = get-date

    $timex = $timex.AddDays(-7)

    dir | where {$_.lastwritetime -le $timex} | del -whatif

    29 ноября 2007 г. 5:25
    Модератор
  •  VyacheslavNi написано:

    Добрый день!

    Вопрос может и простой, но тем не менее.

    Нужен батник для удаления файлов из каталога с датой отличной от сегодяшней для автоматизации процедуры очистки каталога от старых файлов.

    Заранее спасибо.

     

    Это не совсем скрипт. Но для автоматизации файловых операций есть очень интересная утилита XXCopy.

    http://www.xxcopy.com/index.htm#summary

     

    2 декабря 2007 г. 10:24
  • @echo off

    :: Рекурсивно удаляет все файлы старше 15 дней

    for
    /f "tokens=*" %%i in ('forfiles /s /d-15') do del /q /f /s %%i

    forfiles:
    http://www.dynawell.com/reskit/microsoft/win2000/forfiles.zip
    2 декабря 2007 г. 12:47
  •  01MDM написано:
    @echo off

    :: Рекурсивно удаляет все файлы старше 15 дней

    for
    /f "tokens=*" %%i in ('forfiles /s /d-15') do del /q /f /s %%i

    forfiles:
    http://www.dynawell.com/reskit/microsoft/win2000/forfiles.zip

     

    Точно !!!!!! Про forfiles - то забыл!!!!!! Век живи - век учись.

    Только во нафига через for?

    forfiles /s /d -15 /c "cmd /c del @file"

     

    P.S. Еджинственное "но", forfiles работает, насколько я понимаю, только с датой модификации. Да и работа с каталогами несколько извращенная :-)

    3 декабря 2007 г. 12:58
  • Вставлю и свой вариант для коллекции

     

    Сценарий состоит из двух .cmd файлов.

     

    Первый файл (собственно запускаемый):

     

    Образец кода

    @echo off

    rem   Скрипт удаляет в определенной папке файлы и каталоги старше определенного времени
    rem   и выводит протокол последних удаленных файлов в файл delete_log.log в папке запуска скрипта
    rem
    rem   Принимает два параметра:
    rem   - первый - путь к папке, подлежащей чистке
    rem   - второй - время давности для файлов и папок
    rem   Внимание !!! Для корректной работы скрипта требуется утилита forfiles
    rem   (входит в стандартный комплект поставки MS Windows 2003 Server)

    set Directory_To_Clean=%1%
    set Number_Of_Days_Ago=%2%

    del %CD%\delete_log.log /q

    forfiles /p %Directory_To_Clean% /s /c "cmd /c call %CD%\delete_and_log.cmd @file %Directory_To_Clean% %CD% " /d -%Number_Of_Days_Ago%

     

    Он вызывает второй файл (delete_and_log.cmd):

     

    Образец кода

    @echo off

    set file_name=%1%
    set Directory_To_Clean=%2%
    set log_file_path=%3%

    cd %CD%


    rem Снимаем атрибуты (del не удалит файл с атрибутом system) и удаляем файлы и папки...

    attrib -r-a-s-h %file_name% /d

    del %file_name% /q /f
    rmdir %file_name% /q


    rem Выводим логи

    @echo The file %file_name% was deleted >> %log_file_path%\delete_log.log

     

     

    Схема с разбиением сценария на два файла была выбрана для удоства логирования удаленных файлов (у нас сценарии побольше, я привел сокращенный вариант).

     

    Сценарий также работает на базе утилиты forfiles.Как правильно указывал ранее коллега - данная утилита отбирает файлы по дате их модификации.

    Поэтому использовать данный сценарий для чистки папок файлообмена между пользователями нецелесообразно. Можно нарваться на ситуацию, когда пользователь скопирует в такую папку файл с датой старше положенного по параметру сценария и тогда сценарий просто прибьет файл при следующем своем запуске (файл не пролежит на диске положенный срок).

     

    Но, как говорится, As Is...

    10 декабря 2007 г. 12:51
  • скрипт DelOdLogs.ps1

    #---------------------------------------------------------------

    Param 
    (
           [
    int]     $Period     = 365, #период в днях старше которого файл считается

                          #пригодным к удалению

           [String]$PATH     = $env: systemdrive + \Logs, #каталог для просмотра

           [bool$recurse   = $true                               #включать ли вложенные каталоги
    )
     
    filter Get-OldFiles
    {
        Param
        (
            [
    int]$Period     =      365
        )
       
    if    (
                (
    $_.Attributes -ne "Directory") `
               
    -and `
                (([
    DateTime]::Now.Subtract($_.CreationTime)).Days -gt $Period)
            ) 
            {
                   
    return $_
            }
    }

    if ($recurse

            {dir -path $PATH -recurse -force | Get-OldFiles -Period $Period | Remove-Item}

    else

            {dir -path $PATH -force | Get-OldFiles -Period $Period | Remove-Item}

    #-----------------------------------------------------------------

     

    Пример запуска удалить все файлы в папке c:\App\Logs не включая рекурсивный поиск в поддиректориях все файлы старше 10 дней:

    .\deloldLogs.ps1 -Period 10 -Path "c:\App\Logs" -recurse $false

     

    11 декабря 2007 г. 10:38
  •  Василий Гусев написано:

    PowerShell

     

    Если просто с датой отличной от сегодняшней:

     

    dir | where {$_.lastwritetime.date -ne (get-date).date} | del -whatif

     

    Если старше 7 дней например:

     

    $timex = get-date

    $timex = $timex.AddDays(-7)

    dir | where {$_.lastwritetime -le $timex} | del -whatif


    Отлиичный скрипт. Но у меня есть два вопроса:
    1. Как удалить файлы созданные часом ранее текущего времени?
    2. Как это все оформить в вызов по sheduler?

    Сейчас у меня написан .cmd  файл такого содержания:

    rem Delete old files
    powershell -command  "&
    dir | where {$_.lastwritetime -le $timex} | del -whatif"
    rem End

    который и вызывается. А как оформить вызов многострочного скрипта?
    14 декабря 2007 г. 5:27
  • по 1-му вопросу:

     

    $timex = $timex.AddHours(-1)

     

     

    17 декабря 2007 г. 7:11
  •  Nikolay Ryasnyanski написано:
    Отлиичный скрипт.

    Спасибо! Smile

     Nikolay Ryasnyanski написано:

    Но у меня есть два вопроса:
    1. Как удалить файлы созданные часом ранее текущего времени?

    iura уже ответил, добавлю лишь что подобные методы можно узнать например так:

    Образец кода
    $timex | Get-Member -MemberType method -Name add*

     

     

    Ну или просто

    Образец кода
    $timex | Get-Member

     

     

    чтобы посмотреть все.

     

     Nikolay Ryasnyanski написано:

    2. Как это все оформить в вызов по sheduler?

    Сейчас у меня написан .cmd  файл такого содержания:

    rem Delete old files
    powershell -command  "&
    dir | where {$_.lastwritetime -le $timex} | del -whatif"
    rem End

    который и вызывается. А как оформить вызов многострочного скрипта?

    Просто напросто укажите в качестве команды файл скрипта .ps1 например так:

    Образец кода
    powershell.exe -NoProfile -NonInteractive -command "c:\powershell\ReviewUpdates.ps1"

     

     

    Можно даже без батника вызывать сразу PowerShell.exe Smile

     

    Не забудьте отключить проверку подписанности локальных скриптов! Это можно сделать так:

    Образец кода
    Set-ExecutionPolicy remotesigned

     

     

    По умолчанию разрешено выполнение только скриптов подписанных доверенными издателями.

    17 декабря 2007 г. 7:23
    Модератор
  •  

    Удаление не наш метод Smile

    подскажите гуру! как сделать что бы не удалял а перемещал из определенной папки файлы старше даты на сетевую шару.

     

    вот скрипт супер... тольк бы он еще и папки чистил за собой ...

    так вот вопрос то в чем что тут нужно подправитьчто бы он папки и файлы переносил на определенный путь...

     

    Snippet

    'данный скрипт удаляет в директори все файлы, у которых
    'дата последней модификации старше определенного количества дней
    'синтаксис таков
    'killdateparam.vbs /path:<folder> /killdate:<days> /recur:<true of false>
    '<folder> - папка над которой будут производиться действия
    '<days> - указывает старше скольки дней файлы будут удаляться
    '<true of false> - использовать или нет рекурсию
    'например
    'killdateparam.vbs /path:c:\0\ /killdate:8 /recur:true
    'Отмечу также, что если параметры содержат пробелы,
    'в нашем случае это может быть путь к папке, то его надо
    'брать в кавычки
    '
    'ISA
    '
    set objNamedArgs=Wscript.Arguments.Named
     
    path=objNamedArgs.item("path")
    killdate=date() - objNamedArgs.item("killdate")
    recur=objNamedArgs.item("recur")
     
    wscript.echo path, killdate, recur
     
    arFiles = Array()
    set fso = createobject("scripting.filesystemobject")
     
    'Ничего не удаляем, пока пробегаем по возвращенному набору файлов.
    'Набор может быть перемешан.
    'Создаём массив файловых объектов, чтобы этого избежать
     

    SelectFiles path, killdate, arFiles, recur
     
    nDeleted = 0
    for n = 0 to ubound(arFiles)
     
    on error resume next 'in case of 'in use' files...
    arFiles(n).delete true
    if err.number = 0 then
    nDeleted = nDeleted + 1
     
    end if
    on error goto 0
    next
     
    sub SelectFiles(sPath,vKillDate,arFilesToKill,bIncludeSubFolders)
    on error resume next
    ' добавляем файлы на удаление в массив
    '
     
    set folder = fso.getfolder(sPath)
    set files = folder.files
    for each file in files
    ' на всякий случай отслеживаем ошибки доступа к
    ' свойству Date
    '
    dtlastmodified = null
    on error resume Next
    dtlastmodified = file.datelastmodified
    on error goto 0
    if not isnull(dtlastmodified) Then
    if dtlastmodified < vKillDate then
    count = ubound(arFilesToKill) + 1
    redim preserve arFilesToKill(count)
    set arFilesToKill(count) = file
    end if
    end if
    next
     
    if bIncludeSubFolders then
    for each fldr in folder.subfolders
    SelectFiles fldr.path,vKillDate,arFilesToKill,true
    next
    end if
    end sub
    11 января 2008 г. 1:20
  • 1) Оформи в виде "кода". Не читается :-( Ни отступов и шрифт не тот :-)

    2) robocopy /? | more - Вот тебе и move :-)

    (Хотя - robocopy в nul , вот тебе и удаление :-))))) Но МЫ НЕ ИЩЕМ ЛЁГКИХ ПУТЕЙ :-)

     

     

    Проверил. Неа. Robocopy null никак не хочет видеть :-( Я не уговорил ....

    Можно только с помощью заранее известного пустого каталога :

    Образец кода

    for /F "tokens=*" %i in ('robocopy I:\MyDir\ c:\Empty  /MIR /MinAge:40 /NDL /NS /NC /FP /L /NJH /NJS') do @del "%i"

     

     

    Где

    I:\MyDir -  исходный каталог

    C:\Empty - заранее известный пустой каталог

    40 - количество дней

    11 января 2008 г. 9:06
  • Рекомендую всем очень мощную (бесплатную для некоммерческого использования) программу XXCOPY.

    http://www.xxcopy.com/index.htm

     

    Данную конкретную задачу решает следующим образом:

    Образец кода
    xxcopy.exe <path>\* /RS /DB#1 /ED /YY

     

     

    /RS - удалить файлы без копирования

    /DB#1 - обрабатывать файлы с датой на 1 день и более раньше текущей.

    /ED - игнорировать пустые каталоги

    /YY - не выдавать запросы (prompt) при пакетной обработке.

     

    А, вообще, возможностей ОЧЕНЬ много !...

    11 января 2008 г. 9:43
  •  Andrey Kudrjashov написано:

    Рекомендую всем очень мощную (бесплатную для некоммерческого использования) программу XXCOPY.

    http://www.xxcopy.com/index.htm

     

    А, вообще, возможностей ОЧЕНЬ много !...

     

    Забавная машинка, НО только Pro:

    "XXCOPY Pro supports file transfers between networked computers."

    А Pro уже денг стОит (и 40$ для утилиты такого класса, дорого, IMHO)

     

    А бесплатная ROBOCOPY (в ходящая в составв Resoource Kit берущегося с MS) умееет. При тех-же возмолжностях (ну разве только удалять не уеет, но я показал как её обмануть выше) и 35-ти страничном описании ключей командной строки.

    11 января 2008 г. 10:22
  •  

    Есть скрипт, найденный в интернете:

     

    ' ----------
    ' Начало основной секции. Отсюда начнется выполнение при запуске скрипта.
    Set FSO = CreateObject("Scripting.FileSystemObject")
    ' директория, где будут храниться бэкапы. Вы должны вписать свою директорию
    ' вместо "X:\DailyBackup"

    sDir = "X:\DailyBackup"
    Set objDir = GetFolder(sDir)
    DeleteOlderFiles(objDir)

    ' ---------- Секция функций

    ' Получить файл

    Function GetFile(sFile)
    On Error Resume Next

    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set GetFile = FSO.GetFile(sFile)
    if err.number <> 0 then
    WScript.Echo "Error Opening file " & sFile & VBlf & "["&Err.Description&"]"
    Wscript.Quit Err.number
    end if
    End Function

    ' Получить папку
    Function GetFolder (sFolder)
    On Error Resume Next

    Set GetFolder = FSO.GetFolder(sFolder)
    if err.number <> 0 then
    WScript.Echo "Error Opening folder " & sFolder & VBlf & "["&Err.Description&"]"
    Wscript.Quit Err.number
    end if
    End Function

    ' удалить один файл (имя файла передается в sFile)
    Sub DeleteFile(sFile)
    On Error Resume Next

    FSO.DeleteFile sFile, True
    if err.number <> 0 then
    WScript.Echo "Error Deleteing file " & sFile & VBlf & "["&Err.Description&"]"
    Wscript.Quit Err.number
    end if
    End Sub

    ' Удалить файлы старше 7 дней
    Sub DeleteOlderFiles(objDir)
        ' просматриваем все файлы в директории
    for each efile in objDir.Files
    ' используем DateLastModified, а не DateCreated, поскольку
    ' DateCreated не всегда возвращает правильную дату

    FileDate = efile.DateLastModified
    Age = DateDiff("d",Now,FileDate)
    ' в данном случае возраст файла не больше семи дней
    If Abs(Age)>7 Then
    DeleteFile(efile)
    End If
    next
    End Sub    

     

     

    Не могу понять, как сдалать так,. чтобы он не только файлы чистил в корне, но и в подпапках....

     

    Да и вообще хотелось бы понять: скрипт для файлов использует дату последнего изменения..., но в папках такого параметра нет... и непонятно как отслеживать время жизни папок???

    Цель: чистка папки раз в неделю.

     

    Заранее спасибо.

     

    19 марта 2008 г. 14:12
  • а как указать из какого каталога удалять? расскажите о подробней я чет непонял

    Code Snippet

    forfiles /s /d -15 /c "cmd /c del @file"



  •  Evgenххх написано:
    а как указать из какого каталога удалять?

    Вроде так:

    Code Snippet

    cd "c:\мой каталог"

    forfiles /s /d -15 /c "cmd /c del @file"

    Модератор
  • Отличный скрипт.
    Немного переделал и взял на вооружение.
    Убрал %% при введении переменной set Directory_To_Clean иначе он в корень диска C лез почемуто даже если указан D например.
    Остался вопрос.
    Вернее просьба, прокомментируйте пожалуйста вот это
    set file_name=%1%
    set Directory_To_Clean=%2%
    set log_file_path=%3%
    без этого не сохраняется лог, но зачем это до меня не доходит.

  • PowerShell

     

    Если просто с датой отличной от сегодняшней:

     

    dir | where {$_.lastwritetime.date -ne (get-date).date} | del -whatif

       

    Если старше 7 дней например:

     

    $timex = get-date

    $timex = $timex.AddDays(-7)

    dir | where {$_.lastwritetime -le $timex} | del -whatif

    Отличный скрипт, только как его допилить, чтобы он удалял еще и папки с вложениями?

    Спасибо!

    31 января 2012 г. 7:07
  • >как его допилить, чтобы он удалял еще и папки с вложениями?

    добавте параметр -Recurse для командлета del


    my blog: http://shserg.ru/
    2 февраля 2012 г. 5:44
  • PowerShell

     

    Если просто с датой отличной от сегодняшней:

     

    dir | where {$_.lastwritetime.date -ne (get-date).date} | del -whatif

     

    Если старше 7 дней например:

     

    $timex = get-date

    $timex = $timex.AddDays(-7)

    dir | where {$_.lastwritetime -le $timex} | del -whatif

    Куда надо прописать папку из которой необходимо удалять файлы? 
    • Изменено Антно 10 ноября 2016 г. 8:17
    10 ноября 2016 г. 8:16
  • Вот нормальный код, а не та лажа которую тут выкладывали:

    Get-ChildItem -Recurse "C:\File\Папка" | where {$_.lastwritetime -le ((get-date).AddDays(-8))} | Remove-Item -Recurse

    где "C:\File\Папка" путь к папке в которой надо чистить, AddDays(-8) количество дней 8 




    • Изменено Антно 18 декабря 2016 г. 19:25
    18 декабря 2016 г. 19:23
  • После dir добавьте параметр -Path "Путь_к_папке"

    dir - это алиас команды Get-ChildItem

    Как использовать эту команду можно посмотреть в справке

    Get-Help Get-ChildItem -full

  • антно - гондно! бгггг!

    вот меня умиляют такие люди..

    А почему вы плинию про его неправоту не рассказываете и за галлилея с бруной не впрягаетесь?

    сначала, всего лишь через 4 года, находится один ммммму... чудак который объявляет весь код написанный выше лажей и приводит свой, который фактически дублирует предыдущий, не обращая внимания на то что тема поднята через полгода после первого релиза повершелла, когда им и не пахло на 98% мирового виндового продакшена.

    потом находятся правдолюбцы, которые, по прошествии еще полутора лет, начинают гнать тривиальщину.

    вот чем руководствуются эти ******* некроманты? и чем им эти посты так понравились, а вот до сих пор(!!!) плиния с его людьми с песьими головами и т.п. еще никто остракизму не предал?

    ****** ***** (с) С.В. Лавров

    З.Ы.2модерс, я уже сам запикал экспрессивные и неприятные выражения.

  • вот чем руководствуются эти ******* некроманты? и чем им эти посты так понравились,

    Либо просто невнимательность, когда отвечают на тему в поиске, а не на форуме, и не обращают внимание на дату (триггер поиска - релевантность). Либо старый тред содержит какую-нибудь хрень типа уязвимых шрифтов  во вставках и используется для малопонятных целей даркнета, Тут, наоборот, надо быть внимательным. 


    PS  не отражается этот тред в ""действиях" ни у Антно, ни у Вас ни у меня.
    • Изменено RH6M6 31 мая 2017 г. 1:25