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

31

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

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

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

Джефф Этвуд
источник
2
Новый метод, основанный на .BAT-файле, который использует только внутренние команды CMD.EXE, был размещен здесь: stackoverflow.com/questions/9746778/…

Ответы:

43

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

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

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

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

Джефф Этвуд
источник
1
Чтобы подтвердить, это навсегда удаляет файлы или перерабатывает их?
TimS
Ops слишком сложно !! записываются в память я люблю PowerShell , но я думаю , что лучший способ использует Robocopy
AminM
7

Люблю команду 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
PaulPlum
источник
Я использую что-то вроде этого, чтобы удалить старые журналы веб-сервера. Сработало довольно хорошо.
Jeffspost
4

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

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);
Лукас
источник
Linq действительно потрясающий, я бы хотел, чтобы он привел в PowerShell.
Тейлор Гибб
3

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

Моше
источник
2

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

DaffyDuc
источник