Dans mon quotidien, je cherche autant que cela se peut à automatiser les tâches courantes. Sauvegarde & archivages sont en haut de la liste de mes préoccupations et Powershell est mon outil privilégié sous Windows.
Mes scripts génèrent des fichiers de données, de log… que je souhaite conserver un certain temps. Mais il faut que je prévoie une purge des anciens fichiers pour ne pas remplir mes serveurs de journaux devenus inutiles.
Dans la rédaction de tous mes scripts, la difficulté à gérer la rétention des fichiers revient régulièrement : En fonction du contexte applicatif, je me base sur des attributs de fichiers, la date de création ou – le cas souvent le plus complexe – l’analyse du nom du fichier…
Cette semaine, alors que je regardais l’excellent outil de sauvegarde HVBAckup, je suis tombé sur un exemple de scripts SHELL qui m’a interpellé ! Il faisait référence à une commande FORFILES que je ne connaissais pas.
Il s’agit en fait d’une commande désormais native sous Windows 2008 R2 qui permet d’exécuter une commande les fichiers ne répondant qu’à des critères de DATE ou de MASQUE de NOM.
Syntaxe
La syntaxe de base est la suivante (source : http://ss64.com/nt/forfiles.html):
FORFILES [/p Path] [/m Mask] [/s] [/c Command] [/d [+ | -] {dd/MM/yyyy | dd}
Key
/p Path The Path to search (default=current folder)
/s Recurse into sub-folders
/C command The command to execute for each file. Wrap the command string in double quotes. Default = “cmd /c echo @file”
The Command variables listed below can also be used in the command string.
/D date Select files with a last modified date greater than or equal to (+), or less than or equal to (-), the specified date using the “dd/MM/yyyy” format;
/D + dd Select files with a last modified date greater than or equal to the current date plus “dd” days. (in the future)
/D – dd Select files with a last modified date less than or equal to the current date minus “dd” days. (in the past)
A valid “dd” number of days can be any number in the range of 0 to 32768. (89 years) “+” is taken as default sign if not specified.
La commande peut utiliser des variables relatives au fichier retenu :
@file The name of the file.
@fname The file name without extension.
@ext Only the extension of the file.
@path Full path of the file.
@relpath Relative path of the file.
@isdir Returns “TRUE” if a file type is a directory, and “FALSE” for files.
@fsize Size of the file in bytes.
@fdate Last modified date of the file.
@ftime Last modified time of the file.
Quelques exemples
Dans la pratique, voilà ce que ça donne:
Supprimer tous les fichiers “testfiles.txt” datant de plus de 5 jours
C:> forfiles /m testfile.txt /c “cmd /c Del testfile.txt ” /d -5
Liste les fichiers EXCEL n’ayant pas été modifiés depuis plus de 30 jours
C:> FORFILES /M *.xls /C “cmd /c echo @path was changed 30 days ago” /D -30
Lister les fichiers DOC present dans le dossier courant et tous les sous-dossiers
C:> FORFILES /S /M *.doc /C “cmd /c echo @fsize”
Supprimer tous les fichiers ZIP datant de plus de 7 jours dans le dossier \yourserveryourpath
set BCKPATH=”\yourserveryourpath”
pushd %BCKPATH% && forfiles.exe -m *.zip -d -7 -c “cmd /c del @path”
popd