Je cherche un moyen de supprimer tous les fichiers de plus de 7 jours dans un fichier batch. J'ai cherché sur le Web et j'ai 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 faites dans BASH en seulement quelques lignes de code. Il semble que quelque chose d'au moins à distance pourrait être fait pour les fichiers batch dans Windows. Je recherche une solution qui fonctionne dans une invite de commande Windows standard, sans aucun utilitaire supplémentaire. Veuillez pas non plus PowerShell ou Cygwin.
Réponses:
Prendre plaisir:
Voir la
forfiles
documentation pour plus de détails.Pour plus d'informations, reportez-vous à un index AZ de la ligne de commande Windows XP .
Si vous ne l'avez pas
forfiles
installé sur votre ordinateur, copiez-le depuis n'importe quel Windows Server 2003 vers votre ordinateur Windows XP à l'adresse%WinDir%\system32\
. Cela est possible car l'EXE est entièrement compatible entre Windows Server 2003 et Windows XP.Les versions ultérieures de Windows et Windows Server l'ont installé par défaut.
Pour Windows 7 et plus récent (y compris Windows 10):
La syntaxe a un peu changé. Par conséquent, la commande mise à jour est:
la source
Exécutez les commandes suivantes :
Déplacez tous les fichiers (en utilisant / mov, qui déplace les fichiers puis les supprime par opposition à / move qui déplace des arborescences entières qui sont ensuite supprimées) via robocopy vers un autre emplacement, puis exécutez une commande de suppression sur ce chemin et vous êtes tous bien.
De plus, si vous avez un répertoire contenant beaucoup de données, vous pouvez utiliser le
/mir
commutateurla source
rd /s /q c:\destination
place de ladel
commande ou utiliserais même une autrerobocopy /mir c:\emptydir c:\destination
course pour vider le répertoire si vous vous attendez à des problèmes avec les noms de fichiers.forfiles
partir de la réponse acceptée, ne le fera pas.C:\test
plus de 7 jours. Pour supprimer les fichiers, changez leecho
endel
:forfiles /p "C:\test" /m "*.*" /c "cmd /c echo @file" /D -7
Ok s'ennuyait un peu et a trouvé cela, qui contient ma version du remplacement de l'époque Linux d'un pauvre limité pour un usage quotidien (pas de rétention de temps):
7daysclean.cmd
USAGE
set /a strip=day*7
: Modifiez 7 pour le nombre de jours à conserver.set dSource=C:\temp
: Il s'agit du répertoire de départ pour rechercher les fichiers.REMARQUES
Il s'agit d'un code non destructif, il affichera ce qui se serait passé.
Changement :
à quelque chose comme:
donc les fichiers sont supprimés
Février : codé en dur à 28 jours. Les années bissextiles sont vraiment un enfer à ajouter. si quelqu'un a une idée qui n'ajouterait pas 10 lignes de code, allez-y et postez-le donc je l'ajoute à mon code.
époque : je n'ai pas pris en compte le temps, car la nécessité est de supprimer des fichiers antérieurs à une certaine date, prendre des heures / minutes aurait supprimé des fichiers d'une journée qui devait être conservée.
LIMITATION
epoch tient pour acquis que votre format de date courte est AAAA-MM-JJ. Il faudrait l'adapter à d'autres paramètres ou à une évaluation au moment de l'exécution (lire sShortTime, configuration liée à l'utilisateur, configurer l'ordre des champs approprié dans un filtre et utiliser le filtre pour extraire les données correctes de l'argument).
Ai-je mentionné que je déteste le formatage automatique de cet éditeur? il supprime les lignes vides et le copier-coller est un enfer.
J'espère que ça aide.
la source
7daysclean.cmd
sonne comme un nom génial pour un groupe Synth-Punk.Vous devriez faire
/d -3
(3 jours plus tôt) Cela fonctionne très bien pour moi. Ainsi, tous les lots compliqués pourraient être dans la poubelle. Aussiforfiles
ne prennent pas en charge les chemins UNC, afin d' établir une connexion réseau à un lecteur spécifique.la source
*.*
? Le caractère générique*.*
ne correspond pas à tous les fichiers de Windows. Il ne fait correspondre les fichiers avec que.
dans leurs noms. L'OP n'a jamais dit quoi exiger.
dans le nom du fichier. Le paramètre approprié est/M *
, mais c'est de toute façon la valeur par défaut. Il n'y en a pas du tout besoin/M
.*.*
se comporte exactement comme*
sous Windows. En fait, je viens de l'essayer sur mon ordinateur et, en fait, j'aidir *.*
répertoriétest file
un fichier sans extension.*.*
n'est pas cohérent entre, disons,dir
et l'-m
option deforfiles
. Le-m *.*
masque ignorera en effet les noms de fichiers sans extension, comme je l'ai indiqué dans mon commentaire ci-dessus (essayez-le vous-même). La partie amusante ici est que la documentation MS indique explicitement que-m *.*
c'est la valeur par défaut. Cependant, si vous l'essayez dans la vraie vie, vous verrez que la valeur par défaut est en fait-m *
- tous les fichiers sont itérés.*.*
masque appliqué à tous les fichiers. Ma question rethorique sur "cette étrange habitude" était en effet inutile, car le traitement*.*
et*
comme équivalent est une convention Windows de longue date. Cependant, l'/m
option enforfiles
arrive à violer cette convention pour une raison quelconque.Jetez un œil à ma réponse à une question similaire :
Cela supprime les fichiers antérieurs à une date donnée. Je suis sûr qu'il peut être modifié pour revenir en arrière de sept jours à compter de la date actuelle.
mise à jour: je remarque que HerbCSO a amélioré le script ci-dessus. Je recommande plutôt d' utiliser sa version .
la source
Ma commande est
@PATH
- est juste un chemin dans mon cas, j'ai donc dû utiliser@PATH\@FILE
forfiles /?
ne fonctionne pas aussi pour moi aussi, maisforfiles
(sans "?") a bien fonctionné.Et la seule question que j'ai: comment ajouter plusieurs masques (par exemple " .log | .bak")?
Tout cela concernant forfiles.exe que j'ai téléchargé ici (sur win XP)
Mais si vous utilisez le serveur Windows, forfiles.exe devrait déjà être là et il diffère de la version ftp. C'est pourquoi je devrais modifier la commande.
Pour Windows Server 2003, j'utilise cette commande:
la source
Il y a très souvent des questions relatives à la date / heure relative à résoudre avec le fichier batch. Mais l'interpréteur de ligne de commande cmd.exe n'a aucune fonction pour les calculs de date / heure. De nombreuses bonnes solutions de travail utilisant des applications ou des scripts de console supplémentaires ont déjà été publiées ici, sur d'autres pages de Stack Overflow et sur d'autres sites Web.
Pour les opérations basées sur la date / l'heure, il est courant de convertir une chaîne de date / heure en secondes depuis un jour déterminé. Très courant est 1970-01-01 00:00:00 UTC. Mais tout jour ultérieur pourrait également être utilisé en fonction de la plage de dates requise pour prendre en charge une tâche spécifique.
Jay a publié 7daysclean.cmd contenant une solution rapide de "date en secondes" pour l'interpréteur de ligne de commande cmd.exe . Mais il ne prend pas en compte correctement les années bissextiles. JR a publié un module complémentaire pour prendre en compte le jour bissextile de l'année en cours, mais en ignorant les autres années bissextiles depuis l'année de base, c'est-à-dire depuis 1970.
J'utilise depuis 20 ans des tables statiques (tableaux) créées une fois avec une petite fonction C pour obtenir rapidement le nombre de jours y compris les jours intercalaires du 01/01/1970 dans les fonctions de conversion date / heure dans mes applications écrites en C / C ++.
Cette méthode de table très rapide peut également être utilisée dans le code batch à l'aide de la commande FOR . J'ai donc décidé de coder le sous-programme batch
GetSeconds
qui calcule le nombre de secondes depuis 1970-01-01 00:00:00 UTC pour une chaîne de date / heure passée à cette routine.Remarque: les secondes intercalaires ne sont pas prises en compte car les systèmes de fichiers Windows ne prennent pas non plus en charge les secondes intercalaires.
Tout d'abord, les tableaux:
Jours depuis 1970-01-01 00:00:00 UTC pour chaque année, y compris les jours bissextiles.
Le calcul des secondes pour les années 2039 à 2106 avec une époque commençant le 01/01/1970 n'est possible qu'en utilisant une variable 32 bits non signée, c'est-à-dire non signée longue (ou non signée int) en C / C ++.
Mais cmd.exe utilise pour les expressions mathématiques une variable 32 bits signée. Par conséquent, la valeur maximale est 2147483647 (0x7FFFFFFF) qui est 2038-01-19 03:14:07.
Information sur l'année bissextile (Non / Oui) pour les années 1970 à 2106.
Nombre de jours jusqu'au premier jour de chaque mois de l'année en cours.
La conversion d'une date en nombre de secondes depuis le 01/01/1970 est assez simple en utilisant ces tableaux.
Attention, s'il vous plaît!
Le format des chaînes de date et d'heure dépend des paramètres de région et de langue de Windows. Les délimiteurs et l'ordre des jetons affectés aux variables d'environnement
Day
,Month
etYear
dans la première boucle FOR deGetSeconds
doivent être adaptés au format date / heure local si nécessaire.Il est nécessaire d'adapter la chaîne de date de la variable d'environnement si le format de date dans la variable d'environnement DATE est différent du format de date utilisé par la commande FOR on
%%~tF
.Par exemple, quand se
%DATE%
développe enSun 02/08/2015
tandis que se%%~tF
développe en02/08/2015 07:38 PM
le code ci-dessous peut être utilisé avec la modification de la ligne 4 à:Cela se traduit par le passage au sous-programme uniquement
02/08/2015
- la chaîne de date sans les 3 lettres de l'abréviation du jour de la semaine et le caractère espace de séparation.Vous pouvez également utiliser ce qui suit pour passer la date actuelle au format correct:
Maintenant, les 10 derniers caractères de la chaîne de date sont passés à la fonction
GetSeconds
et, par conséquent, peu importe si la chaîne de date de la variable d'environnement DATE est avec ou sans jour de la semaine tant que le jour et le mois sont toujours avec 2 chiffres dans l'ordre attendu, c'est-à-dire au formatdd/mm/yyyy
oudd.mm.yyyy
.Voici le code batch avec des commentaires explicatifs qui sort juste quel fichier supprimer et quel fichier conserver dans l'
C:\Temp
arborescence des dossiers, voir le code de la première boucle FOR .Pour des performances optimales, il serait préférable de supprimer tous les commentaires, c'est-à-dire toutes les lignes commençant par rem après 0-4 espaces de tête.
Et les tableaux peuvent également être rendus plus petits, c'est-à-dire en diminuant la plage de temps de 1980-01-01 00:00:00 à 2038-01-19 03:14:07 comme actuellement pris en charge par le code de lot ci-dessus, par exemple jusqu'en 2015-01 -01 au 31/12/2019, comme le code ci-dessous l'utilise, ce qui supprime vraiment les fichiers de plus de 7 jours dans l'
C:\Temp
arborescence des dossiers.De plus, le code de lot ci-dessous est optimisé pour un format horaire de 24 heures.
Pour encore plus d'informations sur les formats de date et d'heure et les comparaisons d'heure de fichier sous Windows, consultez ma réponse sur savoir si le fichier a plus de 4 heures dans un fichier de commandes avec de nombreuses informations supplémentaires sur les temps de fichier.
la source
Copiez ce code et enregistrez-le sous
DelOldFiles.vbs
.UTILISATION EN CMD:
cscript //nologo DelOldFiles.vbs 15
15 signifie supprimer des fichiers antérieurs à 15 jours.
la source
Pour Windows Server 2008 R2:
Cela supprimera tous les fichiers .sql datant de plus de 90 jours.
la source
Utilisez des forfiles.
Il existe différentes versions. Les premiers utilisent des paramètres de style Unix.
Ma version (pour le serveur 2000 - notez pas d'espace après les commutateurs) -
Pour ajouter des forfiles à XP, obtenez l'exe à partir de ftp://ftp.microsoft.com/ResKit/y2kfix/x86/
et ajoutez-le à C: \ WINDOWS \ system32
la source
*.*
dansforfiles
ne correspond pas à tous les fichiers. Il ne correspond qu'aux fichiers avec.
dans leur nom (c'est-à-dire les fichiers avec des extensions). L'OP n'a jamais dit quoi exiger.
dans le nom du fichier. Le paramètre approprié est/M *
, mais c'est de toute façon la valeur par défaut. Il n'y en a pas du tout besoin/M
.Pour Windows 2012 R2, les éléments suivants fonctionneraient:
pour voir les fichiers qui seront supprimés, utilisez ce
la source
IMO, JavaScript devient progressivement un standard de script universel: il est probablement disponible dans plus de produits que tout autre langage de script (sous Windows, il est disponible à l'aide de l'hôte de script Windows). Je dois nettoyer les anciens fichiers dans de nombreux dossiers, voici donc une fonction JavaScript pour le faire:
Pour chaque dossier à effacer, ajoutez simplement un autre appel à la fonction clearFolder (). Ce code particulier préserve également les fichiers exe et dll et nettoie également les sous-dossiers.
la source
Que diriez-vous de cette modification sur 7daysclean.cmd pour prendre en compte une année bissextile?
Cela peut se faire en moins de 10 lignes de codage!
Édité par Mofi:
La condition mentionnée ci-dessus par JR est toujours fausse raison d'une syntaxe non valide.
Et
Month GEQ 2
c'est également faux parce que l'ajout de 86400 secondes pour un jour de plus doit être fait au cours d'une année bissextile uniquement pour les mois de mars à décembre, mais pas pour février.Un code de travail pour prendre en compte le jour bissextile - pour l'année en cours uniquement - dans le fichier de commandes 7daysclean.cmd publié par Jay serait:
la source
Puis-je ajouter une humble contribution à ce fil déjà précieux. Je trouve que d'autres solutions pourraient se débarrasser du texte d'erreur réel mais ignorent le% ERRORLEVEL% qui signale un échec dans mon application. ET je veux légitimement% ERRORLEVEL% aussi longtemps que ce n'est pas l'erreur "Aucun fichier trouvé".
Quelques exemples:
Débogage et élimination de l'erreur en particulier:
Utilisation d'un oneliner pour renvoyer le succès ou l'échec de ERRORLEVEL:
Utiliser un oneliner pour garder le ERRORLEVEL à zéro pour réussir dans le contexte d'un fichier batch au milieu d'un autre code (ver> nul réinitialise le ERRORLEVEL):
Pour une étape de travail CmdExec de l'Agent SQL Server, j'ai atterri sur ce qui suit. Je ne sais pas si c'est un bogue, mais le CmdExec de l'étape ne reconnaît que la première ligne de code:
la source
Mon Dieu, déjà beaucoup de réponses. Un itinéraire simple et pratique que j'ai trouvé consistait à exécuter ROBOCOPY.EXE deux fois dans un ordre séquentiel à partir d'une seule instruction de ligne de commande Windows à l'aide du paramètre & .
Dans cet exemple, cela fonctionne en sélectionnant tous les fichiers ( . ) Qui ont plus de 30 jours et en les déplaçant vers le dossier cible. La deuxième commande fait de même avec l'ajout de la commande PURGE, ce qui signifie supprimer les fichiers du dossier cible qui n'existent pas dans le dossier source. Donc, essentiellement, la première commande MOVES et le second DELETES car ils n'existent plus dans le dossier source lorsque la deuxième commande est invoquée.
Consultez la documentation de ROBOCOPY et utilisez le commutateur / L lors des tests.
la source
Si vous disposez du kit de ressources XP, vous pouvez utiliser robocopy pour déplacer tous les anciens répertoires dans un seul répertoire, puis utiliser rmdir pour supprimer uniquement celui-ci:
la source
Je pense que la réponse d'e.James est bonne car elle fonctionne avec des versions non modifiées de Windows dès Windows 2000 SP4 (et peut-être plus tôt), mais cela nécessitait d'écrire dans un fichier externe. Voici une version modifiée qui ne crée pas de fichier texte externe tout en conservant la compatibilité:
Pour être fidèle à la question d'origine, la voici dans un script qui fait TOUT le calcul pour vous si vous l'appelez avec le nombre de jours comme paramètre:
REMARQUE: Le code ci-dessus prend en compte les années bissextiles, ainsi que le nombre exact de jours dans chaque mois. Le seul maximum est le nombre total de jours écoulés depuis 0/0/0 (après quoi il renvoie des années négatives).
REMARQUE: les mathématiques ne vont que dans un sens; il ne peut pas obtenir correctement les dates futures d'une entrée négative (il essaiera, mais dépassera probablement le dernier jour du mois).
la source
Vous pourrez peut-être retirer cela. Vous pouvez jeter un oeil à cette question , pour un exemple plus simple. La complexité vient, lorsque vous commencez à comparer les dates. Il peut être facile de dire si la date est supérieure ou non, mais il existe de nombreuses situations à considérer si vous devez réellement obtenir la différence entre deux dates.
En d'autres termes - n'essayez pas d'inventer cela, sauf si vous ne pouvez vraiment pas utiliser les outils tiers.
la source
ce n'est rien d'étonnant, mais je devais faire quelque chose comme ça aujourd'hui et l'exécuter comme tâche planifiée, etc.
fichier de commandes, DelFilesOlderThanNDays.bat ci-dessous avec un exemple d'exécution avec des paramètres:
la source
S'étendant sur la réponse d'Aku, je vois beaucoup de gens poser des questions sur les chemins UNC. Le simple mappage du chemin unc vers une lettre de lecteur rendra les fichiers heureux. Le mappage et le démappage de lecteurs peuvent être effectués par programme dans un fichier de commandes, par exemple.
Cela supprimera tous les fichiers avec une extension .gz qui sont plus anciens que 7 jours. Si vous voulez vous assurer que Z: n'est mappé à rien d'autre avant de l'utiliser, vous pouvez faire quelque chose de simple comme
la source
La ROBOCOPIE fonctionne très bien pour moi. A l'origine suggéré mon Iman. Mais au lieu de déplacer les fichiers / dossiers vers un répertoire temporaire puis de supprimer le contenu du dossier temporaire, déplacez les fichiers dans la corbeille !!!
Voici quelques lignes de mon fichier batch de sauvegarde par exemple:
Il nettoie tout ce qui a plus de 15 jours de mon dossier «Temp» et 30 jours pour tout ce qui se trouve dans mon dossier de sauvegarde AutoCAD. J'utilise des variables car la ligne peut devenir assez longue et je peux les réutiliser pour d'autres emplacements. Il vous suffit de trouver le chemin d'accès à votre corbeille associé à votre connexion.
C'est sur un ordinateur de travail pour moi et ça marche. Je comprends que certains d'entre vous peuvent avoir des droits plus restrictifs, mais essayez quand même;) Recherchez des explications sur les paramètres ROBOCOPY sur Google.
À votre santé!
la source
Mon script pour supprimer des fichiers antérieurs à une année spécifique:
la source
Celui-ci l'a fait pour moi. Cela fonctionne avec une date et vous pouvez soustraire le montant souhaité en années pour remonter dans le temps:
le
/F
dans lecmd /c del @path /F
forces du fichier spécifique à supprimer dans certains cas , le fichier peut être en lecture seule.la
dateYear
est la variable d'année et vous pouvez changer le substract à vos propres besoinsla source