2009-11-18 5 views
1

pour la suppression de fichiers, je vais utiliser le code ci-dessous pour supprimer le fichier le plus ancien dans le répertoire et exécutez-le tous les jours. Il vient du question du mien.Batch Script numéro

Application au script batch d'origine:

SET BACKUPDIR=C:\PATH\TO\BACKUPS 
FOR /F %%i IN ('DIR /B /O-D %BACKUPDIR%') DO SET OLDEST=%%i 
DEL %BACKUPDIR%\%OLDEST% 

Quelque chose telle que vérifie si le montant de fichier est 21, le cas échéant supprimer le dernier:

SET BACKUPDIR=C:\test 
SET countfiles = dir BACKUPDIR /b | find /v /c "::" 

if countfiles > 21 
FOR /F %%i IN ('DIR /B /O-D %BACKUPDIR%') DO SET OLDEST=%%i 
DEL %BACKUPDIR%\%OLDEST% 

EDIT: Désolé pour oublier le question, ma tentative échouait, je serais reconnaissant de toute façon de diriger comment le faire fonctionner.

+0

Quelle est votre question? –

+0

Je ne sais pas quelle est votre question –

+0

désolé, s'il vous plaît vérifier l'édition :) – Hellnar

Répondre

1

Tout d'abord, il semble set ne le fait pas comme des espaces entre la variable et le signe =: si vous placez un espace, le nom de la variable inclura un espace. Vous devez donc supprimer l'espace pour définir correctement le nom de la variable. En outre, votre syntaxe pour capturer la sortie de la commande dans une variable est incorrecte. La seule façon dont je suis conscient (après avoir désespérément cherché stackoverflow pour la réponse) est d'utiliser une astuce de boucle pour utiliser une variable temporaire (voir this question pour plus de détails). En fait, vous devez également échapper le tuyau pour que la commande soit correctement analysée.

Ensuite, lorsque la variable testée dans l'expression if n'existe pas, les résultats sont toujours vrais, donc assurez-vous que la variable existe. En supprimant l'espace comme indiqué ci-dessus, le nom de l'expression if correspondra à votre nom de variable, et le test s'exécutera correctement.

alors vous avez oublié de faire un bloc autour des 2 dernières commandes. en fait, vous testez si vous avez plus de 21 fichiers et calculez le plus ancien si c'est vrai, alors vous devez TOUJOURS supprimer le plus ancien.

également, l'opérateur supérieur à > peut être compris comme une redirection. vous devrez peut-être utiliser l'opérateur GTR.

SET BACKUPDIR=C:\test 
FOR /F %%i in ('dir BACKUPDIR /b ^| find /v /c "::"') DO SET countfiles=%%i 

if countfiles GTR 21 (
FOR /F %%i IN ('DIR /B /O-D %BACKUPDIR%') DO SET OLDEST=%%i 
DEL %BACKUPDIR%\%OLDEST% 
) 
+0

merci beaucoup pour la suggestion mais son abit bizarre que maintenant il ne se soucie pas si countfiles est supérieur ou inférieur à 21, en tout cas supprime un fichier: S – Hellnar

+0

j'ai ajouté quelques informations sur les espaces dans la commande 'set' ce qui peut aider à résoudre le problème. –

+0

maintenant j'ai corrigé la façon dont votre variable est définie ... –

0

Cela ne fonctionne pas ... vous ne pouvez pas définir des variables 'normales' dans une boucle forcée. J'ai eu le même problème il y a quelques jours et l'ai résolu avec this blog entry.

Fondamentalement, vous devez définir SETLOCAL ENABLEDELAYEDEXPANSION puis utilisez ! au lieu de % ...

set FILES= 
for /f %%a IN (‘dir /b *.txt’) do set FILES=!FILES! %%a 
echo %FILES% 

Donc, cela devrait fonctionner pour vous:

SETLOCAL ENABLEDELAYEDEXPANSION 
SET OLDEST= 
FOR /F %%i IN ('DIR /B /O-D %BACKUPDIR%') DO SET OLDEST=%%i 
DEL %BACKUPDIR%\%OLDEST% 
+0

effectivement le premier script que je me réfère fonctionne bien pour moi. Bravo – Hellnar

+0

@Hellnar, oh désolé ... semble que je vous ai totalement mal compris. * embarrassant * – Bobby

Questions connexes