[Batch] Suppression de fichiers et repertoire vide

Suppression de fichiers et repertoire vide [Batch] - Shell/Batch - Programmation

Marsh Posté le 30-06-2005 à 11:04:01    

Bonjour,
 
Voici un script qui me permet de déplacer des fichiers dont la date de modifications est plus ancienne de 30 jours par rapport a la date d'excution du batch.
Par contre je ne n'ai pas trouver pour lui dire que s'il y a un repertoire vide, il doit le supprimer.
 
Voici l'arborescence que j'ai :
 
Dossier
  |
  |-Dossier1
  |    |
  |    |-Dossier11
  |    |   |
  |    |   |-Fichier111
  |    |   |-Fichiersxx
  |    |
  |    |-Dossier12
  |    |   |
  |    |   |-Fichier121
  |    |   |-Fichiersxx  |
  |    |
  |    |-Dossierxx
  |    |
  |    |-Fichierxx
  |
  |-Dossierxx
  |
  |-Fichiersxx
 
Donc tout plein de repertoires avec tout plein de fichiers partout.
Le script fouille tout sa et déplace que les fichiers ancien de plus de 30 jours.
 
Voici le script :
 
:: --------DELOLD.BAT----------
@echo off
rem SET OLDERTHAN=%1
SET OLDERTHAN=1
IF NOT DEFINED OLDERTHAN GOTO SYNTAX
for /f "tokens=1-4 delims=/ " %%i in ('date /t') do (set today=%%l%%j%%k)
for /f "tokens=2" %%i in ('date /t') do set thedate=%%i
 
set mm=%thedate:~0,2%
set dd=%thedate:~3,2%
set yyyy=%thedate:~6,4%
 
set /A dd=%dd% - %OLDERTHAN%
set /A mm=%mm% + 0
 
if /I %dd% GTR 0 goto DONE
set /A mm=%mm% - 1
if /I %mm% GTR 0 goto ADJUSTDAY
set /A mm=12
set /A yyyy=%yyyy% - 1
 
:ADJUSTDAY
if %mm%==1 goto SET31
if %mm%==2 goto LEAPCHK
if %mm%==3 goto SET31
if %mm%==4 goto SET30
if %mm%==5 goto SET31
if %mm%==6 goto SET30
if %mm%==7 goto SET31
if %mm%==8 goto SET31
if %mm%==9 goto SET30
if %mm%==10 goto SET31
if %mm%==11 goto SET30
if %mm%==12 goto SET31
 
goto ERROR
 
:SET31
set /A dd=31 + %dd%
goto DONE
 
:SET30
set /A dd=30 + %dd%
goto DONE
 
:LEAPCHK
set /A tt=%yyyy% %% 4
if not %tt%==0 goto SET28
set /A tt=%yyyy% %% 100
if not %tt%==0 goto SET29
set /A tt=%yyyy% %% 400
if %tt%==0 goto SET29
 
:SET28
set /A dd=28 + %dd%
goto DONE
 
:SET29
set /A dd=29 + %dd%
 
:DONE
if /i %dd% LSS 10 set dd=0%dd%
if /I %mm% LSS 10 set mm=0%mm%
rem for %%i in (*.*) do (
for /R D:\Data\Fpublic %%i in (*.*) do (
set FileName=%%i
call :PROCESSFILE %%~ti
)
 
set mm=
set yyyy=
set dd=
set thedate=
goto EXIT
 
:SYNTAX
ECHO.
ECHO USAGE:
ECHO DELOLD X
ECHO   Where X is the number of days previous to Today.
ECHO.
ECHO EX: "DELOLD 5" Deletes files older than 5 days.
GOTO EXIT
 
:PROCESSFILE
set temp=%1
set fyyyy=%temp:~6%
set fmm=%temp:~0,2%
set fdd=%temp:~3,2%
if /I %fyyyy% GTR 2069 set fyyyy=%temp:~6%
 
 
:: +*************************************+
:: | This is where the files are deleted |
:: | Change the ECHO command to DEL to   |
:: | delete. ECHO is used for test.      |
:: +*************************************+
if /I %fyyyy%/%fmm%/%fdd% LEQ %yyyy%/%mm%/%dd% (
Move "%FileName%" D:\Data\Fpublic\Archive\
Echo "%FileName%" a ete deplacer dans Archive >> D:\Data\Fpublic\%today%.log
)
 
set temp=
set fyyyy=
set fmm=
set fdd=
 
:EXIT
 
:: ----------END-DELOLD.BAT-------------
 
Merci d'avance de votre aide....
 
 :)

Reply

Marsh Posté le 30-06-2005 à 11:04:01   

Reply

Marsh Posté le 04-07-2005 à 11:23:27    

Un petit up,
 
Ceci est pour une utilisation profesionnel, et je bute réellement, donc si j'amais une ame charitable voulais bien ce pencher sur mon probléme, j'en serais enchanté.
 
Cordialement

Reply

Marsh Posté le 18-07-2005 à 12:30:27    

Bonjour,
désolé ce n'est pas pour vous aider mais plutot l'inverse. Je souhaite utiliser votre batch mais je n'arrive pas à le faire fonctionner, sans doute à cause des smilies dans le code. Pouvez-vous m'aider.
Merci

Reply

Marsh Posté le 18-07-2005 à 16:18:04    

En selectionnant le code et en le collant dans un notepad, cel a ne fonctionne pas?

Reply

Marsh Posté le 18-07-2005 à 17:22:44    

NON.
par exemple devant ONE il y a un smilies. Je pensais qu'il fallait mettre un D à la place pour avoir DONE. Idem pour ROCESSFILE avec :

Reply

Marsh Posté le 18-07-2005 à 21:28:27    

Clique sur le bouton Répondre, tu vas pouvoir copier.

Reply

Marsh Posté le 19-07-2005 à 10:36:01    

J'ai fais ce que ti m'as dit nglechau mais j'ai l'erreur suivante: "/07 était inattendu"
Je suis sous Win XP.

Reply

Marsh Posté le 19-07-2005 à 18:51:06    

C'est un feature du forum :lol:
 
Supprime tous les espaces à la fin des lignes et ça ira à mon avis.

Reply

Marsh Posté le 20-07-2005 à 14:08:24    

Merci nglechau le script s'execute bien! Par contre il déplace tous les fichiers meme ceux de moins de 30 jours. J'essai de jouer sur le paramètre OLDERTHAN mais j'y arrive pas.
Merci pour ton aide

Reply

Marsh Posté le 20-07-2005 à 21:03:04    

Juste avant la ligne
if /I %fyyyy%/%fmm%/%fdd% LEQ %yyyy%/%mm%/%dd% (
)
 
Si tu fais afficher des valeurs calculées, est-ce qu'elles sont correctes ?
echo %fyyyy%/%fmm%/%fdd%  
echo %yyyy%/%mm%/%dd%

Reply

Marsh Posté le 20-07-2005 à 21:03:04   

Reply

Marsh Posté le 21-07-2005 à 13:01:04    

ça affiche les lignes suivantes:
 
2005/07/21
-7/12/30
 
La première ligne c'est bon mais pas la deuxième. ça semble venir dès la recup de la date système mais je ne sais pas ce que font ces 2 lignes

Code :
  1. for /f "tokens=1-4 delims=/ " %%i in ('date /t') do (set today=%%l%%j%%k)
  2. for /f "tokens=2" %%i in ('date /t') do set thedate=%%i

 
 :lol:

Reply

Marsh Posté le 21-07-2005 à 21:51:35    

Tu tapes  
for /?
dans l'invite de commandes. Ca explique les /f, tokens, etc.
 
Quand tu fais :
date /t
ou
echo %DATE%
depuis l'invite, ça donne quoi ?

Reply

Marsh Posté le 22-07-2005 à 10:31:46    

Quand je tape:
date /t
ça donne:
22/07/2005
et une ligne vide à l'endroit où je tape cette phrase.
 
Merci pour ta patience :)

Reply

Marsh Posté le 22-07-2005 à 10:53:08    

Ah oki, tu n'as pas les mêmes options régionnales que l'auteur du topic (lui devait avoir Vendredi 22/07/2005).
 
Pour ne pas trop changer le code, remplace le bloc  
 

Code :
  1. for /f "tokens=2" %%i in ('date /t') do set thedate=%%i


par

Code :
  1. set thedate=%date%


Tu optimiseras après.

Reply

Marsh Posté le 22-07-2005 à 14:56:40    

OUI c'est ça !
Ca marche  :bounce:  
 
Merci bp nglechau
 
je ne sais pas ajouter RESOLU au sujet du message !? :whistle:

Reply

Marsh Posté le 22-07-2005 à 19:58:57    

Tu ne peux pas : seul l'auteur du topic le peut :)
 
Bonne continuation :hello:

Reply

Marsh Posté le 27-07-2005 à 10:53:49    

je ne vais pas mettre en résolu étant donné que mon probléme n'a pas été réglé, je suis toujours avec le même probléme, c'est à dire que je n'arrive pas àsupprimer les repertoire une foi vide.
Si quelqu'un a une idée.......

Reply

Marsh Posté le 27-07-2005 à 18:31:40    

Tu ajoutes une boucle de vérification à la fin après sauvegardé tous les anciens fichiers, non ? Sinon tu vérifies après le déplacement de chaque.

Reply

Marsh Posté le 08-08-2005 à 10:20:32    

C'est justement cette boucle que je n'arrive pas à faire, si tu as une soluce pour tester si un repertoire est vide, je suis preneur, car là actuellement je n'ai toujorus pas trouver de solution.

Reply

Marsh Posté le 08-08-2005 à 10:53:09    

Un dossier est vide si tu fais  
dir /a <dossier>
ça imprime 7 lignes non-vides ou si tu fais
dir /b /a <dossier>
ça ne donne rien.
 
Alors si tu initialises une variable avant de faire une boucle pour tester la sortie de la commande dir, et qu'à la sortie de la boucle (en ignorant x lignes selon le cas), elle ne change pas de valeur, alors le dossier est vide.
 
Il y a sûrement d'autres méthodes mais c'est ce que je vois vite fait.


Message édité par wackevat le 08-08-2005 à 10:53:33
Reply

Marsh Posté le 19-08-2005 à 18:03:29    

Bonjour,
 
Aie ! il y a beaucoup de lignes inutiles et quelques erreurs dans ton script ( et que deviennent les 8 et 9 avec le set /a ?) je ne parie pas sur le résultat.
 
j'ai essayé de le corriger, mais en fait je pense qu'il faudrait le réécrire complètement et récupérer en variable le nom des fichiers et les nom des répertoires. D'autre part, je ne pense pas qu'il soit possible de réaliser toutes ces opérations dans un seul fichier.
 
je vais essayer de le réécrire, mais en attendant, pour info :
 
dir /s /b "nom du répertoire racine" >%temp%\liste_fichiers.txt  
permet de lister chemin compris dans le tmp de l'utilisateur tous les fichiers de tous les répertoires.
 
dir /a: D /s /b "nom du répertoire racine" >%temp%\liste_rep.txt
attention : j'ai volontairement mis un espace inutile entre le : et le D pour éviter la génération d'un Smilie indésirable...
cette commande permet de lister (chemin compris) dans le temp de l'utilisateur tous les répertoires, toutefois la plus grosse difficulté est d'arriver à inverser cette liste pour la rendre utile...
 
QUANT À LA QUESTION POSÉE : pour effacer un répertoire il suffit de taper  
RD "nom du répertoire"  
et celui-ci sera effacé s'il est vide, sinon il ne se passera rien.
 
l'idée serait avec un premier processus de lister tous les fichiers et en fonction de leurs noms vérifier leurs dates et les déplacer si nécessaire ensuite réaliser un second processus qui efface tous les répertoires également listés en laissant la commande RD se charger de vérifier s'il est véritablement vide.
 
Pas si facile à écrire à cause du grand nombre de variables à générer.

Reply

Marsh Posté le 19-08-2005 à 21:09:29    

Merci Pascal pour les infos, mais je ne voit pas les lignes inutil, et encore moins le problémes lié au 8 et 9 ??
Ne seraiut il pas plus judicieux (je ne sais si cela est posible) de générer avec la commande dir, un fichier ne contenant que la liste des repertoire (sans le chemin complet) et les fichiers, aprés il devrait être possible de sépararer repertoire et fichiers en se servant come référence du séparateur "\" ?
 
Merci encore une fois de l'aide et du travail que tu fournit.
 
NIbeck

Reply

Marsh Posté le 20-08-2005 à 10:21:20    

pour compléter ma réponse :
les lignes que tu peux supprimer sans regrets car elles sont sans objet dans ton cas sont les suivantes :  
rem SET OLDERTHAN=%1
SET OLDERTHAN=1
IF NOT DEFINED OLDERTHAN GOTO SYNTAX  
 
et si tu supprimes la variable, il faut bien entendu la remplacer par sa valeur définie
set /A dd=%dd% - 30
'je n'ai pas compris pourquoi tu mets 1 étant donné que c'est 30 que tu veux (peut-être pour tester mais pour cela il y a une meilleure solution : voir + bas)
 
ce que tu peux enlever aussi c'est :
:SYNTAX
ECHO.
ECHO USAGE:
ECHO DELOLD X
ECHO   Where X is the number of days previous to Today.
ECHO.
ECHO EX: "DELOLD 5" Deletes files older than 5 days.
GOTO EXIT  
 
des erreurs de syntax de la variable OLDERTHAN tu ne risques pas grand chose si tu la fixes.
 
et dernier paragraphe sans objet :
:: +*************************************+
:: | This is where the files are deleted |
:: | Change the ECHO command to DEL to   |
:: | delete. ECHO is used for test.      |
:: +*************************************+  
 
ou au moins rectifie le par du texte français qui esplique ton opéparion de déplacement de fichier
 
je ne comprends pas non plus l'utilité de la première ligne étant donné que tu utilise la seconde uniquement dans :
for /f "tokens=1-4 delims=/ " %%i in ('date /t') do (set today=%%l%%j%%k)
for /f "tokens=2" %%i in ('date /t') do set thedate=%%i  
 
 
il existe une autre méthode qui te permet de tester ton script dans tous les sens sans changer la date système de ton ordi ou attendre 1 jour !  c'est celle que j'emploie  
 
(rem) date /t >%temp%\date.txt
for /f "tokens=1-3 delims=/ " %%i in ('type %temp%\date.txt') do (
set jour=%%i
set mois=%%j
set an=%%h
)
le (rem) permet d'aller bidouiller la date et tester l'opération.
attention toutefois à bien adapter la longueur des champs  
echo %jour%/%mois%/%an%/
me permet de rectifier le tir avec
set an=%an:~0,4%
set mois=%mois:~0,2%
set jour =%jour:~0,2%
 
et bien entendu quand tu "recalcules" ta date, c'est aussi très pratique de l'écrire dans un txt, je te le conseille.
 
maintenant le problème du 08 et du 09, écris le programme suivant :
 
date /t >%temp%\date.txt
for /f "tokens=1-3 delims=/ " %%a in ('type %temp%\date.txt') do (
set jour=%%a
set mois=%%b
set an=%%c
)
set an=%an:~0,4%
set mois=%mois:~0,2%
set jour =%jour:~0,2%
 
set /a mois= %mois% + 1
set /a jour= %jour% + 1  
echo %jour%
echo %mois%
pause
 
puis mets un rem devant : date /t >%temp%\date.txt
et modifie la date dans date.txt qui se trouve dans le répertoire temporaire de l'utilisateur en cours et mets 08 et 09  soit pour le jour, soit pour le mois et constates le résultat. toutes les autres dates fonctionnent même le 18, 19 et 28, 29 mais pas ces deux là.
il faut donc rajouter une commande du type  
if %mois%==08 set /a mois=0010
if %jour%==09 set /a jour=0011
 
dernier point : la commande  
dir /a: D /s /b "nom du répertoire racine" >%temp%\liste_rep.txt
suivie de  
more /e +n %temp%\lste_rep.txt  
devrait permettre de réordonner les répertoires après avoir compté les lignes...
 
 
 
 
 
 
 
 
 
 
 
 

Reply

Marsh Posté le 21-08-2005 à 08:12:14    

apres quelques heures de réflexion, la solution était finalement assez simple, si tu veux balayer une arborescence et effacer les répertoires vides :
---------
@echo off
@title Effacement de dossiers vides
@dir /a: d /s /b "c:\dossier"|sort /r >%temp%\list-tri.txt
@rem liste et trie tous les dossiers (avec leurs chemins) ordre alpha envers
@rem boucle qui va examinier chaque ligne à partir du début
@for /f "delims=" %%a in ('type %temp%\list-tri.txt') do call :commande "%%a"
@rem les "" de %%a sont utiles si le nom des dossiers ont des espaces
@echo fin de la liste : AU REVOIR !
@del "%temp%\list-tri.txt"
@pause
 
 
:commande
@set variable=%~1
@rem commande pas très utile variable sans "" on peut s'en passer
@echo %variable%
@rem idem remarque ci-dessus permet de visualiser les dossiers utile uniquement en test
@rd "%variable%"
 
 
@set variable=
---------
Ca marche pour moi.
J'espère que ça répond à ta question.  

Reply

Marsh Posté le 02-10-2015 à 10:39:42    

Pour supprimer un dossier vide dans toutes les arborescences existante à partir d'un dossier:
 
La commande:
For /R ''C:\Chemin\Absolue'' /D %x in (''*'') do (rd ''%x'')
 
 
/!\ Lors du copier/coller, effacer et rééditer les Guillemets ! /!\
Et Lors de l'utilisation de cette commande via un fichier .bat,
la variable %x devient %%x
 
 
 
 
La commande signifie :
 
Je cherche la variable (correspondante à des noms de dossiers) dans toutes les arborescences existantes à partir de C:\Chemin\Absolue. (La variable étant : TOUT)
Nous allons donc effectuer la commande « Supprimer un répertoire vide » sur tous les dossiers de chaque arborescences en partant de C:\Chemin\Absolue.
 
Ce qui oblige à exécuter la commande plusieurs fois... Car, un dossier contenant un dossier vide est plein (logique), mais une fois le dossier vide supprimer, ce dossier anciennement plein devient vide...
 
du coup, dans ton fichier .bat, tu fais tout simplement:
 
For /R ''C:\Chemin\absoludossier'' /D %%x in (''*'') do (rd ''%%x'')
For /R ''C:\Chemin\absoludossier'' /D %%x in (''*'') do (rd ''%%x'')
For /R ''C:\Chemin\absoludossier'' /D %%x in (''*'') do (rd ''%%x'')
For /R ''C:\Chemin\absoludossier'' /D %%x in (''*'') do (rd ''%%x'')
For /R ''C:\Chemin\absoludossier'' /D %%x in (''*'') do (rd ''%%x'')
For /R ''C:\Chemin\absoludossier'' /D %%x in (''*'') do (rd ''%%x'')
For /R ''C:\Chemin\absoludossier'' /D %%x in (''*'') do (rd ''%%x'')
 
....le nombre de fois que nécessaire !
 
N'oublie pas de rééditer les Guillemets !!!!

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed