Supprimer les fichiers de plus de (x) jours?

31

Quelle est une bonne option de ligne de commande Windows pour supprimer tous les fichiers d'un dossier donné datant de plus de (n) jours?

Notez également qu'il peut y avoir plusieurs milliers de ces fichiers, donc forfilesavec un shell à cmdn'est pas une bonne idée ici .. sauf si vous aimez générer des milliers de shells de commande. Je considère que c'est un hack assez méchant, alors voyons si on peut faire mieux!

Idéalement, quelque chose intégré à (ou facilement installable dans) Windows Server 2008.

Jeff Atwood
la source
2
Une nouvelle méthode basée sur un fichier .BAT qui utilise uniquement les commandes internes CMD.EXE a été publiée ici: stackoverflow.com/questions/9746778/…

Réponses:

43

J'ai regardé un peu plus autour de moi et j'ai trouvé un moyen PowerShell :

Supprimer tous les fichiers de plus de 8 jours du dossier spécifié (avec aperçu)

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

(supprimez le-whatif pour y arriver)

Jeff Atwood
la source
1
Pour confirmer, cela supprime-t-il définitivement les fichiers ou les recycle-t-il?
TimS
Ops trop dur pour mémoriser !! J'adore PowerShell mais je pense que la meilleure façon est d'utiliser Robocopy
AminM
7

J'adore la commande PowerShell de Jeff, mais pour une solution vbs alternative pour les machines Windows sans PowerShell, vous pouvez essayer ce qui suit.

Enregistrer sous <filename>.vbset exécuter:

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

Le troisième paramètre [Action]est facultatif. Sans cela, les fichiers plus anciens que <NoDaysSinceModified>seront répertoriés. Avec elle définie car Delle supprimera les fichiers antérieurs à<NoDaysSinceModified>

Exemple

PurgeOldFiles.vbs "c:\Log Files" 8

sera la liste de tous les fichiers dans c:\Log Filesplus de 8 jours

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

va supprimer tous les fichiers dans c:\Log Filesplus de 8 jours

note: il s'agit d'une version modifiée du script de Haidong Ji sur 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
la source
J'utilise quelque chose comme ça pour supprimer les anciens journaux du serveur Web. A assez bien fonctionné.
jeffspost
4

Pas vraiment en ligne de commande, mais j'aime utiliser LINQPad comme hôte de script C #:
(ce qui m'a juste donné une idée pour un truc de script C # en ligne de commande à 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);
Lucas
la source
Linq est vraiment génial, je souhaite que cela soit intégré à PowerShell.
Taylor Gibb
4

Jetez un oeil à ce http://sourceforge.net/projects/delold car c'est ce que j'utilise.

simple mais fonctionne. delold -d 14 Supprime les fichiers de plus de 14 jours dans le dossier actuel.

Ian Stewart
la source
3

Quelque chose de similaire peut être réalisé avec la commande "find" de cygwin (ou une autre alternative). Mais cela vous obligerait à installer cygwin ou à avoir la version portable à portée de main.

Moshe
la source
2

J'utilise autoIT pour accomplir cela sur mes systèmes. J'aime que vous puissiez compiler facilement des fichiers .au3. Pas aussi facile d'introduire une faille de sécurité qu'avec un fichier de chauve-souris que n'importe qui peut modifier.

DaffyDuc
la source