Partage
  • Partager sur Facebook
  • Partager sur Twitter

[BATCH] modifier un fichier ini

    15 juillet 2020 à 10:46:30

    Bonjour,

    J'ai trouvé beaucoup de sujet pour ça, plein de script varié, avec des boucles FOR complexe, mais rare sont ceux qui fonctionne.

    Je dois créer un batch qui modifie un fichier .ini situé dans c:\users\toto\appdata\roaming\logiciels\parametre.ini :

    activeTab=1
    alwaysOnTop=0
    autoHangUpTime=0

    domain=mondomain
    maxConcurrentCalls=0
    cmdOutgoingCall=
    cmdIncomingCall=
    cmdCallRing=

    username=4765XXXX
    cmdCallAnswer=



    A l’intérieur de ce fichier, le nombre de ligne peut varié, cependant il y aura toujours ces 2 lignes :

    domain=mondomain
    username=4765XXXX

    Il faut que je trouve le moyen de supprimer ces lignes, pour les récrient à ma convenance, car ce qu'il y a a droite de = peut changer, mais je peux mettre ces valeur en dur dans le bat.

    Le mieux que j'ai trouvé, mais qui marche mal c'est ça :

    @echo off
    setlocal enabledelayedexpansion
     
    set "Chercher=Alpha"
    set "Remplacer=Beta"
     
    set FichierTexteAremplacer="C:\Users\toto\appdata\roaming\fichier.txt"
    set NouveauFichierTexte="C:\Users\toto\appdata\roaming\fichier_tmp.txt"
     
    for /f "tokens=1,* delims=¶" %%A in ( '"type !FichierTexteAremplacer!"') do (
    	SET string=%%A
    	SET modified=!string:%Chercher%=%Remplacer%!
    	echo !modified! >>%NouveauFichierTexte%
    )
    del !FichierTexteAremplacer!
    move !NouveauFichierTexte! !FichierTexteAremplacer!
    exit

    Mais il n'efface pas la ligne il récrit par dessus. Et n'y a t-il pas plus simple comme code ?

    Est ce que vous pouvez m'aider ?

    • Partager sur Facebook
    • Partager sur Twitter
      15 juillet 2020 à 12:26:13

      Bonjour,

      A ma connaissance il n'y a pas plus simple que parcourir le fichier ligne par ligne (boucle for) et modifier ce que tu souhaites via une ou plusieurs conditions en batch.

      Je ne comprend pas très bien ton problème quand tu indiques "Mais il n'efface pas la ligne il récrit par dessus", ce n'est pas ce que tu souhaites ? (changer les valeurs après le égale ?).

      Ceci devrait pouvoir t'aider (adapte le à tes besoins) :

      @echo off
      setlocal EnableDelayedExpansion
      echo.
      
      REM Fichier de configuration
      set file_tmp="provFile.ini"
      
      ::::::::::::: VARIABLE A MODIFIER :::::::::::::
      	REM Correspond au nom de fichier avec une ligne à modifier (laisser les guillemets)
      	set file="test.txt"
      
      	REM Correspond à la ligne recherchée (REGEX findstr; pas de guillemets)
      	set file_line_regex=domain=
      
      	REM Correspond à la nouvelle ligne (pas de guillemets)
      	set file_line_replace=domain=1234
      ::::::::::::: VARIABLE A MODIFIER :::::::::::::
      
      If not exist %file% (goto :file_notfound)
      If exist %file_tmp% (del /F /Q %file_tmp%)
      
      For /f "delims=" %%i in ('type %file%') do (
          set line="%%i"
      	echo !line! | findstr /RC:"!file_line_regex!" >nul
          If !errorlevel! EQU 1 (
              echo %%i>>%file_tmp%
          ) else (
              echo !file_line_replace!>>%file_tmp%
          )
      )
      
      del /F /Q %file%
      rename %file_tmp% %file%
      echo Modification termin‚e !
      goto :quit
      
      :file_notfound
      echo Le fichier %file% est introuvable ^^!
      
      :quit
      echo.
      pause>nul | echo Appuyez sur une touche pour quitter le script...
      exit
      



      -
      Edité par Zaibai 15 juillet 2020 à 12:30:16

      • Partager sur Facebook
      • Partager sur Twitter
        15 juillet 2020 à 12:53:00

        ok sa fonctionne.

        Si je souhaite modifier plusieurs lignes je fais plusieur boucle FOR ou il existe plus simple ?

        edit

        lorsque je met le fichier test.txt dans

        set file="C:\Users\dupond\AppData\Roaming\logiciel\test.txt"

        et que le script se trouve dans d:\, et plus au même niveau que test.txt

        il m'indique que la syntaxe n'est pas correct et me supprime mon fichier test.txt.

        -
        Edité par Deuvool 15 juillet 2020 à 12:58:14

        • Partager sur Facebook
        • Partager sur Twitter
          16 juillet 2020 à 11:29:21

          Bonjour,

          J'ai amélioré le script afin de :

          • Prendre en compte que le script.bat n'est pas forcément dans le même dossier/partition que le fichier à modifier.
          • Qu'il puisse faire de multiple regex (findstr) afin de voir si la ligne doit être modifié.

          Le code :

          @echo off
          setlocal EnableDelayedExpansion
          echo.
          
          REM Fichier de configuration
          set file_tmp=provFile.ini
          
          ::::::::::::: VARIABLE A MODIFIER :::::::::::::
          	REM Correspond à l'emplacement/chemin du fichier à modifier (/!\ Le nom de fichier ne doit pas être spécifié dans cette variable; pas de guillemets)
          	set path_file=C:\Users\dupond\AppData\Roaming\logiciel
          
          	REM Correspond au nom de fichier avec une ligne à modifier (pas de guillemets)
          	set file=test.txt
          
          	REM Correspond à la ligne recherchée 1 (REGEX findstr; pas de guillemets)
          	set file_line_regex[1]=domain=
          
          	REM Correspond à la nouvelle ligne 1 (pas de guillemets)
          	set file_line_replace[1]=domain=1234
          	
          	REM Correspond à la ligne recherchée 2 (REGEX findstr; pas de guillemets)
          	set file_line_regex[2]=username=
          
          	REM Correspond à la nouvelle ligne 2 (pas de guillemets)
          	set file_line_replace[2]=username=1234
          ::::::::::::: VARIABLE A MODIFIER :::::::::::::
          
          cd /D "%path_file%"
          If not exist "%file%" (goto :file_notfound)
          If exist "%file_tmp%" (del /F /Q "%file_tmp%")
          
          For /f "delims=" %%i in ('type "%file%"') do (
          	call :replace "%%i"
          )
          
          del /F /Q "%file%"
          rename "%file_tmp%" "%file%"
          echo Modification termin‚e !
          goto :quit
          
          :replace
          set line=%*
          set "b_replace=False"
          For /L %%j in (1,1,2) do (
          	echo !line! | findstr /RC:"!file_line_regex[%%j]!" >nul
          	If !errorlevel! EQU 0 (
          		set "b_replace=True"
          		echo !file_line_replace[%%j]!>>"%file_tmp%"
          	)
          )
          if "%b_replace%"=="False" (echo !line:~1,-1!>>"%file_tmp%")
          GOTO:EOF
          
          :file_notfound
          echo Le fichier "%file%" est introuvable ^^!
          
          :quit
          echo.
          pause>nul | echo Appuyez sur une touche pour quitter le script...
          exit
          



          • Partager sur Facebook
          • Partager sur Twitter
            17 juillet 2020 à 11:41:24

            ok sa fonctionne bien.

            Si j'ai bien compris, si l'on veut modifier plus de 2 lignes, il faut aussi changer le chiffre ligne 44 (1,1,2) en (1,1,7) si l'on veut modifier 7 lignes.

            Est ce que tu utilises un éditeur de batch ? si c'est le cas lequel ? car ce script est extrêmement propre.

            • Partager sur Facebook
            • Partager sur Twitter
              17 juillet 2020 à 13:14:05

              Si tu cherches 7 lignes différentes alors oui tu met (1,1,7) à la ligne 44 sans oublié de créer les variables file_line_regex[x] et file_line_replace[x] où x va donc de 1 à 7.

              J’utilise Notepad++ ;)

              • Partager sur Facebook
              • Partager sur Twitter

              [BATCH] modifier un fichier ini

              × 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