Script de suppression de fichiers plus anciens que


8

Donc, dans le travail de sauvegarde, j'ai besoin d'un script batch qui me permettrait de supprimer des fichiers dans un répertoire spécifié, qui sont plus anciens que disons 3 jours. Ce script sera défini comme une tâche planifiée à exécuter à une heure spécifiée chaque jour.


Êtes-vous lié au lot? Et PowerShell?
Nate

Powershell devrait pouvoir fonctionner, je suis juste habitué au batch et je n'ai jamais joué avec Powershell.
Chiggins

Réponses:


8

Si PowerShell est acceptable (devrait l'être, car il est activé par défaut sur Server 2008+), essayez ceci:

$numberOfDays = 3
$Now = Get-Date
$TargetFolder = “C:\myoldfiles”
$LastWrite = $Now.AddDays(-$numberOfDays)
$Files = get-childitem $TargetFolder -include *.bak, *.x86 -recurse | Where {$_.LastWriteTime -le “$LastWrite”} 

foreach ($File in $Files)
{
    write-host “Deleting File $File” -foregroundcolor “Red”;
    Remove-Item $File | out-null
} 

Souce ici .


2
+1. En outre, pour fins de test , vous pouvez ajouter le « -whatif » drapeau: Remove-Item $File -whatif | out-null. Pour s'exécuter en tant que tâche de planification, le travail doit spécifier le chemin d'accès complet à powershell.exe avec votre script nommé comme argument.
AndyN

J'ai trouvé la même solution pour commencer - mais j'ai rencontré des problèmes avec la charge de mémoire associée à l'obtention de tous les fichiers à l'avance.
Tim Barrass

13
forfiles -pc: \ pathtofiles \ -m * .rar -d -5 -c "cmd / c del @path"

Quel -5est l'âge des fichiers que vous souhaitez supprimer (5 jours ou plus dans ce cas). Ce script supprime des .rarfichiers - supprimez le -m *.rarsi vous souhaitez supprimer n'importe quel type de fichier.


1
De toutes ces réponses, c'est la seule (jusqu'à présent) qui répond directement à la question.
John Gardeniers

3

Si vous insistez pour utiliser des fichiers batch, Robocopy.exe est votre réponse. Son rapide (multithread) et très robuste. Pour votre scénario, vous pouvez utiliser les éléments suivants comme guide:

:: Moves dir & files older than 3 days to i:\Destination
:: Wildcards acceptable
robocopy i:\Source\ i:\Destination\ /MOVE /MIR /MINAGE:3 /ETA
:: Removes the destination tree
rd /s /q i:\destination

Il y a une longue liste d'options, veuillez faire une photocopie /? pour les voir tous. Vous pouvez même l'utiliser pour effectuer des sauvegardes incrémentielles, planifier, créer des profils de sauvegarde, etc.


Tous les +1 pour la robocopie! <3 Concernant votre exemple: je ne sais pas si le commutateur / MIR convient à cette situation, le / MOVE devrait répondre à la question de Chiggins. Une chose est sûre, robocopy a une tonne d'options, un examen attentif est nécessaire.
JamesCW

2

J'aime utiliser DelEn.exe pour cela.

Delen - DELete ENhanced - est une version optimisée de DEL. Il prend en charge les caractères génériques étendus et les répertoires parents, ainsi que les filtres de date, d'heure et de taille. Les fichiers peuvent être exclus de la suppression.


2

Vous pourriez regarder DelAge32 de Horst Schaeffer:

http://home.mnet-online.de/horst.muc/wbat32.htm#top

DelAge32 - ver. 2.3 (c) 2003-2008, Horst Schaeffer
Deletes or moves files (path with file pattern) by age (number of days)
Syntax:  DelAge32 filespec age [options]
Options:
  /created /accessed /modified (default) - file stamp used to evaluate age
  /includeRO - include read-only files
  /includeH  - include hidden files
  /includeS  - include system files
  /includeRHS -include read-only, hidden and system files
  /recurse   - include subdirectories
  /subonly   - /recurse excluding initial directory
  /rd        - remove empty subdirectories
  /move path - move files to specified path
  /preview   - list, but no action
  /quiet     - no output

Votre commande peut être aussi simple que:

delage32.exe c:\logdirectory\*.log 3

J'ai cette commande exécutée en tant que tâche planifiée.


Cela est signalé comme une menace dans Cylance.
dim

Delage32.exe obtient une note de 0/53 sur virustotal.com, où zéro signifie qu'aucune menace n'a été détectée parmi les 53 meilleurs outils AV. Vous voudrez peut-être changer votre AV pour quelque chose de plus courant.
RobW

Ce n'est pas mon choix. Je préviens simplement quiconque utilise Cylance pour renoncer à delage32 ou utiliser forfiles
Sun

1

C'est un script PowerShell que j'ai écrit pour faire ce que vous voulez - il en fait un peu plus aussi. Je l'utilise pour effacer les journaux et autres fichiers temporaires.

purge-dem-logs.cmd

powershell.exe -command "& 'c:\purgelogs\purgelogs.ps1' -Filepath D:\SQL\backup\ -filemask *.bak -Maxdays 14 "

purgelogs.ps1:

Param ($filepath, $filemask, $maxdays, [switch]$recurse)

   if (($FilePath -eq $null) -or ($FileMask -eq $null) -or ($MaxDays -eq $null)) {
      write-host "Usage .\purgelogs.ps1 -filepath [Path] -filemask [Mask] -masdays [Max Days]"
      write-host " "
      write-host "Example: "
      write-host "    .\purgelogs.ps1 -filepath c:\temp -filemask *.log -maxdays 30"
      break
      }

   if (Test-Path $FilePath) {

      $FilePath += "*"

      $Now = Get-Date

      $LastWrite = $Now.AddDays(-$MaxDays)

      write-host "Last write time " $LastWrite
      if ($recurse) {
         $Files = get-childitem $FilePath -include $FileMask -recurse | Where {$_.LastWriteTime -le "$LastWrite"}
      } else {
         $Files = get-childitem $FilePath -include $FileMask | Where {$_.LastWriteTime -le "$LastWrite"}
      }

      if ($Files -eq $null) {

         write-host "No matching files found"

      } else {

          foreach ($File in $Files)
            #You can add -whatif to see the consequence û Remove-item $File -Whatif
            {
            write-host "Deleting File $File" -foregroundcolor "Red"; Remove-Item $File | out-null
            }
         }
      }
   Else
      {
      Write-Host "The Folder $FilePath Does Not Exist!"
      }

1

Cela ne fonctionnera pas pour les ordinateurs distants. Les administrateurs doivent gérer plusieurs ordinateurs. Vous trouverez ci-dessous le script qui peut être utilisé pour supprimer des dossiers sur plusieurs ordinateurs distants sans avoir à vous y connecter.

Le script ci-dessous supprimera les dossiers de plus de 15 jours. vous pouvez cependant changer le paramètre $ days.

D $ \ Program Files (x86) \ Research In Motion \ BlackBerry Enterprise Server \ Logs est le chemin UNC du dossier Blackberry Log. Vous pouvez changer le répertoire où se trouvent vos journaux / dossiers.

Répertoriez tous vos noms de serveur dans le fichier servers.txt et il devrait se trouver dans le même répertoire que ce script.

cd C:\Scripts\Powershellscripts\deletefiles ----> change it to the directory you wanna out this script to

$Days = "15" 
$Now = Get-Date
$LastWrite = $Now.AddDays(-$days)
$server = get-content servers.txt
foreach ($node in $server)
{
get-childitem -recurse "\\$node\D$\Program Files (x86)\Research In Motion\BlackBerry Enterprise Server\Logs" | Where-Object {$_.LastWriteTime -le $LastWrite} | remove-item -recurse -force
}

Enregistrez le script sous .ps1 et exécutez-le. Vous pouvez le planifier via un fichier batch. De cette façon, vous devez ajouter la commande Change Directory au début du script.

S'amuser.


0

Comme approche alternative: au lieu de compter sur l'interrogation du système de fichiers pour obtenir les heures de création de fichiers (et frapper les mêmes fichiers sur plusieurs jours, jusqu'à leur expiration), vous pouvez ajouter le fichier à votre propre index au moment de la création. L'index pourrait être aussi simple qu'un fichier nommé d'après la date de création, stocké dans un emplacement connu, avec un fichier par ligne.

Si vous disposez d'une application multithread / multiprocessus créant des fichiers, vous souhaiterez peut-être que votre index soit géré de manière plus sophistiquée.

L'avantage serait que vous ayez toujours une liste de fichiers relativement simple à créer un certain jour que vous pouvez parcourir, plutôt que d'avoir à demander au système de fichiers encore et encore des détails.

(Cela dépendrait de l'application et de la création de fichiers, gérées par vous et non par un tiers).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.