J'écris un simple script de sauvegarde .bat, et je veux que je souhaite que la plus ancienne sauvegarde (dossier) soit supprimée lors de l'atteinte d'une limite maximale maximale de sauvegardes.
En ce moment, j'ai ceci: p>
% compteur% code> est basé sur le nombre de dossiers de sauvegarde actuellement dans le répertoire où les sauvegardes sont stockées et est calculée précédemment dans le script. P>
% Maxbackups% code> est juste un numéro spécifié par l'utilisateur comme "10" pour affirmer que vous voulez seulement contenir jusqu'à 10 versions des sauvegardes. P>
:: Delete the oldest backup, but only if we've exceeded the desired number of backups.
IF %COUNTER% gtr %MAXBACKUPS% (
ECHO More than %MAXBACKUPS% backups exist. Deleting oldest...
FOR /f "delims=" %%a in ('dir "..\Backup\*" /t:c /a:d /o:-d /b') do rd /s /q "..\Backup\%%a"
::Increment the counter down since we've just removed a backup folder.
SET /a COUNTER=%COUNTER%-1
)
4 Réponses :
FOR /f "delims=" %%a in ('dir "..\Backup\*" /t:c /a:d /o:d /b') do ( rd /s /q "..\Backup\%%a" goto :break ) :break you can break the for loop with goto
Un moyen simple de le faire en fonction de votre script:
FOR /f "delims=" %%a in ('dir "..\Backup\*" /t:c /a:d /o:-d /b') do set lastfolder=%%a rd /s /q "..\Backup\%lastfolder%"
J'ai placé echo%% code> après la ligne de la ligne que vous avez suggérée, mais cela rapporte
echo est éteint. Code> comme s'il n'y a rien de stocké dans cette variable à la fin de la boucle . Pouvez-vous peut-être pas accéder aux variables définies à l'intérieur des boucles? Si vous le pouvez, il y a un autre problème en jeu.
Cela fonctionne sur mon système. En cas de doute, placez echo code> après le
do code> (ou simplement supprimer tout
echo off code> au début du script), de cette façon que vous pouvez voir quel
définir code> est le dernier à exécuter. Le lot n'a pas de scopes locaux pour les variables, toutes les variables à l'intérieur de la boucle sont accessibles depuis n'importe où.
Vous étiez si proche! : -)
Tout ce que vous avez à faire est de sauter le premier % maxbackups% code> entrées lors de leur tri par date décroissant. Vous n'avez même pas besoin de votre variable code> code>. P>
Je pense que c'est la meilleure façon de l'accomplir, d'autant plus que cela ne nécessite pas de compteur et peut supprimer des sauvegardes supplémentaires si vous abaissez la limite de sauvegarde à une date ultérieure. J'ai fait une légère modification pour ma mise en œuvre que je vais montrer dans une réponse séparée pour les personnes intéressées.
Pouvez-vous expliquer le code un peu plus? J'essaie d'accomplir la même chose, mais je ne peux pas sembler aller au travail. Je sauvegarde une base de données SQL tous les soirs et je souhaite supprimer le 5ème fichier. Ma structure de dossiers est E: \ Backups \ nc \ tas de fichiers. Nc_1, nc_2 etc .. J'essaie de conserver les 4 derniers fichiers.
@Victor_TLEPSHEV - Cette réponse est conçue pour satisfaire l'exigence de l'OP de supprimer tous les notes les plus récents i> b>. Il ne devrait pas être difficile de modifier pour supprimer des fichiers à la place de modifier dir code> pour utiliser
/ a: -d code> et modifier
rd / s / q code> à
del code>. Publiez une nouvelle question si vous continuez à avoir des problèmes.
Voici le bloc final du code que j'ai fini par utiliser: Il simplifie le code de message de suppression un bit et fournit l'utilisateur final avec des informations sur le fichier supprimé de l'invite de commande. fenêtre. P> basé sur La réponse de Dbenham. p> p>
Eh bien, le script supprime chaque dossier car vous avez une boucle là-bas qui appelle
rd code> pour chaque dossier. C'est ce que la commande
pour code> fait. Pourquoi l'avez-vous écrit de cette façon?
Je pensais que j'avais besoin de trier correctement tous les dossiers par date, mais maintenant que j'y pense, ce n'est probablement pas le cas.
Comme il s'avère, c'est le cas, mais comme je l'ai fait à l'origine était un peu désactivé.