Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Batch] Script pour faire le menage

Sujet résolu
    13 juin 2006 à 11:09:42

    Bonjour les zeros :p ,

    Je suis en stage de fin d'année d'informatique de gestion. Et dans mon entreprise on me demande de creer un script en .bat pour supprimé des fichiers pdf de plus de 30 jours mais le probleme c'est que je ne connais pas vraiment le batch..

    Apres une journée de galere sur le net a cherché comment faire je me suis decidé a venir ici...

    J'ai vu que l'on pouvait supprimé dans les sous repertoire grace a del /s [nom_du_fichier.extension]


    Donc si quelqu'un pouvait m'eclairer sur la comparaison entre la date systeme moins 30 jours et la date de creation sa serait cool ^^
    • Partager sur Facebook
    • Partager sur Twitter
      13 juin 2006 à 11:30:36

      Salut,
      perso, je ne connais pas grand chose en batch.
      mais sur le site, dans la section "vos tutos" il y ça.
      @+
      • Partager sur Facebook
      • Partager sur Twitter
        13 juin 2006 à 11:39:46

        Merci pour ta reponse ;)
        Mais hier j'ai consulté ce tuto qui est au passage interessant pour par exemple utilisé du batch en C.
        Y'a la variable %date% qui donne la date systeme mais je n'est meme pas reussi a faire une date systeme moins 30 jours, je suis peut etre un boulet qui c'est :lol:
        • Partager sur Facebook
        • Partager sur Twitter
          13 juin 2006 à 18:34:40

          Ah ^^
          J'ai ta solution, laisse moi 1 h le temps d'aller à l'auto école et dès que je reviens je rédige :p
          C'est plutôt long

          -------C'est bon je suis là :p

          Donc, je vais essayer d'expliquer même si jsuis pas très doué ...
          Il faut commencer par récupérer le mois et le jour d'aujourd'hui avant d'aviser le reste.

          Tu as trouvé, à juste titre, que la variable d'environnement fournissait une date au format jj/mm/aaaa (c'est magnifique Windows ça adapte même les systèmes de dates :) ).
          Cependant, comment récupérer dans deux variables différentes le mois et je jour?

          Et bien on utilise une boucle à jetons !!!!

          For /F "delims=/ tokens=1,2 usebackq" %A in (`echo %date%`) Do (set jour_now=%A & set mois_now=%B)


          Donc bon je vais décomposer parce que là ça doit être super clair pour tout le monde :'( .

          - on prend le résultat de la commande echo %date% (in (`echo %date%`)), soit aujourd'hui 13/06/2006.
          - on utilise le délimiteur / (delims=/) afin de séparer les différentes parties de cette date (13, 06 et 2006).
          - on spécifie que l'on prend les 2 premières parties (tokens=1,2)
          Ainsi on obtiendra, grâce à cette syntaxe %A=13 et %B=06.
          On affecte donc finalement %A (13) à jour_now et %B (06) à mois_now.

          [ + de précision => For /? je suis pas un man win32 ^^ ]



          Maintenant, il faut passer un à un les fichiers à tester, piquer leur date de création, et la comparer à celle d'aujourd'hui ^^

          Comment passer en revue tous les fichiers d'une arborescence d'un répertoire?
          Avec une boucle /R ^^

          For /R "Repertoire dont l'arborescence est à lister" %A in (*.*) Do echo %A


          Donc bon je vais décomposer parce que là ça doit être super clair pour tout le monde :'( . ( :-° comment ça jsuis un feignant?).

          - on parcourt l'ensemble de l'arborescence, sous répertoire par sous répertoire, du répertoire <Repertoire dont l'arborescence est à lister>.
          - on stocke le nom des fichiers qui correspondent à *.* (tous :p ) dans %A à chaque fichier passé en revue et on l'affiche à l'écran ^^

          [+ de précisions => For /?]



          Voilà, mais là on a le nom, et nous on cherche la date de création de chaque fichier, et bien les extensions de commandes autorisent, comme spécifié dans For /?, à modifier dans "echo %A" le %A pour obtenir la date de création.
          C'est pas clair?
          OK donc lookez :


          For /R "Repertoire dont l'arborescence est à lister" %A in (*.*) Do echo %~tA


          C'est la même chose sauf qu'on a étendu %A en %~tA pour que ca donne la date de création (et heure :D la classe).
          On se retrouve avec un truc au format jj/mm/aaaa hh:mm:ss, mais c'est pareil à traiter que dans la première boucle à jetons, où on a extrait l'heure actuelle (sisi).

          Pareilement, pour choper le chemin d'accès complet du fichier (utile à la suppression), on étend %A en %~dpfA.

          Reste plus qu'à se débrouiller pour traiter à chaque coup de boucle ces données afin de virer le fichier s'il date de trop.

          Je vais rééditer dès que je pourrais, mais jdois arréter l'ordi là ....


          -----------Le retour

          Bon,donc ceci devient un peu dur à démontrer en ligne de commande sur la suite, donc je vais considérer un batch (.bat) dans lequel je vais mettre tout ça. Je résume :

          :: <- ca c'est des commentaires
          :: Récupération du jour et du mois actuel

          For /F "delims=/ tokens=1,2 usebackq" %%A in (`echo %date%`) Do (set jour_now=%%A & set mois_now=%%B)


          ::Boucle qui permet de passer en revue tous les fichiers de l'arborescence d'un dossier, de prendre à chaque tour de boucle la date de création ainsi que le nom du fichier et de faire sous-traiter le tout par un sous programme.

          For /R "Repertoire dont l'arborescence est à lister" %%A in (*.*) Do (set date_creation=%%~tA & set chemin_fichier=%%~dpfA & call :traitement)



          Très bien. Si vous vous en êtes sorti jusqu'ici à a peu près comprendre, la fin est proche.
          Alors ... Un point sur l'actualité :

          On a le jour et le mois actuel.
          On passe en revu dans une boucle plein de fichier, pour chacun on récupère sa date (dont il faudra extraire le jour et le mois) et son chemin d'accès.
          On est toujours sans la boucle avec nos 2 infos, et on se rend à l'étiquette traitement, que je vais mettre dans la suite du batch que voici :

          :: Le sous programme traitement

          :: Tout d'abord, tant que l'on arrive pas par le goto, on saute le sous programme
          :: Pour ceci on se rend à l'étiquette après ce sous programme : fin_traitement

          goto fin_traitement

          ::etiquette traitement
          :traitement

          ::ici on mettra le traitement que doivent subir les varaibles à chaque tour de boucle

          exit /B

          :: etiquette fin traitement
          :fin_traitement


          Vous devriez ici comprendre le mécanisme : le sous programme traitement ne peut être atteint car ''encadré'' par l'étiquette fin_traitement.

          La seule condition auquel il peut être atteint, c'est quand la boucle l'appellera. La boucle va donc d'abord rentrer dans le sous programme, executer les instructions dedans, et enfin rencontrer le exit /B, ce qui aura pour effet de la faire passer à son tour suivant ^^


          Maintenant, quelles sont les instructions de traitement?
          Elles sont simples :
          - Déduction du temps depuis quand le fichier existe
          - Suppression si ce temps est supèrieur ou égal à 30 jours

          Voici donc :

          Pour comprendre mieux ce qui suit : set /? et if /?

          :: <- ca c'est des commentaires
          :: Récupération du jour et du mois actuel

          For /F "delims=/ tokens=1,2 usebackq" %%A in (`echo %date%`) Do (set jour_now=%%A & set mois_now=%%B)


          ::Boucle qui permet de passer en revue tous les fichiers de l'arborescence d'un dossier, de prendre à chaque tour de boucle la date de création ainsi que le nom du fichier et de faire sous-traiter le tout par un sous programme.

          For /R "Repertoire dont l'arborescence est à lister" %%A in (*.*) Do (set date_creation=%%~tA & set chemin_fichier=%%~dpfA & goto traitement)

          :: Le sous programme traitement

          :: Tout d'abord, tant que l'on arrive pas par le goto, on saute le sous programme
          :: Pour ceci on se rend à l'étiquette après ce sous programme : fin_traitement

          goto fin_traitement

          ::etiquette traitement
          :traitement

          :: C'EST LA QUE CA CHANGE :

          :: Décomposition de la date de création récupéré dans la boucle
          :: Exactement comme au début

          For /F "delims=/ tokens=1,2 usebackq" %%C in (`echo %date_creation%`) Do (set jour_creation=%%C & set mois_creation=%%D)

          If %jour_now% LSS %jour_creation% set /A jour_now+=31
          If %mois_now% LSS %mois_creation% set /A mois_now+=12

          set /A duree_jour=%jour_now%-%jour_creation%
          set /A duree_mois=%mois_now%-%mois_creation%

          set /A duree_totale_jours=%duree_mois%*31+%duree jour%

          If %duree_totale_jours% GEQ 30 (del /Q "%chemin_fichier%"
          echo Fichier %chemin_fichier% supprime.)

          exit /B

          :: etiquette fin traitement
          :fin_traitement

          pause>nul




          Bon :S j'espère que vous suivez là ...
          Dans le traitement, un brin d'anti bug d'abord :
          On cherche une duree, on va donc faire DATE_NOW - DATE_CREATION.
          Or, si le résultat est négatif parce qu'entre temps on a changé de mois ^^ ou d'année (faut tout prévoir)....

          Et bien dans ces cas là on corrige :

          If %jour_now% LSS %jour_creation% set /A jour_now+=31
          If %mois_now% LSS %mois_creation% set /A mois_now+=31


          LSS ca veut dire strictement infèrieur.
          if ca veut dire SI.
          set /A jour_now+=31 ca veut dire qu'on rajoute à jour_now 31 (réfléchissez un peu en rapport à la durée et vous trouverez pourquoi ^^ ).


          Très bien. Maintenant on calcule la durée :

          set /A duree_jour=%jour_now%-%jour_creation%
          set /A duree_mois=%mois_now%-%mois_creation%


          Bon ça ça se passe de commentaires ... s'agit juste de faire deux soustractions (niveau CP).



          Mais maintenant on se retrouve d'un coté avec une durée de jour et de l'autre avec une durée en mois...
          Et bien on rétablit tout ca en jours :

          set /A duree_totale_jours=%duree_mois%*31+%duree_jour%



          La variable %duree_totale_jours% contient maintenant pour le fichier en cours le nombre de jours écoulée entre la création et maintenant.

          On voit si elle est supèrieure ou égale à 30, auquel cas on vire le fichier et on affiche un message le signalant :

          If %duree_totale_jours% GEQ 30 (del /Q "%chemin_fichier%"
          echo Fichier %chemin_fichier% supprime.)


          [ GEQ => supèrieur ou égal ]


          LE fichier est viré, la boucle continu jusqu'à ce qu'elle se termine.
          Elle se termine et on passe à la suite enfin ^^ . Le sous programme est sauté.
          On arrive au pause>nul. C'est la fin du script au prochain appui sur une touche .....

          Et c'est fini ...


          Script final :

          ==========================code==================

          @echo off
          :: Récupération du jour et du mois actuel

          For /F "delims=/ tokens=1,2 usebackq" %%A in (`echo %date%`) Do (set jour_now=%%A & set mois_now=%%B)


          ::Boucle qui permet de passer en revue tous les fichiers de l'arborescence d'un dossier, de prendre à chaque tour de boucle la date de création ainsi que le nom du fichier et de faire sous-traiter le tout par un sous programme.

          For /R "Repertoire dont l'arborescence est à lister" %%A in (*.*) Do (set date_creation=%%~tA & set chemin_fichier=%%~dpfA & call :traitement)

          :: Le sous programme traitement

          :: Tout d'abord, tant que l'on arrive pas par le goto, on saute le sous programme
          :: Pour ceci on se rend à l'étiquette après ce sous programme : fin_traitement

          goto fin_traitement

          ::etiquette traitement
          :traitement


          :: Décomposition de la date de création récupéré dans la boucle
          :: Exactement comme au début

          For /F "delims=/ tokens=1,2 usebackq" %%C in (`echo %date_creation%`) Do (set jour_creation=%%C & set mois_creation=%%D)

          If %jour_now% LSS %jour_creation% set /A jour_now+=31
          If %mois_now% LSS %mois_creation% set /A mois_now+=12

          set /A duree_jour=%jour_now%-%jour_creation%
          set /A duree_mois=%mois_now%-%mois_creation%

          set /A duree_totale_jours=%duree_mois%*31+%duree_jour%

          If %duree_totale_jours% GEQ 30 (del /Q "%chemin_fichier%"
          echo Fichier %chemin_fichier% supprime.)

          exit /B

          :: etiquette fin traitement
          :fin_traitement

          pause>nul
          ======================/code==================

          Avec en rouge le chemin d'accès dans lequel tu souhaites virer les fichiers et le nombre de jour avant qu'il ne soient éjectés.

          J'ai testé ce script, il marche niquel.
          Tu peux l'utiliser sans lire mon barratin ça m'est égal ça m'a occupé, et je sais que ca servira forcément à quelqu'un dans un endroit comme celui-ci. ;)

          Faites ce que vous voulez de ce script, et n'hésitez pas à poser des questions si je me suis planté, si vous ne comprenenez pas, ou s'il peut se résumer en une ou 2 commandes .. o_O (lol c'est pas si fantastique que ca :p ).

          Bonne chance à toi.

          ++

          PS : Tu peux le démarrer automatiquement ou manuelement après pour faire tres purges. Ca ne dépend que de toi.
          • Partager sur Facebook
          • Partager sur Twitter
            14 juin 2006 à 9:04:43

            Merci beaucoup pour ton script je viens de le voir :D

            Je vais lire et essayé de le faire j'editerais mon message pour te dire ;)

            Mais en tout cas c'est tres sympa de m'aidé comme ca :):):)


            Je viens de tout lire et j'ai fais quelque test mais avec ce que je vois ton format date est en JJ/MM/AAAA et le mien est en jour. JJ/MM/AAAA

            Donc j'ai modifié cette ligne


            For /F "tokens=2,3 delims=/ usebackq" %%A in (`echo %date%`) Do (set jour_now=%%A & set mois_now=%%B)


            Mais a l'execution il me dit que l'un des operateurs est manquant et il m'efface tout (j'ai mis deux espaces entre delims=/ usebackq pour qu'il me compte l'espace comme un separateur)

            Je fais d'autre essais mais en tout cas merci beaucoup, je m'attendais pas a une aide pareil :D
            • Partager sur Facebook
            • Partager sur Twitter
              14 juin 2006 à 13:08:29

              Re ;)

              Citation : FeTi


              Je viens de tout lire et j'ai fais quelque test mais avec ce que je vois ton format date est en JJ/MM/AAAA et le mien est en jour. JJ/MM/AAAA



              Euh c'est le même format ...
              Sans le format je peux pas faire grand chose ...

              Donne ton format de date, moi c'est JJ/MM/AAAA.
              Donne aussi ta version d'invite de commande (menu demarrer -> executer -> cmd -> ver). Moi c'est Microsoft Windows XP [version 5.1.2600].
              Et dis moi si rien n'a été changé dans les paramètres Windows par défaut, parce que les scripts peuvent avoir différents comportements.

              Merci :)

              J'avais oublié un goto dans la source précédente (celui qui sert à sauter l'étiquette traitement), j'ai édité ...

              Il y a un problème si tu cherches un espace comme séparateur, je sais pas comment faire.
              • Partager sur Facebook
              • Partager sur Twitter
                14 juin 2006 à 13:14:26

                Je pense que quand tu as la date c'est "14/06/2006" dans le mien c'est "mer. 14/06/2006", donc dans jours actuel il doit mettre "mer. 14" au lieu de 14 vu que le delimiteur est /.

                Mais merci pour cette aide c'etait vraiment interressant je vais refaire des test pour qu'il marche cette aprem :D:D:D
                • Partager sur Facebook
                • Partager sur Twitter
                  14 juin 2006 à 13:22:02

                  Donc le problème c'est que faut virer le nom du jour avant ...

                  For /F "tokens=2,3 delims=/. usebackq" %%A in (`echo %date%`) Do (set jour_now=%%A & set mois_now=%%B)


                  On ignore %%A puisque c'est "mer", et puis on se sert du . comme séparateur et on tombe sur un " 14" et un "06". Je pense pas que ça pose de problème l'espace.
                  C'est bon. :p


                  Jme suis planté : le tokens=2,3 spécifie que ca fait le 2 et le 3 dans %%A et %%B, donc %%A=14 et %%B=06 ...
                  Magnifique ^^

                  Néanmoins il faudra aussi adapter la partie d'apprès pour la date de création. Si tu l'a comprise ça va tout seul (bah ouais suffit d'ajouer un . dans le délimiteur et de changer tokens ^^ )
                  Sinon questionne :)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 juin 2006 à 13:36:55

                    Merci de te prendre la tete pour moi ;)

                    J'ai tout changé comme tu m'a dit et pour chaque ligne il me dit qu'il manque un operateur... Bizzare o_O

                    En Faite j'ai trouvé la date du fichier est en JJ/MM/AAAA donc la je fais comme toi mais c'est pour la date systeme qu'il faut que je change avec les deux delimiteur...

                    ps: je viens de lancé il m'efface tout meme les recents :lol:
                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 juin 2006 à 13:44:03

                      Np Np, mais accepte moi sur msn ^^
                      Je pourrai régler un à un tous tes problèmes, et je mettrai la solution sur le forum.
                      Parce que la le chat forum ca devient dangereux :p

                      PS : Ah ouais c'est vrai je me suis planté la date de création reste effectivement en JJ/MM/AAAA ^^
                      • Partager sur Facebook
                      • Partager sur Twitter
                        15 juin 2006 à 11:09:16

                        Ca y'est ca marche :D

                        Je tiens a te remercier Knacki car sans toi je n'aurais jamais pu le faire ;)


                        Je mets une copie du code



                        @echo off


                        :: Recuperation du jour du mois et de l'annee
                        ::Date au format jou. JJ/MM/AAAA


                        For /F "delims=/. tokens=3 usebackq" %%A in (`echo %date%`) Do (set mois_now=%%A)

                        ::Troncage pour recuperer le jour et l'annee (plus d'info avec set /?)
                        Set /A jour_now=%date:~5,2%
                        Set /A anne_now=%date:~13,4%

                        ::Boucle qui permet de passer en revue tous les fichiers de l'arborescence d'un dossier, de prendre à chaque tour de boucle la date

                        de création ainsi que le nom du fichier et de faire sous-traiter le tout par un sous programme.

                        For /R "C:\Program Files\Horoquartz\eTemptation\reporting\imppdf" %%A in (*.pdf) Do (set date_creation=%%~tA & set

                        chemin_fichier=%%~dpfA & call :traitement)


                        :: Le sous programme traitement

                        :: Tout d'abord, tant que l'on arrive pas par le goto, on saute le sous programme
                        :: Pour ceci on se rend à l'étiquette après ce sous programme : fin_traitement

                        goto fin_traitement

                        :traitement

                        :: Décomposition de la date de création récupéré dans la boucle
                        :: Date au format JJ/MM/AA

                        For /F "delims=/ tokens=1,2 usebackq" %%C in (`echo %date_creation%`) Do (set jour_creation=%%C & set mois_creation=%%D)


                        ::Troncage pour recuperer l'annee
                        Set /A anne_creation=%date_creation:~6,2%


                        If %jour_creation% LSS 10 Set /A jour_creation=%jour_creation:~1,2%

                        If %jour_creation% GEQ 10 Set /A jour_creation=%jour_creation:~0,2%


                        set/A diff_mois=%mois_now%-%mois_creation%

                        set /A diff_jour=%jour_now%-%jour_creation%

                        If %diff_mois% EQU 0 set /A duree_totale_jours=%jour_now%-%jour_creation%

                        If %diff_mois% NEQ 0 set /A duree_totale_jours=30*(%diff_mois%)-%jour_creation%+%jour_now%


                        If %duree_totale_jours% GEQ 30 (del /q "%chemin_fichier%" echo Fichier %chemin_fichier% supprime.)

                        if %anne_creation% NEQ %anne_now% (del /q "%chemin_fichier%" echo Fichier %chemin_fichier% supprime.)

                        exit /B


                        :fin_traitement



                        pause>nul




                        J'ai recupérer les commentaires de Knacki et j'en est ajouté.

                        Le plus gros problème vient du faite que les dates ne sont pas au meme format d'un OS à l'autre et meme sur le meme plusieurs format peuvent etre present o_O

                        J'avais eu un probleme avec des espaces dans les dates qui me faisait planté l'execution et qui etait differents a partir de 10 d'ou ces deux lignes:

                        If %jour_creation% LSS 10 Set /A jour_creation=%jour_creation:~1,2%
                        If %jour_creation% GEQ 10 Set /A jour_creation=%jour_creation:~0,2%
                        • Partager sur Facebook
                        • Partager sur Twitter
                          15 juin 2006 à 13:38:46

                          Bon bah je suis content pour toi que ca marche :)

                          Si tu veux y'a une solution barbare qui consiste à directement aller modifier la base de registre au début du script pour mettre le format de date que tu désire :-° .

                          Enfin bon bref, si ca marche c'est bien. Tu devrais l'indiquer résolu.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          [Batch] Script pour faire le menage

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown