Видалити файли старші (x) днів?


31

Що є хорошим варіантом командного рядка Windows для видалення всіх файлів у певній папці, старших ніж (n) днів?

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

В ідеалі - щось вбудоване (або легко встановлене в) Windows Server 2008.


2
Новий метод , заснований в файлі .BAT , які використовують внутрішні команди CMD.exe тільки була розміщена тут: stackoverflow.com/questions/9746778 / ...

Відповіді:


43

Я трохи більше озирнувся і знайшов спосіб :

Видалити всі файли віком понад 8 днів із зазначеної папки (з попереднім переглядом)

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

(видаліть -whatif, щоб це сталося)


1
Щоб підтвердити, чи видаляє файли назавжди або переробляє їх?
TimS

Ops занадто складно !! записуються в пам'ять я люблю PowerShell , але я думаю , що найкращий спосіб використовує Robocopy
AminM

7

Команда PowerShell Love Jeff, але для альтернативного рішення 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

Я використовую щось подібне для видалення старих журналів веб-сервера. Вийшов непогано.
jeffspost

4

Насправді не командний рядок, але мені подобається використовувати LINQPad як хост сценаріїв C #:
(що щойно дало мені уявлення про командний рядок C # scripting 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);

Linq дійсно приголомшливий, я б хотів, щоб це принесло в PowerShell.
Тейлор Гібб


3

Щось подібного можна досягти за допомогою команди «знайти» cygwin (або іншої альтернативи). Але для цього знадобиться встановити cygwin або мати під рукою портативну версію.



2

Для цього я використовую autoIT у своїх системах. Мені подобається, що ви можете легко компілювати .au3 файли в exe легко. Не так просто запровадити недолік безпеки, як це стосується файлу bat, який кожен може редагувати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.