Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Batch] Modifier fichiers dans des sous-dossiers

Sujet résolu
    25 septembre 2022 à 11:02:04

    Bonjour, j'ai trouvé se super script de Zaibai (un grand merci à lui ) :  https://openclassrooms.com/forum/sujet/batch-modifier-un-fichier-ini
    Cela m'a bien aider à faire des manipulations automatiques dans mes fichiers.
    J'ai remplacé dans le script   cd /D "%path_file%"  par   cd /d %~dp0  pour que le BAT soit avec le fichier.txt à modifier et cela marche parfaitement.
    Le problème est que j'ai environs une 50ène de sous-dossiers où est placé un fichier.txt . Aussi tous les fichier.txt ont le même nom, mais avec des contenus différents.
    Serait-il possible de modifier ce script pour qu'il modifie directement les fichier.txt dans les sous-dossiers?
    Comme cela je pourrais juste modifier les lignes à remplacer dans le BAT et exécuter le BAT une seule fois.
    J'ai essayé de modifier le script avec un For do mais cela dépasse mes connaissances très limitées.
    Merci d'avance de votre aide
    PS : j'ai eu un mal de chien pour le message ne soit pas considéré comme spam et je ne sais pas pourquoi.
    • Partager sur Facebook
    • Partager sur Twitter
      25 septembre 2022 à 20:45:43

      Salut !
      Et de rien pour le script ;)
      Peux-tu montrer les modifications que tu as effectué ?
      Si les fichiers ont des contenus différents, tu vas définir 50 variables pour la recherche de ligne et 50 variables pour le remplacement du contenu ? La modification est toujours à la même ligne ?
      Il faudrait à mon avis que tu fasse une boucle qui englobe la boucle de modification de contenu pour y sélectionner un fichier à chaque tour, un truc comme ça :
      @echo off
      setlocal EnableDelayedExpansion
      echo.
      
      REM Fichier de configuration
      set file_tmp=provFile.ini
      
      ::::::::::::: VARIABLE A MODIFIER :::::::::::::
      	REM Correspond à l'emplacement/chemin racine des fichiers à modifier (/!\ Le nom de fichier ne doit pas être spécifié dans cette variable; pas de guillemets)
      	set path_file=C:\Ton-Dossier-Racine
      	
      	REM Correspond au nom de fichier avec une ligne à modifier (pas de guillemets)
      	set file=test.txt
      
      	REM Correspond à la ligne recherchée (REGEX findstr; pas de guillemets)
      	set file_line_regex=APPLICATION v x.x.x (yyyy-mm-dd)
      
      	REM Correspond à la nouvelle ligne (pas de guillemets)
      	set file_line_replace=Ce Que Je Veux Mettre Pour Remplacer La Ligne
      ::::::::::::: VARIABLE A MODIFIER :::::::::::::
      
      cd /D "%path_file%"
      For /F "delims=" %%i in ('dir "%file%" /s /b 2^>nul') do (
      	set file_path="%%~dpi"
      	set file_found="%%i"
      	
      	For /f "delims=" %%j in ('type !file_found!') do (
      		set line="%%j"
      		echo !line! | findstr /RC:"!file_line_regex!" >nul
      		If !errorlevel! EQU 1 (
      			echo %%j>>!file_path!"%file_tmp%"
      		) else (
      			echo !file_line_replace!>>!file_path!"%file_tmp%"
      		)
      		
      	)
      	del /F /Q !file_found!
      	rename !file_path!"%file_tmp%" "%file%"
      	echo Modification de !file_found! termin‚e ^^!
      )
      goto :quit
      
      :quit
      echo.
      pause>nul | echo Appuyez sur une touche pour quitter le script...
      exit
      
      
      :End
      echo.
      echo Fin du script.
      pause
      exit
      

      -
      Edité par Zaibai 25 septembre 2022 à 20:51:55

      • Partager sur Facebook
      • Partager sur Twitter
        25 septembre 2022 à 23:42:47

        Bonsoir et merci Zaibai pour ton nouveau script, c'est une approche qui est très intéressante, puisque cela me permet de faire moins de 10 BAT!! Je me retrouve donc à faire un BAT par valeur à changer dans l'ensemble des fichiers. 

        Voici ton code dont je me suis servi. J'avais changé que la ligne du Path pour ne plus la changer pour chaque dossier où était placer le BAT. J'avais rentré que 5 valeurs juste pour voir et de comprendre que je devais faire ça pour tous mes dossiers. Maintenant avec ton nouveau code, je peux faire les 10 sur l'ensemble des dossiers, j'ai testé et c'est parfais!

        Merci Beaucoup.

        Gildas

        @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)
            Rem set path_file=
         
            REM Correspond au nom de fichier avec une ligne à modifier (pas de guillemets)
            set file=frequences.ini
         
            REM Correspond à la ligne recherchée 1 (REGEX findstr; pas de guillemets)
            set file_line_regex[1]= frequency : 0.1
         
            REM Correspond à la nouvelle ligne 1 (pas de guillemets)
            set file_line_replace[1]= frequency : 0.05 
             
            REM Correspond à la ligne recherchée 2 (REGEX findstr; pas de guillemets)
            set file_line_regex[2]= frequency : 0.4
         
            REM Correspond à la nouvelle ligne 2 (pas de guillemets)
            set file_line_replace[2]= frequency : 0.1 
        	
        	REM Correspond à la ligne recherchée 3 (REGEX findstr; pas de guillemets)
            set file_line_regex[3]= frequency : 0.5
         
            REM Correspond à la nouvelle ligne 3 (pas de guillemets)
            set file_line_replace[3]= frequency : 0.2 
        	
        	REM Correspond à la ligne recherchée 4 (REGEX findstr; pas de guillemets)
            set file_line_regex[4]= frequency : 0.7
         
            REM Correspond à la nouvelle ligne 4 (pas de guillemets)
            set file_line_replace[4]= frequency : 0.3 
        	
        	REM Correspond à la ligne recherchée 5 (REGEX findstr; pas de guillemets)
            set file_line_regex[5]= frequency : 1
         
            REM Correspond à la nouvelle ligne 5 (pas de guillemets)
            set file_line_replace[5]= frequency : 0.35 
        ::::::::::::: VARIABLE A MODIFIER :::::::::::::
         
            REM Version Original :
            REM cd /D "%path_file%"
        	
            REM Version Modifié OK :
            cd /d %~dp0
        	
        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 Modifications finies !
        goto :quit
         
        :replace
        set line=%*
        set "b_replace=False"
        For /L %%j in (1,1,5) 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

        [Batch] Modifier fichiers dans des sous-dossiers

        × 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