Batch : Probleme avec for /F

Résolu
Utilisateur anonyme -  
cchristian Messages postés 921 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Membre Dernière intervention   131
 
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
cchristian Messages postés 921 Date d'inscription   Statut Membre Dernière intervention   131
 
Bonsoir,

As-tu mis en tête de ton programme:

rem (!....!) VOIR HELP SET expansion retardée de variables sous l'invite de
rem commandes (dernière page)
SETLOCAL ENABLEdelayedExpansion
SETLOCAL ENABLEextensions

dans le cas contraire ajoute ces lignes.

-------------------------------------------------------------------------
P.S 22h32
Je viens à nouveau de tester (chez moi: Windows XP Home) en intégrant cette fois la séquence :
:choixServeurs
set /p choix=
................
................
j'obtiens bien le résultat attendu.
Seuls changent, bien entendu, le nom et l'extansion du fichier. En ce qui me concerne je ne connais pas cette manière de coder un nom de fichier: (.\listeServeurs.txt).

Cordialement.
Cchristian.
1
Utilisateur anonyme
 
Bonjour ,

Tout d'abord merci de votre réponse.
Pour le code que vous m'avez donné , pour moi ca ne marche pas.
Je pense ne pas réussir à l'intégrer avec mon propre cas.

Car je remplace mes lignes :

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

que j'avais mis à la base avec le code que vous m'avez donné :

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 )

mais quand je lance et que je choisis 2 par exemple elle passe à la suite du code qui est :

echo Serveur choisi : %nomChoisi% - Realmlist : OK

et ne m'affiche rien comme nomChoisi.

Que dois je faire ?

Merci

SniperZeElite
0
Utilisateur anonyme
 
Un grand merci ! =D

Ca marche niquel ! Encore merci.

Cordialement SniperZeElite.
0

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

Posez votre question
cchristian Messages postés 921 Date d'inscription   Statut Membre Dernière intervention   131
 
Merci pour le retour, bon courage !
0