it-swarm-ru.tech

Удалить файлы старше (x) дней?

Каков хороший вариант командной строки Windows для удаления всех файлов в данной папке старше (n) дней?

Также обратите внимание, что может быть много тысяч таких файлов, поэтому forfiles с Shell to cmd не очень хорошая идея здесь ... если вы не любите создавать тысячи командных оболочек. Я считаю, что это довольно неприятный взлом, поэтому посмотрим, сможем ли мы добиться большего успеха!

В идеале, что-то встроенное (или легко устанавливаемое в) Windows Server 2008.

31
Jeff Atwood

Я оглянулся немного больше и нашел способ PowerShell :

Удалить все файлы старше 8 дней из указанной папки (с предварительным просмотром)

dir |? {$_.CreationTime -lt (get-date).AddDays(-8)} | del -whatif

(удалите -whatif, чтобы это произошло)

44
Jeff Atwood

Люблю команду PowerShell Джеффа, но для альтернативного решения vbs для компьютеров с Windows без PowerShell вы можете попробовать следующее.

Сохранить как <filename>.vbs и ​​выполнить:

<filename>.vbs <target_dir> <NoDaysSinceModified> [Action]

Третий параметр, [Action] не является обязательным. Без него файлы старше <NoDaysSinceModified> будет в списке. Если он установлен как D, он будет удалять файлы старше <NoDaysSinceModified>

Пример

PurgeOldFiles.vbs "c:\Log Files" 8

будет перечислять все файлы в c:\Log Files старше 8 дней

PurgeOldFiles.vbs "c:\Log Files" 8 D

удалит все файлы в c:\Log Files старше 8 дней

примечание: это модифицированная версия скрипта Хайдонга Джи на SQLServerCentral.com

Option Explicit
on error resume next
    Dim oFSO
    Dim sDirectoryPath
    Dim oFolder
    Dim oFileCollection
    Dim oFile
    Dim iDaysOld
    Dim fAction

    sDirectoryPath = WScript.Arguments.Item(0)
    iDaysOld = WScript.Arguments.Item(1)
    fAction = WScript.Arguments.Item(2)
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    set oFolder = oFSO.GetFolder(sDirectoryPath)
    set oFileCollection = oFolder.Files

If UCase(fAction) = "D" Then
'Walk through each file in this folder collection. 
'If it is older than iDaysOld, then delete it.
    For each oFile in oFileCollection
        If oFile.DateLastModified < (Date() - iDaysOld) Then
            oFile.Delete(True)
        End If
    Next
else
'Displays Each file in the dir older than iDaysOld
    For each oFile in oFileCollection
        If oFile.DateLastModified < (Date() - iDaysOld) Then
            Wscript.Echo oFile.Name & " " & oFile.DateLastModified
        End If
    Next
End If


'Clean up
    Set oFSO = Nothing
    Set oFolder = Nothing
    Set oFileCollection = Nothing
    Set oFile = Nothing
    Set fAction = Nothing
7
PaulPlum

Посмотрите на это http://sourceforge.net/projects/delold так как это то, что я использую.

просто но работает. delold -d 14 Удаляет файлы старше 14 дней в текущей папке.

4
Ian Stewart

Не совсем командная строка, но мне нравится использовать LINQPad в качестве хоста C #:
(который только дал мне идею для командной строки C # сценариев thingie à la VBS файлов)

var files = from f in Directory.GetFiles(@"D:\temp", "*.*", SearchOption.AllDirectories)
            where File.GetLastWriteTime(f) < DateTime.Today.AddDays(-8)
            select f;

foreach(var f in files)
    File.Delete(f);
4
Lucas

Нечто подобное можно достичь с помощью команды "найти" cygwin (или другой альтернативы). Но для этого потребуется установить Cygwin или иметь переносную версию под рукой.

3
Moshe

Еще одна альтернатива, которую я использовал до powershell:

http://lifehacker.com/133190/geek-to-live--hard-drive-janitor

2
JakeRobinson

Я использую autoIT для достижения этой цели в моих системах. Мне нравится, что вы можете легко скомпилировать файлы .au3. Не так просто ввести недостаток безопасности, как с файлом bat, который может редактировать каждый.

2
DaffyDuc