2009-07-27 6 views
1

J'essaie d'écrire un petit script batch qui va supprimer les fichiers anciens fichiers d'un répertoire. Le premier paramètre est le répertoire du script à examiner, et le second est le nombre de fichiers à conserver.Batch Scripting, Pour l'utilisation des résultats d'un répertoire

rem @ECHO OFF 

rem %1 is the path in which to look for the files 
rem %2 is the number of recent files to preserve 

if [%1] EQU [] (
    echo ERROR: Missing Required Paramater directory path. 
    goto :eof 
) 

if [%2] EQU [] (
    echo ERROR: Missing Required Paramater, number of files to preserve 
    goto :eof 
) 

if %2 LSS 0 (
    echo ERROR: Number of files to preserve provided was negative 
    goto :eof 
) 

set FolderPath=%1 
set SafeNumber=%2 

cd %FolderPath% 

for /f %%f in ('dir /O-D /A-D /B') do call :delete %%f 
goto :eof 

:delete 
if %SafeNumber% LEQ 0 (
    del %1 
) else (
    set /a SafeNumber-=1 
) 
goto :eof 

:eof 

Essentiellement ce que j'ai ici est un répertoire qui affiche une liste de noms commandés du plus récent au plus ancien. En fonction de ce SafeNumber, il sautera les premiers fichiers, puis procédera à la suppression une fois SafeNumber < = 0.

Le problème que j'ai en ce moment, est si le nom de fichier est "Test File.txt" (comme contient un espace. "Test" est passé dans la suppression en tant que% 1, plutôt que "Test File.txt".

Répondre

2

Avez-vous essayé de placer des guillemets autour du nom de fichier dans votre entrée ou dans votre script? Je veux dire autour du% f ou du% 1, pour le script

+0

Changé la déclaration pour être: pour/F "delims =" %% f dans ('dir/OD/AD/B % FolderPath% ') faire appel: supprimer "%% f" et maintenant la suppression obtient le nom de fichier complet. Citations aidé un groupe, n'a pas pensé à cela merci. –

0

Pour gérer les espaces dans les noms de fichiers, etc. Vous voudrez citer pour les noms de fichiers et les chemins "% 1" etc .... Peut-être que c'est votre seul problème.

0

Vous allez devoir utiliser la commande find avec -newer puis -exec rm. Par exemple, pour supprimer tous les fichiers plus récents que fichier.txt faire:

find . -type f -newer file.txt -exec rm {} \; 
+1

Il pose une question sur les fichiers batch DOS/Win, pas un shell Unix! –

+0

Essayez cygwin – ennuikiller

+0

La commande unix find a été portée sur Windows. pour ce qui précède, il sera -> trouver c: \ path -type f -newer fichier.txt -delete – ghostdog74

0

Il y a longtemps, je l'ai écrit un prog Java simple qui est censé être lancé à partir de la console, à savoir à partir d'un fichier batch. Le prog supprime les anciens fichiers d'un répertoire spécifié. Jetez un coup d'oeil sur here, je ne me souviens pas exactement comment cela fonctionne, mais je suggère de l'utiliser d'abord sur un dossier de test. Il est censé être utilisé pour Windows, au moins là c'est où je l'ai utilisé.

je maintenant passé à un Mac, où j'utilise le script Automator suivant, je lance à chaque démarrage pour faire ce travail:

find /Users/<yourUser>/Downloads/* -type f -mtime +90 -exec mv -f {} /Users/<yourUser>/.Trash \; 
0

Changez votre boucle, et en finir avec votre fonction de suppression.

for /f "skip=%safenum%" %%f in ('dir /o-d /a-d /b') do (del %%f) 

J'ai un amour malsain pour les boucles ...

Questions connexes