Question Fichier batch pour supprimer les fichiers de plus de N jours


Je cherche un moyen de supprimer tous les fichiers de plus de 7 jours dans un fichier batch. J'ai recherché sur le Web et trouvé des exemples avec des centaines de lignes de code, et d'autres qui nécessitaient l'installation d'utilitaires de ligne de commande supplémentaires pour accomplir la tâche.

Des choses similaires peuvent être fait à BASH en quelques lignes de code. Il semble que quelque chose au moins à distance pourrait être fait pour les fichiers batch dans Windows. Je suis à la recherche d'une solution qui fonctionne dans une invite de commande Windows standard, sans aucun utilitaire supplémentaire. S'il vous plaît pas PowerShell ou Cygwin non plus.


593
2017-09-09 01:05


origine


Réponses:


Prendre plaisir:

forfiles -p "C:\what\ever" -s -m *.* -d <number of days> -c "cmd /c del @path"

Voir documentation forfile pour plus de détails.

Pour plus de goodies, reportez-vous à Un index A-Z de la ligne de commande Windows XP.

Si vous n'avez pas forfiles installé sur votre machine, copiez-le depuis Windows Server 2003 à votre machine Windows XP à %WinDir%\system32\. Ceci est possible puisque le fichier EXE est entièrement compatible entre Windows Server 2003 et Windows XP.

Les versions ultérieures de Windows et de Windows Server l'ont installé par défaut.

Pour Windows 7:

La syntaxe a changé un peu. Par conséquent, la commande mise à jour est:

forfiles /p "C:\what\ever" /s /m *.* /D -<number of days> /C "cmd /c del @path"

937
2017-09-09 01:18



Exécutez les opérations suivantes commandes:

ROBOCOPY C:\source C:\destination /mov /minage:7
del C:\destination /q

Déplacez tous les fichiers (en utilisant / mov, qui déplace les fichiers, puis les supprime par opposition à / move qui déplace les fichiers entiers qui sont ensuite supprimés) via robocopy à un autre emplacement, puis exécutez une commande delete sur ce chemin et vous êtes tous bien.

Aussi, si vous avez un répertoire avec beaucoup de données, vous pouvez utiliser /mir commutateur


68
2018-05-27 08:40



Ok s'ennuyait un peu et est venu avec cela, qui contient ma version du remplacement d'une époque pauvre d'un pauvre homme pour un usage quotidien (pas de rétention du temps):

7daysclean.cmd

@echo off
setlocal ENABLEDELAYEDEXPANSION
set day=86400
set /a year=day*365
set /a strip=day*7
set dSource=C:\temp

call :epoch %date%
set /a slice=epoch-strip

for /f "delims=" %%f in ('dir /a-d-h-s /b /s %dSource%') do (
    call :epoch %%~tf
    if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)
)
exit /b 0

rem Args[1]: Year-Month-Day
:epoch
    setlocal ENABLEDELAYEDEXPANSION
    for /f "tokens=1,2,3 delims=-" %%d in ('echo %1') do set Years=%%d& set Months=%%e& set Days=%%f
    if "!Months:~0,1!"=="0" set Months=!Months:~1,1!
    if "!Days:~0,1!"=="0" set Days=!Days:~1,1!
    set /a Days=Days*day
    set /a _months=0
    set i=1&& for %%m in (31 28 31 30 31 30 31 31 30 31 30 31) do if !i! LSS !Months! (set /a _months=!_months! + %%m*day&& set /a i+=1)
    set /a Months=!_months!
    set /a Years=(Years-1970)*year
    set /a Epoch=Years+Months+Days
    endlocal& set Epoch=%Epoch%
    exit /b 0

USAGE

set /a strip=day*7 : Changement 7 pour le nombre de jours à garder.

set dSource=C:\temp : C'est le répertoire de départ pour vérifier les fichiers.

REMARQUES

C'est un code non destructif, il affichera ce qui serait arrivé.

Changement :

if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)

à quelque chose comme:

if !epoch! LEQ %slice% del /f %%f

donc les fichiers sont effectivement supprimés

février: est codé en dur à 28 jours. Bissextile années est un enfer à ajouter, vraiment. Si quelqu'un a une idée qui n'ajouterait pas 10 lignes de code, allez-y et postez donc je l'ajoute à mon code.

époque: Je n'ai pas pris le temps en considération, car le besoin est de supprimer des fichiers plus anciens qu'une certaine date, en prenant des heures / minutes aurait supprimé des fichiers d'un jour qui était destiné à être conservé.

LIMITATION

époque prend pour acquis votre format de date courte est AAAA-MM-JJ. Il doit être adapté pour d'autres paramètres ou une évaluation d'exécution (lisez sShortTime, configuration liée à l'utilisateur, configurez l'ordre des champs approprié dans un filtre et utilisez le filtre pour extraire les données correctes de l'argument).

Ai-je mentionné que je déteste l'auto-formateur de cet éditeur? il supprime les lignes vides et le copier-coller est un enfer.

J'espère que ça aide.


21
2017-08-24 14:55



forfiles /p "v:" /s /m *.* /d -3 /c "cmd /c del @path"

Tu devrais faire /d -3 (3 jours plus tôt) Cela fonctionne bien pour moi. Donc, tous les lots compliqués pourraient être dans la poubelle. Aussi forfiles Ne prenez pas en charge les chemins UNC, établissez une connexion réseau avec un lecteur spécifique.


17
2018-06-08 07:46



Jetez un oeil à mon répondre à un question similaire:

REM del_old.bat
REM usage: del_old MM-DD-YYY
for /f "tokens=*" %%a IN ('xcopy *.* /d:%1 /L /I null') do if exist %%~nxa echo %%~nxa >> FILES_TO_KEEP.TXT
for /f "tokens=*" %%a IN ('xcopy *.* /L /I /EXCLUDE:FILES_TO_KEEP.TXT null') do if exist "%%~nxa" del "%%~nxa"

Cela supprime les fichiers antérieurs à une date donnée. Je suis sûr qu'il peut être modifié pour revenir sept jours après la date actuelle.

mettre à jour: Je remarque que HerbCSO a amélioré le script ci-dessus. Je recommande d'utiliser sa version au lieu.


16
2017-08-24 15:11



Ma commande est

forfiles -p "d:\logs" -s -m*.log -d-15 -c"cmd /c del @PATH\@FILE" 

@PATH - est juste le chemin dans mon cas, donc je devais utiliser @PATH\@FILE

aussi forfiles /? ne travaille pas pour moi aussi, mais forfiles (sans "?") a bien fonctionné.

Et la seule question que j'ai: comment ajouter un masque multiple (par exemple ".log |.bak ")?

Tout cela concernant forfiles.exe que je téléchargé ici (sur Win XP)

Mais si vous utilisez le serveur Windows forfiles.exe devrait déjà être là et il est différent de la version ftp. C'est pourquoi je devrais modifier la commande.

Pour Windows Server 2003, j'utilise cette commande:

forfiles -p "d:\Backup" -s -m *.log -d -15 -c "cmd /c del @PATH"

11
2017-12-14 06:46



Pour Windows Server 2008 R2:

forfiles /P c:\sql_backups\ /S /M *.sql /D -90 /C "cmd /c del @PATH"

Cela supprimera tout .sql fichiers plus anciens que 90 journées.


7
2018-04-27 22:41