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 forfiles
avec un Shell à cmd
n'est pas une bonne idée ici .. à moins que vous n'aimiez 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.
J'ai regardé un peu plus autour et 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)
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>.vbs
et exécutez:
<filename>.vbs <target_dir> <NoDaysSinceModified> [Action]
Le troisième paramètre, [Action]
est facultatif. Sans lui, les fichiers antérieurs à <NoDaysSinceModified>
sera répertorié. Lorsqu'il est défini sur D
, il supprimera les fichiers antérieurs à <NoDaysSinceModified>
Exemple
PurgeOldFiles.vbs "c:\Log Files" 8
listera tous les fichiers dans c:\Log Files
plus de 8 jours
PurgeOldFiles.vbs "c:\Log Files" 8 D
supprimera tous les fichiers dans c:\Log Files
plus 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
Jetez un oeil à cela 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.
Pas vraiment en ligne de commande, mais j'aime utiliser LINQPad comme hôte de script C #:
(qui vient de me donner une idée pour une ligne de commande 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);
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.
Une autre alternative que j'utilisais avant PowerShell:
http://lifehacker.com/133190/geek-to-live--hard-drive-janitor
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.