IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Purge de dossier


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 9
    Par défaut Purge de dossier
    Bonjour, je souhaite faire un script qui puisse purger des dossiers qui on un nom du type aaaa_mm_dd
    Je recupere donc la date du jour actuel j'y soustrais 7 jours et suite à cela je compare la date obtenu avec les nom de mes fichiers pour savior s'ils sont à supprimer ou non.

    Mon probleme: deja je ne suis pas un connaisseur du batch
    donc j'ai réaliser se script en ne sachant pas du tout s'il y avait des methodes plus simple pour faire ce que je recherche. J'ai aussi un gros probleme avec les boucles for.
    actuellement mon script recupère uniquement le dernier dossier de mon repertoire et ne traite que celui la.

    Accessoirement j'aimerais savoir s'il n'est pas possible d'améliorer se script, des choses inutiles à supprimer ou des manières plus subtiles de faire certaines choses, parce que j'avous que dans certain cas j'ai trouver des solutions mais que je trouve assez inconvenable (pour ne pas dire pourri ou horrible^^)

    Voici le code à l'état actuel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    @echo off
    set repTraitement=C:\Documents and Settings\Administrateur\My Documents\matthieu\script\rep_test
    
    rem set test dans l'invite de commande
    
    set jour=%Date:~0,2%
    set mois=%Date:~3,-5%
    set annee=%Date:~-4%
    set nbjour=7  
    set compteur=0
    set nbjfait=
    set jourcourant=%jour%
    echo.
    echo --------------------
    echo ****debut script****
    echo --------------------
    echo.
    rem for / "tokens=1,2,3 delims=_" %i in ('dir /b') do echo %i %j %k
    :traitement1 
    rem decrementation du nombre de jour verifier + verif si on a atteind le delai d'une semaine
    set /A jourcourant=%jourcourant%-1
    set /a nbjfait+=1
    rem echo nbjfait %nbjfait%
    set /A compteur+=1 
    rem echo compteur %compteur% 
    if %nbjfait% EQU %nbjour% GOTO DONE
    rem echo mois %mois%
    
    :traitement2
    rem si nombre de jour inferieur a 1 on change de mois et selon le cas d'annee
    if %jourcourant% LSS 1 GOTO jour
    if %nbjfait% NEQ %nbjour% GOTO traitement1
    
    :jour
    rem decrementation du nombre de jours dans le mois passage à 29,28,30 ou 31 
    set dizaine_mois=%mois:~0,1%
    set unite_mois=%mois:~1,1%
    rem echo dizaine %dizaine_mois%
    rem echo unite %unite_mois%
    if %dizaine_mois% EQU 1 set /A mois=%mois%-1
    if %dizaine_mois% EQU 0 set /A mois=%unite_mois%-1
    echo mois apres soustraction %mois%
    if %mois% EQU 0 set /A annee=%annee%-1
    rem echo annee apres soustraction %annee%
    if %mois% EQU 0 set /A mois=12
    if %mois%==1 goto SET31
    if %mois%==2 goto BIS
    if %mois%==3 goto SET31
    if %mois%==4 goto SET30
    if %mois%==5 goto SET31
    if %mois%==6 goto SET30
    if %mois%==7 goto SET31
    if %mois%==8 goto SET31
    if %mois%==9 goto SET30
    if %mois%==10 goto SET31
    if %mois%==11 goto SET30
    if %mois%==12 goto SET31
    
    
    
    :SET31
    rem nombre de jour a 31
    set /a jourcourant=31
    rem echo jour apres modif %jourcourant%
    goto traitement2
     
    :SET30
    rem nombre de jour a 30
    set /a jourcourant=30 
    rem echo jour apres modif %jourcourant%
    goto traitement2
    
    :BIS
    rem passage en anne bissextile
    set /A tt=%annee% %% 4
    if not %tt%==0 goto SET28
    set /A tt=%annee% %% 100
    if not %tt%==0 goto SET29
    set /A tt=%anne% %% 400
    if %tt%==0 goto SET29
     
    :SET28
    rem nombre de jour a 28
    set /A jourcourant=28
    rem echo jour apres modif %jourcourant%
    goto traitement2
     
    :SET29
    rem nombre de jour a 29
    set /A jourcourant=29
    rem echo jour apres modif %jourcourant%
    goto traitement2
    
    :DONE
    set cmp=0
    set cmp_sup=0
    echo Nous sommes le %jour%/%mois%/%annee% 
    echo La suppression prend en compte tout les dossiers anterieur au %jourcourant%/%mois%/%annee%
    echo.
    for /f "tokens=1,2,3 delims=_" %%i in ('dir /B "%repTraitement%" ' ) do set /a annee_rep=%%i & set /a cmp+=1 & echo cmp %cmp% & echo annee %%i & echo mois %%j & echo jour %%k & set /a mois_rep=%%j & set /a jour_rep=%%k
    rem suppression du caractere espace en fin de variable
    set jour_rep=%jour_rep:~0,2%
    set  mois_rep=%mois_rep:~0,2%
    set  annee_rep=%annee_rep:~0,4%
    rem test si annee est depasser ou non 
    if %annee_rep% LSS %annee%  rmdir /S /Q "%repTraitement%\%annee_rep%_%mois_rep%_%jour_rep%"& set /a cmp_sup+=1 & echo dossier %annee_rep%_%mois_rep%_%jour_rep% supprimer dans l'annee & GOTO fin
    if %mois_rep% LSS %mois% GOTO MOIS_INF
    if %jour_rep% LSS %jourcourant% GOTO JOUR_INF rem jour plsu petit ou plus gradn que le jour courant
    
    :MOIS_INF
    rem test si annee est depasser ou non 
    if %annee_rep% LEQ %annee% rmdir /S /Q "%repTraitement%\%annee_rep%_%mois_rep%_%jour_rep%" & set /a cmp_sup+=1 & echo dossier %annee_rep%_%mois_rep%_%jour_rep% supprimer dans mois_inf
    GOTO fin
    
    :JOUR_INF
    rem test si le mois du repertoire est anterieur au mois courant
    echo passage jour_inf
    if %mois_rep% LEQ %mois% GOTO MOIS_INF
    
    :fin
    echo.
    echo ------------------
    echo ****fin script****
    echo ------------------
    echo.
    echo ************************************************
    echo %cmp% dossier(s) on(t) ete traite(s), %cmp_sup% supprime(s)
    echo ************************************************
    echo.

    Merci d'avance pour votre aide

  2. #2
    Membre Expert

    Homme Profil pro
    Spécialiste progiciel
    Inscrit en
    Février 2010
    Messages
    1 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Spécialiste progiciel
    Secteur : Service public

    Informations forums :
    Inscription : Février 2010
    Messages : 1 747
    Par défaut
    Bonjour,

    Déjà pour parcourir toute une arborescence, tu peux utiliser l'option /R de for

    La solution me parait bonne mais simplement, pourquoi ton nom de fichier contient la date, c'est difficile de filtrer que la dessus. Perso, si c'est possible, j'aurais filtrer mes fichiers sur leur date de création (si c'est bien ce qui est écrit comme date dans le nom) et sur une chaine fixe + extension du nom.

    Je suppose que tes fichiers sont du genre :
    chfixe_date_increment.extension surement

    Si c'est bien le cas, c'est plus facile et moins lourd
    Les experts batch peuvent-ils le confirmer

    Cordialement,
    Christophe

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 9
    Par défaut
    Pour les dossiers malheureusement la date de création ne correspond pas forcément à la date contenu dans le nom du dossier et les dossiers son nommés de la façon suivante aaaa_mm_jj. Et étant donnée que ces dossier peuvent être créer 3 mois avant leur réel utilisation (voir 1 ans avant) je ne peux me fié qu'a la date contenu dans le nom de dossier.
    Enfaite il s'agit de dossier portant un nom qui correspond à la date de parution d'un journal, et je dois supprimer ces dossiers une semaine après la parution du journal.

    Mon probleme se situe plus au niveau du for enfaite, dans l'état actuellement je n'arrive pas à recuperer tous les champs de mon dir et le traitement que je fais ne s'applique qu'à la dernière ligne de mon résultat de mon dir /B

    Ce qu'il me faudrait c'est une premiere boucle qui permettrais de parcourrir tout les champs de mon dir, et une 2ème qui me permettrais de faire le traitement approprié (regarder la date du dossier et le supprimer si sa date est deja dépassé). Malheureusement après plusieurs tentative je n'y suis pas arrivé d'ou se topic^^

    Si cela pourrais vous aidez à m'aider^^, je peux mettre les différentes tentatives de boucle imbriqué que j'ai faites.

  4. #4
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    y'a des algos très perfectionnés sur le calcul des dates dans le forum, fait une recherche, ça te facilitera les choses.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 9
    Par défaut
    Enfaite j'ai deja tout se qu'il faut niveau date le seul problème est dans mon For
    Ici exactement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for /f "tokens=1,2,3 delims=_" %%i in ('dir /B "%repTraitement%" ' ) do set /a annee_rep=%%i & set /a cmp+=1 & echo cmp %cmp% & echo annee %%i & echo mois %%j & echo jour %%k & set /a mois_rep=%%j & set /a jour_rep=%%k
    Ici je parcour bien tout les champs du dir /B, mais les traitements que je fais par la suite ne s'appliquent que pour le dernier champ du dir. Je n'arrive aps à recupérer tout les champs intermédiaires.

    Peut-être que la formulation de mon problème si c'est le cas je peux reformuler

  6. #6
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Je trouve ton script extrêmement compliqué pour ce que tu veux faire et tenter de le corriger serait une pure perte de temps. Je peux te proposer une autre approche si tu veux.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 9
    Par défaut
    Je suis preneur de toute autre solution plsu pertinante
    Etant novice en batch je me suis peut-être égaré, donc si tu as mieux à proposer je suis preneur

    EDIT: je pense que ceci pourrai m'aider (sa se trouvais dans la faq, je l'avais zappé à ma premiere lecture )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    setlocal enableDelayedExpansion 
    for /F %%D in (c:\Mon_fichier) do (
    for /F "tokens=4 delims=\" %%E in ("%%D") do (
    set mavar=%%E
    echo !mavar!
    pause
    )
    Mais j'aurai une petite question:
    Dans ma boucle posté plus haut il n'y à donc aucun moyen d'accèder au différent résultat contenu dans mes variables sans utiliser ceci ?

  8. #8
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Déjà, tu peux utilement jeter un regard critique sur -> la discussion suivante qui justement met en lumière quelques algos sur la manipulation des dates qui seront très utiles dans ton cas.

    Une des caractéristiques essentielles de ces algos qui fait que ça fonctionne très bien, c'est qu'ils utilisent comme référence des dates qui s'inscrivent dans des cycles bien précis. La date qui répond à ces critères et qui est la plus utilisée est de toute évidence la date du 1er janvier 1970.

    Ainsi, si tu prends un de ces algos, -> tel que celui-ci, t'es en mesure de convertir une date en nombre de jours, en somme, le nombre de jours écoulé entre le 1er janvier 1970 et la date en question. Si la date en question est ce jour, tu obtiendras une certaine valeur. Si la date en question est celle de ton dossier, tu obtiendras une seconde valeur. La différence des deux valeurs te donne en quelque sorte l'ancienneté de ton dossier, en nombre de jours. Ainsi, en parsant tes dossiers, tu récupères l'ancienneté de chacun et donc, tu peux déterminer ceux qu'il faut supprimer.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 9
    Par défaut


    bon j'ai édité mon post au mauvais moment, tu as posté quand je l'éditais^^(si tu pouvais jeter un oeil sur mon post précédent)

    mon probleme enfaite ne se situe pas la^^

    Pour les test au niveau des dates ceux que j'ai dans mon script marche (après ils ne sont surment pas aussi performant mais je prefers avoir une version de mon script qui marche vraiment plutot qu'un version qui a des algo performant et qui ne marche pas, rien n'empeche de l'améliorer par la suite)

    Mon probleme se situe au niveau de la récupération des nom des fichiers je le repete sur le for posté plus haut ou je n'arrive pas à recupérer tout les champ de mon dir mais uniquement le dernier, mes variables annee, mois, et jours, contiennent ben à un moment les différents champs mais je n'arrive à faire un traitement qu'après que ma boucle for se termine, et donc le traitemant ne s'applique qu'au dernier champ recupéré

  10. #10
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Ce n'est pas juste une question d'algo, c'est carrément une autre approche. C'est éprouvé et c'est surtout exempt de bogues. Maintenant si tu préfères ton script initial, je veux bien te donner un exemple qui cible ton problème, mais je te laisse le soin de faire son intégration, car ton script est beaucoup trop désordonné pour moi.

    Que choisis-tu ?

  11. #11
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 9
    Par défaut
    Dans un premier temps plutot un exemple qui cible mon problème, comme sa au moin sa sera regler. Si tu as encore du temps par la suite, j'aimerai bien examiner l'autre approche.
    Sinon j'ai regarder les autres algo il est vrai que convertir la date en nombre de jour faciliterai la chose, je n'y avais pas pensé^^, d'ou les test pour les années bissextiles et les différents mois à 28, 29, 30 et 31 jours^^

  12. #12
    Nouveau membre du Club
    Inscrit en
    Août 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 9
    Par défaut
    oui pardon nombre de jour, me suis mis seconde en tete je sais pas pourquoi
    je vais jeter un coup d'oeil voir si j'arrive à améliorer si jamais j'ai un probleme je ferai une maj de se topic^^
    encore merci pour ton aide

Discussions similaires

  1. Que doit contenir un dossier de programmation ?
    Par b30ff dans le forum Débats sur le développement - Le Best Of
    Réponses: 11
    Dernier message: 26/06/2004, 19h09
  2. Verifier qu'un dossier existe (batch)
    Par kakou dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 08/01/2003, 13h46
  3. Réponses: 4
    Dernier message: 07/12/2002, 15h24
  4. Comment vider un dossier ?
    Par Zinoc dans le forum C++Builder
    Réponses: 3
    Dernier message: 25/06/2002, 14h14
  5. Permission sur un dossier
    Par Bjorn dans le forum C
    Réponses: 6
    Dernier message: 25/06/2002, 12h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo