Batch : Probleme avec for /F

Résolu/Fermé
Utilisateur anonyme - 19 oct. 2010 à 18:37
cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 - 19 oct. 2010 à 23:40
Bonjour,

Voici un extrait de mon programme que je fais actuellement pour un besoin personnel.
Ce programme sert a changer de serveur en allant modifier un fichier nommé realmlist.wtf

Le problème que je rencontre se retrouve au niveau de la commande FOR /F

Explication : Lorsqu'un nouveau serveur est créer , les fichiers listeRealmlist.txt et listeServeurs.txt et nbServeurs.txt sont modifiés.
Si c'est la première fois qu'un serveur est créer il vient inscrire :
Liste des serveurs dans listeServeurs.txt et //Liste des realmlist dans listeRealmlist.txt

Lorsque le choix est effectué par l'utilisateur : une variable N est désigné selon le choix.
Cette variable N permettra de sauter des lignes dans mes fichiers listeServeurs.txt et listeRealmlist.txt .

J'utilise donc :
for /F "tokens=1 skip=%N% delims= " %%a IN (.\listeServeurs.txt) DO set nomChoisi=%%a

et

for /F "tokens=1 skip=%N% delims= " %%b IN (.\listeRealmlist.txt) DO set realChoisi=%%b

Mais à chaque fois , peu importe le choix , le serveur choisi est le dernier de la liste o_O
et donc à l'écran il vient inscrire le nom du dernier serveur et la realmlist dans mon fichier realmlist.wtf du dernier serveur.
Je suis novice en batch , j'ai donc surement des erreurs mais je n'arrive pas à trouvé où malgré des heures de recherches.

Sauriez vous m'aidez S.V.P ? Je vous remercie d'avance.

Si je n'ai pas assez explicite voici un extrait de mon programme pour mieux comprendre :

:launcher
for /F "tokens=1 skip=%N% delims= " %%a IN (.\listeServeurs.txt) DO set nomChoisi=%%a
for /F "tokens=1 skip=%N% delims= " %%b IN (.\listeRealmlist.txt) DO set realChoisi=%%b
echo Serveur choisi : %nomChoisi% - Realmlist : OK
echo %realChoisi% > .\Data\frFR\realmlist.wtf
pause
rmdir .\Cache\wdb /s /q
start .\Wow.exe
exit

:newServ
echo.
echo Inscrivez le nom de votre serveur.
set /p nom=
echo Iscrivez la realmlist du serveur.
set /p realmlist=
echo Nouveau serveur ajoute.
echo Nom du serveur : %nom%
echo Realmlist du serveur : %realmlist%
if %nbServeurs%==0 echo //Liste des realmlists > listeRealmlist.txt & echo Liste des serveurs > listeServeurs.txt
set /A nbServeurs=%nbServeurs%+1
echo %nbServeurs%.%nom% >> listeServeurs.txt
echo %realmlist% >> listeRealmlist.txt
echo %nbServeurs% > nbServeurs.txt
goto :menu


:choixServeurs
set /p choix=
if %choix%==0 goto :newServ
if %choix%==q exit
if %choix%==1 set /A N=1
if %choix%==2 set /A N=2
if %choix%==3 set /A N=3
goto launcher


SniperZeElite.

5 réponses

cchristian Messages postés 921 Date d'inscription lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
Modifié par cchristian le 19/10/2010 à 20:05
Bonsoir,

Avec une boucle FOR tu explores tous les enregistrements d'un même fichier, sauf ceux bien entendu qui sont sautés (si l'option SKIP n est codée). Pour chaque enregistrement accédé (lu) la séquence d'instructions (qui doit être entre parenthèse si il y a plusieurs instructions) codée après DO est éxécutée.

for /F "tokens=1 skip=%N% delims= " %%a IN (.\listeServeurs.txt) DO set nomChoisi=%%a
for /F "tokens=1 skip=%N% delims= " %%b IN (.\listeRealmlist.txt) DO set realChoisi=%%b

Il n'y a donc rien d'étonnant à ce que tu récupères systématiquement le contenu du dernier enregistrement à l'issue de chacune de tes boucles FOR.

Je vois les choses comme cela:
Il faut donc effectuer un test d'égalité entre N et une variable numérique initialisée avec la valeur de N et dont la valeur change à chaque itération, ceci pour ne localiser que l'enregistrement concerné:

rem pour test set /A N = 2
SET /A CPT_SKIP = N

FOR /F "tokens=1 skip=%N% delims= " %%I IN (.\listeServeurs.txt) DO (
IF !CPT_SKIP! EQU !N! ( set "nomChoisi=%%I" )
SET /A CPT_SKIP += 1 )

idem pour .\listeRealmlist.txt

Cordialement.
Cchristian.
1