Je me permets de me tourner vers vous pour m'aider à compléter mon code batch.
Avec celui-ci je souhaite tout simplement remplacer une ligne précise d'un fichier .txt tout en gardant les autres lignes intactes ! Sachant que ces dernières peuvent contenir des caractères spéciaux tel que : & é " etc..., ou bien contenir uniquement un espace ou encore être complètement vides !
A savoir que mon fichier "settings.txt" contient ceci pour le test et que la 6e ligne contient uniquement un espace :
1
2
AZERTY
azerty
&é"
0=^0
FINI
Voici un petit aperçu de mon code :
@echo off
setlocal enabledelayedexpansion
set fichier=settings.txt
set fichiertemp=settingstmp.txt
set lignearemplacer=2
for %%a in (%fichier%) do (
set lignescan=1
for /F "delims=" %%b in (%%a) do (
if "!lignescan!"=="1" (
if !lignescan! EQU !lignearemplacer! (echo YOUPI>%fichiertemp%) else (echo.%%b>%fichiertemp%)
) else (
if !lignescan! EQU !lignearemplacer! (echo YOUPI>>%fichiertemp%) else (echo.%%b>>%fichiertemp%)
)
set /a lignescan+=1
)
)
del /f settings.txt
ren settingstmp.txt settings.txt
pause
exit
Avec ce code, ça fonctionne bien, il suffit juste d'inscrire le numéro de la ligne à remplacer dans la variable "set lignearemplacer=" et le tour est joué. Seul problème, le programme ne retranscrit pas les lignes vides dans le fichier .txt généré !!
Et si j'utilise une autre approche de ce style :
for /F "delims=" %%b in ('findstr /n .* %%a') do (
Cela fonctionne très bien mais si j'intègre l'option tokens= pour récupérer uniquement le résultat après les 2 petits ponts comme ceci :
for /f "tokens=2 delims=:" %%b in ('findstr /n .* %%a')
la ligne vide disparaît de nouveau dans le nouveau fichier .txt...
Le code suivant fonctionne avec une ligne ayant un espace. Je n'ai pas trouvé comment avec une ligne vide.
@echo off setlocal enabledelayedexpansion set file=test.txt set line=1 for /f "tokens=*" %%l in ('type %file%') do ( if "!line!" == "3" ( echo hahaha ) else ( echo %%l ) set /a line=!line!+1 )
Le Tout est souvent plus grand que la somme de ses parties.
Dans un premier temps merci à vous 2 pour vos propositions !
En ce qui concerne d'ajouter la condition :
if "%%b"=="" (echo.>>%fichiertemp%)
J'ai déjà essayé mais sans succès... Du moins je n'ai pas réussi à intégrer une ligne vide dans un .txt avec cette commande (ou peut être que je m'y prend mal..) De plus j'ai un peu de mal à voir comment l'intégrer à mon code dans le cas présent. Si jamais tu repasses par là Zaibai, je suis à l'écoute de ton aide ainsi que tes propositions !
En ce qui concerne ton code PierrotLeFou, il ne respecte pas les espaces ni les lignes vides et indique "Commande echo désactivée" dans le fichier .txt. Mais à voir si jamais une idée me vient, pour l'instant il ne me permets pas de faire ce que je recherche mais merci à toi aussi d'avoir pris le temps d'écrire !!!
@echo off
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\XXX
REM Correspond au nom de fichier avec une ligne à modifier (pas de guillemets)
set file=settings.txt
REM Correspond à la ligne recherchée (numéro de ligne ; pas de guillemets)
set /a file_line_number=2
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%"
If not exist "%file%" (goto :file_notfound)
If exist "%file_tmp%" (del /F /Q "%file_tmp%")
(FOR /f "tokens=1* delims=:" %%a IN ('findstr /n "^" "%file%"') DO (
SET "Line=%%b"
IF %%a equ %file_line_number% SET "Line=%file_line_replace%"
setlocal EnableDelayedExpansion
ECHO(!Line!
endlocal
))>"%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
Une véritable merveille ton code !!! Je ne sais pas où tu as déniché ça ou si c'est toi qui l'as fait mais en tout cas c'est exactement ce qu'il me fallait ! T'es le meilleur !!!
Un immense merci pour tes recherches ainsi que le temps que tu m'as consacrer !!
Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.
Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre. En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.
Au lieu de déterrer un sujet il est préférable :
soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
soit de créer un nouveau sujet décrivant votre propre contexte
ne pas répondre à un déterrage et le signaler à la modération
Le Tout est souvent plus grand que la somme de ses parties.