Supprimer une section dans un fichier - .bat

Résolu
pilotepro -  
 pilotepro -
Bonjour,
Voilà mon problème est simple, je souhaite ajouter une section complète dans un fichier "scenery.cfg", et j'ai trouver la solution http://forum.hardware.fr/hfr/Programmation/Shell-Batch/recuperer-nombre-fichier-sujet_107516_1.htm, le seul problème c'est que j'aimerais aussi à l'aide d'un fichier ".bat", cette fois-ci désinstaller la section en question, voici comment la structure se présente :

[Area.XX]
Title=nomdelascene ==> Information 1
Local=Scenery\dossierdelascene ==> Information 2
Layer=XX
Active=TRUE
Required=FALSE

Sachant que XX, je souhaiterait donc supprimer la section à partir de l'information 1 et 2, supprimer toute la section c'est à dire de "[Area.XX]" à "Required=FALSE", sans me soucier de la valeur de XX. En gros, je doit juste dans le fichier ".bat" donner l'information 1 et 2, et le fichier ".bat" comprend qu'il doit supprimer cette section de son début à sa fin, mais sans toucher aux autres sections de ce fichier "scenery.cfg".

Merci d'avance de votre aide !

Cordialement
Pilotepro

14 réponses

  1. pilotepro
     
    Bonsoir,
    Un petit UP s'il vous plait.

    PS : Si il y a une alternative au fichier .bat, je suis preneur, par contre je ne m'y connait pas.

    Cordialement
    Pilotepro
    0
  2. pilotepro
     
    Bonjour,
    Ou plus simple encore expliqué moi juste comment je fais pour séléctionné l'information 1 et 2 car il n'y a aucun délimiteurs que je pourrait utilisé (regardé la structure du fichier), alors comment faire ?

    Merci d'avance de votre aide !

    PS : C'est vraiment important, et un projet entier est bloqué à cause de ça.

    Cordialement
    Pilotepro
    0
  3. LUDO
     
    salut,

    bon alors moi j'ai fais ça:

    j'ai au debut mon fichier test.cfg qui contient ceci:

    [Area.XX]
    Title=toto
    Local=val1
    Layer=XX
    Active=TRUE
    Required=FALSE1
    [Area.XX]
    Title=titi
    Local=val2
    Layer=XX
    Active=TRUE
    Required=FALSE2
    [Area.XX]
    Title=tata
    Local=val3
    Layer=XX
    Active=TRUE
    Required=FALSE3

    voila ensuite je lance mon batch:

    @echo off
    echo ----------------------
    echo Section a supprimer
    echo ----------------------
    echo.

    SETLOCAL enabledelayedextension

    set /p info1=Saisir le "title" :
    set /p info2=Saisir le "local" :

    for /f %%i in ('type test.cfg ^| find /N "%info1%"') do set numero_ligne1=%%i
    for /f %%i in ('type test.cfg ^| find /N "%info2%"') do set numero_ligne2=%%i
    set numero1_final=%numero_ligne1:~1,1%
    set numero2_final=%numero_ligne2:~1,1%

    set /a diff=%numero2_final% - %numero1_final%

    if %diff% EQU 1 goto go
    if %diff% NEQ 1 goto err

    :go
    set /a derniere_ligne_a_garder=%numero1_final% - 2
    set /a premiere_ligne_a_reprendre=%numero1_final% + 5
    for /f "tokens=1,* delims=:" %%i in ('findstr /n /r . test.cfg') do (
    if %%i geq 1 (
    if %%i leq 6 (
    if %%i equ 1 (
    echo %%j >resultat.cfg
    ) else (
    echo %%j >>resultat.cfg
    )
    )
    )
    )
    for /f "tokens=1,* delims=:" %%i in ('findstr /n /r . test.cfg') do if %%i geq %premiere_ligne_a_reprendre% echo %%j >>resultat.cfg
    echo.
    echo Section supprimee
    echo.
    PAUSE
    exit

    :err
    echo.
    echo Impossible de trouver la section
    echo.
    PAUSE

    Je saisi par exemple pour l'info1 titi puis pour l'info2 val2

    et je retrouve dans mon fichier resultat.cfg:

    [Area.XX]
    Title=toto
    Local=val1
    Layer=XX
    Active=TRUE
    Required=FALSE1
    [Area.XX]
    Title=tata
    Local=val3
    Layer=XX
    Active=TRUE
    Required=FALSE3

    Voili voilou est-ce que ceci te correspond???
    a+
    0
    1. LUDO
       
      merde j'ai fair une erreur, il faut remplacer:
      if %%i leq 6 (
      par
      if %%i leq %derniere_ligne_a_garder% (
      0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. LUDO
     
    bon en fait il y avait plusieurs souci, alors j'ai revue le code:
    Voila quelque chose qui me parait stable...:

    @echo off
    echo ----------------------
    echo Section a supprimer
    echo ----------------------
    echo.

    set /p info1=Saisir le "title" :
    set /p info2=Saisir le "local" :

    for /f "tokens=1 delims=[]" %%i in ('type test.cfg ^| find /N "%info1%"') do set numero1_final=%%i
    for /f "tokens=1 delims=[]" %%i in ('type test.cfg ^| find /N "%info2%"') do set numero2_final=%%i

    set /a diff=%numero2_final% - %numero1_final%

    if %diff% EQU 1 goto go
    if %diff% NEQ 1 goto err

    :go
    set /a derniere_ligne_a_garder=%numero1_final% - 2
    set /a premiere_ligne_a_reprendre=%numero1_final% + 5
    for /f "tokens=1,* delims=:" %%i in ('findstr /n /r . test.cfg') do (
    if %%i geq 1 (
    if %%i leq %derniere_ligne_a_garder% (
    if %%i equ 1 (
    echo %%j >resultat.cfg
    ) else (
    echo %%j >>resultat.cfg
    )
    )
    )
    )
    for /f "tokens=1,* delims=:" %%i in ('findstr /n /r . test.cfg') do if %%i geq %premiere_ligne_a_reprendre% echo %%j >>resultat.cfg
    echo.
    echo Section supprimee
    echo.
    PAUSE
    exit

    :err
    echo.
    echo Impossible de trouver la section
    echo.
    PAUSE

    a++
    0
  6. pilotepro
     
    Bonsoir,
    Merci énormément pour tout votre travail !
    Mon équipe et moi étions désespérés.

    Alors, en ce qui concerne votre script, sachant que ce script sera lancé à la fin de l'installation, l'utilisateur n'a rien à entré, ça sera à moi de définir dans le code du batch les informations 1 et 2, d'autre part malgré tout le mal que vous vous êtes donné (je vous en remercie encore), eh bien même quand je rentre la bonne information 1 et 2 au début, il me dit quand même que la section n'existe pas alors qu'elle y est. Une dernière chose et pas des moindres, si j'ai bien compris votre fichier copie la section choisie dans un autre fichier, or ce dont nous avons besoin est qu'il supprime juste la section en question, et il n'a pas besoin de la copié.

    PS : La structure n'est pas :

    [Area.XX]
    Title=toto
    Local=val1
    Layer=XX
    Active=TRUE
    Required=FALSE1
    [Area.XX]
    Title=tata
    Local=val3
    Layer=XX
    Active=TRUE
    Required=FALSE3

    Elle est (dans le cas de votre exemple) :

    [Area.XX]
    Title=toto1
    Local=chemin\val1
    Layer=XX
    Active=TRUE
    Required=FALSE

    [Area.XX]
    Title=toto2
    Local=chemin\val2
    Layer=XX
    Active=TRUE
    Required=FALSE

    [Area.XX]
    Title=toto3
    Local=chemin\val3
    Layer=160
    Active=TRUE
    Required=FALSE

    Le résultat final que nous souhaitons étant :

    [Area.XX]
    Title=nomdelascene
    Local=Scenery\dossierdelascene
    Layer=XX
    Active=TRUE
    Required=FALSE

    [Area.XX]
    Title=nomdelascene2
    Local=Scenery\dossierdelascene2
    Layer=XX
    Active=TRUE
    Required=FALSE

    [Area.XX]
    Title=nomdelascene3
    Local=Scenery\dossierdelascene3
    Layer=XX
    Active=TRUE
    Required=FALSE

    (Les espaces entres les différents paragraphes sont importants)

    Et c'est exactement comme cela, si vous changez une valeur, alors tout le fichier scenery.cfg est fichu.

    Merci de votre aide !
    J'espère que vous pourrez nous aidé, avec les recommandations faites ci-dessus.

    Cordialement
    Pilotepro
    0
  7. pilotepro
     
    Bonjour,
    UP S'il vous plait.

    Cordialement
    Pilotepro
    0
  8. LUDO
     
    bonjour,

    bon désolé j'étais pas trop la ce week-end...
    Alors ok je vais modifier pour que vous puissiez mettre les infos dans le code.

    Ensuite ok je vais modifier pour que cela reste dans le meme fichier (en revanche l'ancien sera tjs existant (on sait jamais en cas de problème) mais je mettrai l'extension .old...)

    Enfin il ne trouve pas la section, ça m'étonne:
    - les lignes Title=nomdelascenexxx et Local=Scenery\dossierdelascene2 se suivent-elles ???

    Avec ces ééponses je vous refererai le code!
    Si cela ne fonntionne toujours pas, il faudra voir si vous pouvez directement me donner le fichier .cfg que je puisse voir réellement le souci
    0
  9. pilotepro
     
    Bonjour,
    Merci infiniment pour votre aide !
    Alors, ok alors pour le "scenery old" c'est une excellente idée, et je vous en remercie. En ce qui concerne le script l'erreur vient en fait de moi, javait oublié de renommer le fichier dans les codes du script, et je vient de ressayer et ça marche. Il y a juste un problème et pas des moindres, c'est que dans le fichier final, la section est bien supprimé mais aussi l'espace qui sépare les différents paragraphes, donc si vous pouviez remédier à ce petit problème ça serait parfait.

    Merci d'avance de votre aide et vivement le résultat !

    Cordialement
    Pilotepro
    0
  10. pilotepro
     
    Bonjour,
    J'ai aussi oublier de vous précisez, que vu que le script sera exécuter automatiquement en fin d'installation, et que l'utilisateur n'a rien à faire, qu'il faut que vous enleviez la confirmation à la fin, demandant d'appuyer sur une touche pour continuer, et toutes les autres confirmations si il y en a, il faut donc que le script s'éteigne directement à la fin de l'opération.

    Cordialement
    Piltoepro
    0
  11. LUDO
     
    ok alors pour moi cela a l'air de fonctionner:

    @echo off

    echo ----------------------
    echo Section a supprimer
    echo ----------------------
    echo.

    type scenery.cfg > scenery.cfg.old

    set info1=toto
    set info2=val1

    for /f "tokens=1 delims=[]" %%i in ('type scenery.cfg.old ^| find /N "%info1%"') do set numero1_final=%%i
    for /f "tokens=1 delims=[]" %%i in ('type scenery.cfg.old ^| find /N "%info2%"') do set numero2_final=%%i

    set /a diff=%numero2_final% - %numero1_final%

    if %diff% EQU 1 goto go
    if %diff% NEQ 1 goto err

    :go

    SETLOCAL enabledelayedexpansion

    set /a derniere_ligne_a_garder=%numero1_final% - 2
    set /a premiere_ligne_a_reprendre=%numero1_final% + 5
    for /f "tokens=1,2,* delims=:=." %%i in ('findstr /n /r . scenery.cfg.old') do (
    if %%i geq 1 (
    if %%i leq %derniere_ligne_a_garder% (
    if %%i equ 1 (
    echo %%j%%k >scenery.cfg
    ) else (
    if %%j EQU Required (
    echo %%j=%%k >>scenery.cfg
    echo. >>scenery.cfg
    ) else (
    if %%j NEQ [Area (
    echo %%j=%%k >>scenery.cfg
    ) else (
    echo %%j.%%k >>scenery.cfg
    )
    )
    )
    )
    )
    )
    for /f "tokens=1,* delims=:" %%i in ('findstr /n /r . scenery.cfg.old') do if %%i geq %premiere_ligne_a_reprendre% echo %%j >>scenery.cfg
    echo.
    echo Section supprimee
    echo.
    exit

    :err
    echo.
    echo Impossible de trouver la section
    echo.

    Il faut remplacer les valeurs des variables info1 et info2 en haut du script...
    Moi j'ai mis "toto" et "val1" donc a remplacer par vos valeurs.
    Ensuite c'est bon il faut juste lancer le script et celui-ci se referme (un .old est créer faisant une sauvagerde du fichier avant traitement.

    Hésitez pas à me signaler tout problème...
    0
  12. pilotepro
     
    Bonjour,
    Merci encore pour votre aide !
    Le seul problème qui reste, c'est que toutes les sections suivies de celles qui est supprimés, ont l'espace qui les délimites qui l'est aussi, or cela est très embêtant, car le fichier de configuration ne sera plus reconnu par le programme.

    Voici un exemple simple, de ce qu'il se passe :

    AVANT :

    [Area.XX]
    Title=nomdelascene
    Local=Scenery\dossierdelascene
    Layer=XX
    Active=TRUE
    Required=FALSE

    [Area.XX]
    Title=nomdelascene2
    Local=Scenery\dossierdelascene2
    Layer=XX
    Active=TRUE
    Required=FALSE

    [Area.XX]
    Title=nomdelascene3
    Local=Scenery\dossierdelascene3
    Layer=XX
    Active=TRUE
    Required=FALSE

    [Area.XX]
    Title=nomdelascene4
    Local=Scenery\dossierdelascene4
    Layer=XX
    Active=TRUE
    Required=FALSE

    [Area.XX]
    Title=nomdelascene5
    Local=Scenery\dossierdelascene5
    Layer=XX
    Active=TRUE
    Required=FALSE

    [Area.XX]
    Title=nomdelascene6
    Local=Scenery\dossierdelascene6
    Layer=XX
    Active=TRUE
    Required=FALSE

    APRES :

    [Area.XX]
    Title=nomdelascene
    Local=Scenery\dossierdelascene
    Layer=XX
    Active=TRUE
    Required=FALSE

    [Area.XX]
    Title=nomdelascene2
    Local=Scenery\dossierdelascene2
    Layer=XX
    Active=TRUE
    Required=FALSE

    [Area.XX]
    Title=nomdelascene4
    Local=Scenery\dossierdelascene4
    Layer=XX
    Active=TRUE
    Required=FALSE
    [Area.XX]
    Title=nomdelascene5
    Local=Scenery\dossierdelascene5
    Layer=XX
    Active=TRUE
    Required=FALSE
    [Area.XX]
    Title=nomdelascene6
    Local=Scenery\dossierdelascene6
    Layer=XX
    Active=TRUE
    Required=FALSE

    Voilà tout, merci de votre aide et désoler pour le dérangement.

    Cordialement
    Pilotepro
    0
  13. LUDO
     
    voila avec la modification:

    @echo off

    echo ----------------------
    echo Section a supprimer
    echo ----------------------
    echo.

    type scenery.cfg > scenery.cfg.old

    set info1=tata
    set info2=val2

    for /f "tokens=1 delims=[]" %%i in ('type scenery.cfg.old ^| find /N "%info1%"') do set numero1_final=%%i
    for /f "tokens=1 delims=[]" %%i in ('type scenery.cfg.old ^| find /N "%info2%"') do set numero2_final=%%i

    set /a diff=%numero2_final% - %numero1_final%

    if %diff% EQU 1 goto go
    if %diff% NEQ 1 goto err

    :go

    SETLOCAL enabledelayedexpansion

    set /a derniere_ligne_a_garder=%numero1_final% - 2
    set /a premiere_ligne_a_reprendre=%numero1_final% + 5
    for /f "tokens=1,2,* delims=:=." %%i in ('findstr /n /r . scenery.cfg.old') do (
    if %%i geq 1 (
    if %%i leq %derniere_ligne_a_garder% (
    if %%i equ 1 (
    echo %%j%%k >scenery.cfg
    ) else (
    if %%j EQU Required (
    echo %%j=%%k >>scenery.cfg
    echo. >>scenery.cfg
    ) else (
    if %%j NEQ [Area (
    echo %%j=%%k >>scenery.cfg
    ) else (
    echo %%j.%%k >>scenery.cfg
    )
    )
    )
    )
    )
    )
    for /f "tokens=1,2,* delims=:=." %%i in ('findstr /n /r . scenery.cfg.old') do (
    if %%i geq %premiere_ligne_a_reprendre% (
    if %%j EQU Required (
    echo %%j=%%k >>scenery.cfg
    echo. >>scenery.cfg
    ) else (
    if %%j NEQ [Area (
    echo %%j=%%k >>scenery.cfg
    ) else (
    echo %%j.%%k >>scenery.cfg
    )
    )
    )
    )
    echo.
    echo Section supprimee
    echo.
    exit

    :err
    echo.
    echo Impossible de trouver la section
    echo.
    0
  14. pilotepro
     
    Bonsoir,
    Désoler pour ma réponse tardive.
    Nous vous remercions infiniment l'équipe et moi pour tout votre travail, et votre script fonctionne à merveille !
    Grâce à vous nous allons enfin pouvoir finir notre projet bloqué depuis un moment.

    Merci encore pour votre patience et votre aide !

    Cordialement
    Pilotepro
    0