Supprimer une section dans un fichier - .bat

Résolu/Fermé
pilotepro - Modifié par pilotepro le 5/09/2011 à 17:55
 pilotepro - 21 sept. 2011 à 22:08
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
A voir également:

14 réponses

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
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
je regarde ça demain.
Promis...
0
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
merde j'ai fair une erreur, il faut remplacer:
if %%i leq 6 (
par
if %%i leq %derniere_ligne_a_garder% (
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
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
Bonjour,
UP S'il vous plait.

Cordialement
Pilotepro
0
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
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
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
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
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
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
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