Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
971 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [Batch] Suppression de fichiers et repertoire vide

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Batch] Suppression de fichiers et repertoire vide

n°1135559
NIbeck
Posté le 30-06-2005 à 11:04:01  profilanswer
 

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....
 
 :)

mood
Publicité
Posté le 30-06-2005 à 11:04:01  profilanswer
 

n°1139149
NIbeck
Posté le 04-07-2005 à 11:23:27  profilanswer
 

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

n°1152436
alabastro
Posté le 18-07-2005 à 12:30:27  profilanswer
 

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

n°1152696
NIbeck
Posté le 18-07-2005 à 16:18:04  profilanswer
 

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

n°1152773
alabastro
Posté le 18-07-2005 à 17:22:44  profilanswer
 

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 :

n°1153037
wackevat
Posté le 18-07-2005 à 21:28:27  profilanswer
 

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

n°1153392
alabastro
Posté le 19-07-2005 à 10:36:01  profilanswer
 

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

n°1154035
wackevat
Posté le 19-07-2005 à 18:51:06  profilanswer
 

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

n°1154715
alabastro
Posté le 20-07-2005 à 14:08:24  profilanswer
 

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

n°1155317
wackevat
Posté le 20-07-2005 à 21:03:04  profilanswer
 

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%

mood
Publicité
Posté le 20-07-2005 à 21:03:04  profilanswer
 

n°1155938
alabastro
Posté le 21-07-2005 à 13:01:04  profilanswer
 

ç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:

n°1156570
wackevat
Posté le 21-07-2005 à 21:51:35  profilanswer
 

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 ?

n°1156877
alabastro
Posté le 22-07-2005 à 10:31:46  profilanswer
 

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 :)

n°1156906
wackevat
Posté le 22-07-2005 à 10:53:08  profilanswer
 

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.

n°1157272
alabastro
Posté le 22-07-2005 à 14:56:40  profilanswer
 

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

n°1157601
wackevat
Posté le 22-07-2005 à 19:58:57  profilanswer
 

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

n°1161213
NIbeck
Posté le 27-07-2005 à 10:53:49  profilanswer
 

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.......

n°1162063
wackevat
Posté le 27-07-2005 à 18:31:40  profilanswer
 

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.

n°1172153
NIbeck
Posté le 08-08-2005 à 10:20:32  profilanswer
 

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.

n°1172204
wackevat
Posté le 08-08-2005 à 10:53:09  profilanswer
 

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
n°1179827
pascale73
Posté le 19-08-2005 à 18:03:29  profilanswer
 

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.

n°1179951
NIbeck
Posté le 19-08-2005 à 21:09:29  profilanswer
 

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

n°1180088
pascale73
Posté le 20-08-2005 à 10:21:20  profilanswer
 

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...
 
 
 
 
 
 
 
 
 
 
 
 

n°1180491
pascale73
Posté le 21-08-2005 à 08:12:14  profilanswer
 

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.  

n°2266937
_maniak_
Maniak, à votre service
Posté le 02-10-2015 à 10:39:42  profilanswer
 

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 !!!!

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [Batch] Suppression de fichiers et repertoire vide

 

Sujets relatifs
vba ouverture des fichiers un à un d'un dossier sélectionnéscript batch comment parser une variable
[MySQL] Reconstruire une base de données sans les fichiers .myisuppression des fichiers temporaires sous IE
[vba] Fonction Nom de FichiersRecherche multi-fichiers
commande BatchBatch mailto webmail
problème chmod / lecture de fichiers sur un serveur 
Plus de sujets relatifs à : [Batch] Suppression de fichiers et repertoire vide


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR