2010-08-05 6 views
3

J'essaie de créer un script de traitement par lots qui supprimera tous les sous-répertoires de plus de 30 jours. Je suis vraiment novice en matière de script batch, j'espère juste que quelqu'un puisse m'aider.Supprimer les sous-répertoires de plus de 30 jours

J'ai été capable de trouver un script qui supprime tous les sous-répertoires dans l'emplacement spécifié. Est-ce que quelqu'un peut modifier ce script afin qu'il ne supprime que les répertoires âgés de 30 jours?

+0

Merci pour toutes vos réponses. L'application principale est écrite en Java mais il est surprenant que l'API Java File ne fournisse pas getCreateTime() only lastModified(). Je vais juste exécuter le code natif à partir de Java, analyser la sortie et supprimer les dossiers de Java. – Marquinio

+0

Jetez un oeil à ma réponse révisée alors ... –

Répondre

1

En supposant que vous êtes limité à des fichiers de traitement par lots ... check this - mais si vous pouvez utiliser VBScript, je pense que vous pouvez faire bit better.


Maintenant que vous avez clarifié votre vrai problème, s'il vous plaît comprendre que si vous vouliez utiliser System.exec() vous devrez composer avec beaucoup d'inconvénients.

Alternativement, si vous voulez vraiment utiliser JNDI (vous mentionner « natif », mais ne font pas clairement ce que vous voulez dire) peut-être ce sera utile: http://mindprod.com/products1.html#FILETIMES

+0

Oh merci beaucoup. Cela me fera gagner beaucoup de temps. – Marquinio

0

Cela ne va pas être un tweak simple. En l'état, il n'y a pas de moyen facile (que je connaisse) de faire l'opération date-diff dans l'interpréteur cmd.

D'abord, vous devrez analyser la date actuelle:

C:\>date /T 
Thu 08/05/2010 

Une fois que vous avez le jour, le mois, l'année, vous devez obtenir la date de chaque élément dans la liste des répertoires, que vous pouvez faire en supprimant le /b param dans la commande dir et en modifiant la ligne de jetons pour donner les jetons 1 et 4, c'est-à-dire tokens=1,4, puis en calculant vous-même les dates, ce qui sera pénible car vous devez gérer des mois différents, et décembre > Transitions de janvier (nouvelles années), etc., et vous êtes presque certain de vous tromper.

Ajoutez également le paramètre /ad pour obtenir uniquement les répertoires.

Je vous recommande d'utiliser PowerShell ou une autre technologie de script qui vous donne les outils dont vous avez besoin pour manipuler les dates.

6

Je pense que forfiles va le faire ...

forfiles -D 30 itérera tous les fichiers Dernière modification il y a plus de 30 jours

Donc, quelque chose comme ...

FORFILES /S /D -30 /C "cmd /c IF @isdir == TRUE rd @path" 

Doit (non testé) supprimer récursivement tous les dossiers de plus de 30 jours :)

Btw - Découvrez http://ss64.com/nt/ pour plus de qualité de ligne de commande

1

Avez-vous une PowerShell sur votre système?

dir | ? { $_.LastWriteTime -lt [DateTime]::Now.AddDays(-30) } | % { rm $_.FullName }

0

Je sais que ce sujet est un plus; Cependant, je cherchais récemment à le faire et j'ai pu construire en fonction de ce que Matt Roberts a suggéré. J'ai utilisé la syntaxe forfiles suivante:

FORFILES /P \path\to\dir /S /C "cmd /c IF @isdir == TRUE rmdir /S @path /Q" -D -30 

Vous devrez remplacer \path\to\dir par le chemin (y compris la lettre de lecteur) dans le répertoire (/ P) que vous voulez exécuter sur. Cela va ensuite récursivement (/S) rechercher dans le répertoire et exécuter (/C) rmdir (encore récursivement). Sans /Q, il vous est demandé si vous souhaitez supprimer chaque répertoire/fichier, donc si vous prévoyez de l'exécuter silencieusement dans un script, vous devrez l'avoir. Vous pouvez modifier le nombre de jours (-D) en remplaçant -30 par autre chose. J'ai ensuite utilisé le planificateur de tâches pour l'automatiser une fois par semaine (fonctionnement confirmé). Pour vous assurer que cela fonctionne, définissez la tâche avec «Exécuter avec les privilèges les plus élevés».

Remarque: Cette configuration supprimera irrévocablement les fichiers. Ils n'apparaîtront pas dans votre corbeille. Donc, une fois qu'ils sont partis, ils sont partis (sauf si vous avez des sauvegardes).

Questions connexes