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 :

un batch DOS pour "nettoyer des fichiers" ?


Sujet :

Scripts/Batch

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut un batch DOS pour "nettoyer des fichiers" ?
    Salut à tous

    Tout à bord, je tiens à féliciter les personnes qui gèrent ce site et les forums, c'est une merveille dans laquelle j'ai déjà trouvé pas mal d'infos ; je félécite aussi toutes les personnes qui y participent en apportant des informations souvent précieuses.

    Bon, passons à mon problème, car j'ai un pb qui risque de paraître ridicule pour certains mais comme je suis un gros newbie...

    A mon boulot, on me demande de faire le ménage dans les fichiers log sur des serveurs NT4.

    Je dois créer un batch (je ne connais aucun langage de programmation) pour :

    - purement et simplement supprimer certains fichiers (ça je sais faire )
    - purger un fichier log c.à.d ne garder que les 10000 dernières lignes du fichier
    - ne garder dans un répertoire que les fichiers de moins de 3 jours ou alors ne garder que les 10 derniers fichiers les plus récents du répertoire

    Première question : est-ce possible avec les commandes DOS ?

    Deuxième question : y aurait-il un gars sympa et compétent pour me guider ou me donner des liens qui pourront m'aider ?

    Je précise que je ne peux installer aucun soft sur ces serveurs.

    Merci très beaucoup de votre aide.

    A plus.

    Roro

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    je ne sais pas si il existe un forum sur les batchs sur devellopez.com ( autre langages et outils ? )
    par contre sur les newsgoups il en existe qq un en français.

    Première question : est-ce possible avec les commandes DOS ?
    A prioris cela semble réalisable, c'est une question de coût/temps.
    Il te faut bien analyser les infos nécessaire au traitement et ensuite vérifier si cela est possible avec un batch.
    Quelle plateforme NT ou supérieure ( les commandes différes)

    Tu dis que tu ne peux installer de soft, mais t'est-il possible de copier un script sur le serveur ou passes-tu par un share ?

    >- purger un fichier log c.à.d ne garder que les 10000 dernières lignes du fichier
    nécessite 2 passes :
    1 compte les lignes 2 garde les n derniéres lignes
    Instruction For /F et set /A count+=1
    ou encore inverse le fichier garde les n premiére lignes.

    >- ne garder dans un répertoire que les fichiers de moins de 3 jours ou alors ne garder que les 10 derniers fichiers les plus récents du répertoire
    "
    Dir /oD /A-D associé a SORT c'est un début.

    Deuxième question : y aurait-il un gars sympa et compétent pour me guider ou me donner des liens qui pourront m'aider ?
    Tu voulais dire une personne ?

    Tu peux commencer le dev et demander de l'aide ensuite
    En ce moment j'ai du temps de libre et qq connaisances sur les batchs NT ...

    A+
    Laurent Dardenne

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Re,

    et merci de ta réponse rapide, Laurent.

    Bien sûr, si une fille peut aussi m'aider, ça m'intéresse : pardon pour le "gars"

    Ce ne sont que des serveurs NT4 (pas de 2000 ni de XP pour le moment) et je peux copier le batch sur le serveur sur lequel je veux l'utiliser (c'est plus simple comme ça).

    Comme je le disais, je suis un big newbie... et je sens que ça va pas être facile.

    J'ai regardé les commandes FOR /F et SET /A

    admettons que mon fichier s'appelle test.txt et qu'il contienne 5 lignes.

    si je lance dans un batch la commande :

    SET COUNT=
    FOR /F %%I IN (test.txt) DO SET /A COUNT+=1


    j'ai effectivement une variable count qui est créée qui me donne le nombre de lignes du fichier (5 dans mon exemple).

    Cooooooooooool !!! ça c'est la première étape

    Bon, ensuite il faut que je définisse le nbre de lignes que je veux garder par ex :

    SET GARDE=3 (si je veux garder 3 lignes)

    Et puis je fais une comparaison :

    IF COUNT GTR GARDE donc si le nbre de lignes du fichier est supérieur au nombre de ligne que je veux garder, je lance une commande qui supprime les lignes en trop.

    D'accord, mais quelle est cette commande ? :

    Et est-ce que je ne risque pas de supprimer les dernières lignes au lieu des premières ?! C'est pour ça que tu parlais d'inverser le fichier ?

    Pour le tri par date, si j'ai bien compris, la commande :

    DIR /oD /A-D fait le tri par date et exclut du DIR les répertoires.

    Pour la commande SORT, je vais m'y pencher dessus, là je rentre à la maison et je verrai ça tout à l'heure.

    Merci encore.

    Roro

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    "Ce ne sont que des serveurs NT4 "
    Ok.
    Donc fais attention à ne pas le développer sous XP ou W2K et si c'est le cas vérifie dans la doc les évolutions des commandes.


    "Comme je le disais, je suis un big newbie...
    Comment crois-tu que j'ai commencé ?

    "et je sens que ça va pas être facile. "
    On verra ...

    "SET COUNT= "
    Ici cette commande annule la déclaration de la varaible COUNT, set Count=0 C+mieux ;-)

    FOR /F %%I IN (test.txt) DO SET /A COUNT+=1


    "Et puis je fais une comparaison :
    IF COUNT GTR GARDE donc si le nbre de lignes du fichier est supérieur au nombre de ligne que je veux garder,
    je lance une commande qui supprime les lignes en trop. D'accord, mais quelle est cette commande ? "
    Selon moi, avec les batch NT l'approche de programmation est différente d'un L3G. Il n'existe pas de fonction de "haut niveau".
    Il faut décomposer au maximun, un peu comme l'assembleur ou les premiers BASIC.

    Ici on reprend l'énoncé
    je lis une ligne
    est elle concerné par le traitement
    oui traite ( on utilise les redirections et en fin de batch on modifie les noms de fichiers)
    non la suite


    "je lance une commande qui supprime les lignes en trop. "
    Je pense qu'ici, un second script facilitera la maintenance et la réutilisation.

    "C'est pour ça que tu parlais d'inverser le fichier ? "
    C'était Juste une question de logique inverse. Inutile !

    "Et est-ce que je ne risque pas de supprimer les dernières lignes au lieu des premières ?!"
    Faut prendre qq risque parfois et les tests sont là pour ça.

    MAIN.CMD
    rem init
    set BackFile=c:\temp\log2.txt REM peut être set BackFile=%1
    set LogFile=c:\dir\log.txt
    set BakLogFile=c:\dir\log.bak
    set LimiteLigne=2599
    set SENS = AVANT REM ou ARRIERE
    Set NbLigne=0

    For /F (tokens=*) %%I in (%LogFile%) do Call RemoveLine.cmd "%%I"
    ren %LogFile% %BakLogFile%
    if exist %BakLogFile% Del %LogFile%& goto suite
    Goto error rem le fichier n'existe pas
    :suite
    ren %BacKLogFile% %LogFile%
    :end


    REMOVELINE.CMD
    Set nbLigne+=1;
    if %SENS%'==AVANT' if nbLigne GEQ LimiteLigne echo %1 >>%BackFile%&Goto END
    if %SENS%'==ARRIERE' if nbLigne LEQ LigneDébut echo %1 >>%BackFile%
    : end

    Voilà une piste balisée qui est à vérifier, compléter et tester.
    Je crois qu'en une passe c'est faisable.


    "Pour la commande SORT, je vais m'y pencher dessus, là je rentre à la maison et je verrai ça tout à l'heure. "
    Comme disent les Allemands 'Morgen ist auch un tag' qui signifie on verra demain, à chaque jour suffit ça peine, etc..

    "Merci encore."
    De rien, j'ai appris qq chose.

    A+
    Laurent Dardenne

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Encore merci,

    dès que j'ai quelques minutes, je teste tout ça.

    De toutes façons, je te tiendrai au courant, c'est la moindre des corrections.

    Encore une question, tu m'as dit qu'il y avait sûrement quelques newsgroups sur les batchs en français ; tu peux me donner quelques adresses ? J'ai cherché avec google, j'ai rien trouvé de vraiment pertinent.

    Roro

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    pour les newsgroups je ne me souviens plus de leur nom 'msdos.fr' je crois.
    Sinon si tu souhaites utiliser souvent les batchs, voici un lien à approfondir.
    http://<br /> http://www.uwasa.fi/...ml#batch<br />

    Le fichier "tscmd.zip A collection of Useful NT/2000/XP script tricks and tips, T.Salmi" contient qq script qui correspondent à ton besoin.
    Ils sont un légérement 'ésotérique' mais étant donné que Microsoft n'est pas trés prolixe sur le sujet ...

    A+
    Laurent Dardenne

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Salut, me revoilà !!!

    désolé pour le retard mais je n'ai pas eu le temps de m'en occuper avant...

    Bon, j'ai trouvé comment épurer mon fichier log mais je ne me suis pas trop servi de ton exemple car j'ai utilisé la commande skip.

    Je mets le fichier ici au cas où cela pourrait aider d'autres personnes :

    PURGE.CMD

    1. set logfile=%1
    2. set garde=%2
    3. set count=0
    4. if exist list.txt del list.txt
    5. set tempfile=list.txt
    6. for /f "tokens=*" %%I in (%logfile%) do echo %%I >> %tempfile%
    7. for /f "tokens=*" %%J in (%tempfile%) do set /a count+=1
    8. if /i %count% GTR %garde% (goto purge) else goto erreur

    9. :purge
    10. set /a limiteLigne=%count%-%garde%
    11. if exist log.new del log.new
    12. for /f "skip=%limiteligne% tokens=*" %%K in (%tempfile%) do echo %%K >> log.new
    13. if exist log.new del %1
    14. ren log.new %1
    15. del %tempfile%
    16. goto end

    17. :erreur
    18. echo il n'y a pas de lignes à supprimer
    19. goto end

    20. :end
    21. echo fin de la purge de %1


    La syntaxe est la suivante :

    PURGE toto.log 30 permet d'enlever les 30 premières lignes du fichier toto.log

    Explications :

    La ligne 6 permet d'enlever toutes les lignes vides (blanches) du fichier toto.log, elle crée un fichier (temporaire) list.txt

    Cette ligne est utile car la commande for /f "tokens=*" %%I in () do ne compte pas les lignes blanches alors que la commande for /f "skip=nblignes tokens=*" %%I in () do, elle, en tient compte.

    Pour vous en convaincre, faites un batch "CPTL.CMD" avec ces lignes :

    @echo off
    set count=0
    for /f "tokens=*" %%I in (%1) do set /A count=count+1
    echo.
    echo Le Nombre de Lignes de %1 est : %count%


    tapez CPTL toto.log ; il va compter les lignes du fichier toto.log et afficher le résultat. Maintenant, enlevez les lignes vides de toto.log et recommencez, vous obtiendrez le même résultat.

    Sans cette ligne 6, mon batch n'enlevait pas exactement le nb de lignes que je voulais. Elle est par contre inutile si votre fichier log ne contient pas de lignes vides.

    La ligne 7 compte le nb de lignes total du fichier ainsi créé => variable count

    La ligne 8 compare le nb de lignes total (count) avec le nb de lignes que l'on veut garder. Selon le résultat de la comparaison, elle renvoye à la "purge" (:purge) du fichier ou à la fin du programme (:erreur)

    La ligne 10 détermine le nb de lignes que l'on ne va pas garder. Ce nb de lignes est défini par le nb total de lignes (count) moins les lignes que l'on veut garder (garde)

    La ligne 12 extrait les lignes que l'on veut garder et les mets dans le fichier (temporaire) log.new

    La ligne 13 supprime le fichier original toto.log définit par la variable %1 ; j'ai ajouté une sécurité au cas où l'étape de la ligne 12 se soit mal passée : si log.new n'existe pas, le fichier original (toto.log) n'est pas supprimé

    Je me rends compte maintenant que la ligne 5 n'est pas utile, on peut la supprimer et remplacer directement %tempfile% par list.txt dans les lignes 6, 7, 12 et 15 ; ça devrait marcher aussi bien et supprimer une variable.

    Voili, voilou, c'est donc ok pour supprimer les lignes d'un fichier......

    Mais il me reste le pb de la suppression de fichiers à une date antérieure :

    comment fais-je pour supprimer, dans un répertoire donné, des fichiers plus vieux que trois jours ou, équivalent, conserver les fichiers qui ont 3 jours ou moins ?

    Je refait un topic là-dessus car ma requête est plus ciblée qu'au départ.

    Merci.

    Roro

    [TAG [Résolu] rajouté par CIVODUL4]
    [Pensez-y vous-même à l'avenir. Merci. ]

  8. #8
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    si je peux me permettre une remarque :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    PB avec les noms de fichiers contenant des espaces.
     Si Purge "fichier 1.txt" 5 
     alors mieux vaut &#58;
    
    for /f "tokens=*" %%I in &#40;'TYPE %logfile%'&#41; do echo %%I >> %tempfile% 
    
     REM si pas de persistence des variables alors
    22. set logfile=
    23. set garde=
    24. set count=
    Merci.
    Je le met dans ma boîte à script.
    Laurent Dardenne

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Salut Laurent et merci pour ces précisions,

    je les applique de ce pas à mon script.

    Pardon d'avoir "pollué" le forum avec un thread supplémentaire...

    Je suppose que la solution est dans le fichier tscmd.zip que tu m'as conseillé ?

    Merci

    Roro

  10. #10
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut
    effectivement tu as eu droit à un petit verrouillage.
    C'est les régles du forum, tout s'apprend...
    regarde dans le fichier tsbat.zip.
    n'hesite pas si tu as des questions.
    A+
    Laurent Dardenne

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Des logiciels pour l'analyse des fichiers log
    Par maya dans le forum Réseau
    Réponses: 3
    Dernier message: 14/04/2007, 22h27
  2. [Lazarus] Problème pour l'utilisation des fichiers
    Par Lulu_n10 dans le forum Lazarus
    Réponses: 7
    Dernier message: 30/03/2007, 16h54
  3. Recherche d'un SGBG pour la gestion des fichiers images !
    Par PandaConstantin01 dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 04/09/2006, 13h53
  4. Réponses: 6
    Dernier message: 11/05/2006, 18h33
  5. [LG]pour l'existence des fichiers en pascal
    Par mister_dsg dans le forum Langage
    Réponses: 8
    Dernier message: 04/12/2003, 22h14

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