Boucle For [Fermé]

Signaler
Messages postés
421
Date d'inscription
vendredi 28 mars 2014
Statut
Membre
Dernière intervention
25 décembre 2019
-
barnabe0057
Messages postés
12590
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
5 avril 2020
-
Salut Le peuple :-)

J'ai un petit probleme avec une boucle for en script batch:
je test le 1er token, si il est egale a OndNum, je passe tout les autre token en variable !data_serial! mais j'arrive pas a passer ma variable %%j à data_serial


echo Entree le numero d'onduleur :::RESPECTER LA CASSE 3 CHIFFRE "000"
set /P OndNum=":"
:ligne
 set /a boucle_ligne+=1
 for /f "tokens=1,* delims=;" %%i in ('findstr /n /r . "!ONDULEUR_SERIAL!"^| findstr "^^%boucle_ligne%:"') do (if %%i==!OndNum! set data_serial=%%j)
 echo data_serial: !data_serial!
 pause
 if !data_l!==!OndNum! goto End_RchOnd
 if !boucle_ligne!==!compt_OND_SERIAL! goto End_RchOnd
 goto ligne


4 réponses

Messages postés
12590
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
5 avril 2020
2 923
Essaie voir ça :

:_RchOnd
set OndNum=0
set compt_OND_SERIAL=0
for /f "delims=" %%i in ('type "!ONDULEUR_SERIAL!"') do set /a compt_OND_SERIAL+=1

cls
call :Plan_addressage
::Donne l'adresse d'un numéro d'onduleur
echo %compt_OND_SERIAL%
echo Entree "r" pour revenir en arriere:
echo Entree le numero d'onduleur:
set /P OndNum=":"
if /i !OndNum!==r goto affichage
if !OndNum!==0 goto _RchOnd
if !OndNum! GTR %compt_OND_SERIAL% goto _RchOnd

::Recherche les numero de series en fonction du num de l'onduleur
for /f "tokens=1,* delims=;" %%i in ('findstr /n /r . "!ONDULEUR_SERIAL!" ^| findstr "^^!OndNum!:"') do (set data=%%i) && (set data_serial=%%j)
goto part_4

:part_4
for /f "usebackq tokens=*" %%A in ("!data_serial!") do (
set ligne=%%A
set modif=!ligne:;;;;;;;;=;NONE;NONE;NONE;NONE;NONE;NONE;NONE;!
set modif=!modif:;;;;;;;=;NONE;NONE;NONE;NONE;NONE;NONE;!
set modif=!modif:;;;;;;=;NONE;NONE;NONE;NONE;NONE;!
set modif=!modif:;;;;;=;NONE;NONE;NONE;NONE;!
set modif=!modif:;;;;=;NONE;NONE;NONE;!
set modif=!modif:;;;=;NONE;NONE;!
set modif=!modif:;;=;NONE;!
echo !modif!

for /f "tokens=1,2,3,4,5,6,7,8 delims=;" %%a in ('echo !modif!') do (
if POP%%a==POP (set Partie_haute=NONE) else (set Partie_haute=%%a)
if POP%%b==POP (set Carte_Filtre_AC=NONE) else (set Carte_Filtre_AC=%%b)
if POP%%c==POP (set Carte_Relais=NONE) else (set Carte_Relais=%%c)
if POP%%d==POP (set Carte_Commande=NONE) else (set Carte_Commande=%%d)
if POP%%e==POP (set Nouvelle_Carte_Filtre_AC=NONE) else (set Nouvelle_Carte_Filtre_AC=%%e)
if POP%%f==POP (set Nouvelle_Carte_Commande=NONE) else (set Nouvelle_Carte_Commande=%%f)
if POP%%g==POP (set annotation=NONE) else (set annotation=%%g)
if POP%%h==POP (set Date_x=NONE) else (set Date_x=%%h)

if %%a==!OndNum! (call :End_RchOnd)
)
)

exit

:End_RchOnd
::RESULTAT, affichage des donnees.
color 0C
cls
call :Plan_addressage
echo.
echo RESULTAT:
echo Numero_Onduleur:"!OndNum!" ,Adresse:"OndAddr"
echo.
echo --------------------------------------------------------------------
echo SERIAL:
echo Partie_haute: "!Partie_haute!"
echo Carte_Filtre_AC: "!Carte_Filtre_AC!"
echo Carte_Relais: "!Carte_Relais!"
echo Carte_Commande: "!Carte_Commande!"
echo --------------------------------------------------------------------
echo.
echo --------------------------------------------------------------------
echo SERIAL NEW:
echo Nouvelle_Carte_Filtre_AC: "!Nouvelle_Carte_Filtre_AC!"
echo Nouvelle_Carte_Commande: "!Nouvelle_Carte_Commande!"
echo Date: "!Date_x!"
echo Annotation: "!annotation!"
echo --------------------------------------------------------------------
echo.
pause
goto :eof
rem
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 77265 internautes nous ont dit merci ce mois-ci

Messages postés
421
Date d'inscription
vendredi 28 mars 2014
Statut
Membre
Dernière intervention
25 décembre 2019
12
Du coup j'ai trouver je recupere bien mes deux valeur %%I %%J, par contre la condition ne marche pas ...

 :ligne
 set /a boucle_ligne+=1
 for /f "tokens=1,* delims=;" %%i in ('findstr /n /r . "!ONDULEUR_SERIAL!" ^| findstr "^^%boucle_ligne%:"') do (set data=%%i) && (set data_serial=%%j)

 echo data:!data! , data_serial:!data_serial!
 if /I !OndNum!==!data! (
 goto End_RchOnd
 )
 if !boucle_ligne!==!compt_OND_SERIAL! goto End_RchOnd
 goto ligne
poparnassus
Messages postés
421
Date d'inscription
vendredi 28 mars 2014
Statut
Membre
Dernière intervention
25 décembre 2019
12
Bon bon bon, Là j'ai un pb que j'arrive pas a resoudre

Mon fichier txt sur lequiel je travaille:
001;1516167704;1515111908;1515132948;1515118378;1641114884;;11/04/2017


echo Entree le numero d'onduleur:
set /P OndNum=":"

::Recherche les numero de series en fonction du num de l'onduleur
for /f "tokens=1,* delims=;" %%i in ('findstr /n /r . "!ONDULEUR_SERIAL!" ^| findstr "^^%OndNum%:"') do (set data=%%i) && (set data_serial=%%j)

set Partie_haute=NONE 
set Carte_Filtre_AC=NONE
set Carte_Relais=NONE
set Carte_Commande=NONE
set Nouvelle_Carte_Filtre_AC=NONE
set Nouvelle_Carte_Commande=NONE
set Date_x=NONE
set annotation=NONE

for /f "tokens=1,2,3,4,5,6,7,8 delims=;" %%a in ("!data_serial!") do (set Partie_haute=%%a) && (set Carte_Filtre_AC=%%b) && (set Carte_Relais=%%c) && (set Carte_Commande=%%d) && (set Nouvelle_Carte_Filtre_AC=%%e) && (set Nouvelle_Carte_Commande=%%f) && (set Date_x=%%g) && (set annotation=%%h)


LE RESULTAT:
Numero_Onduleur:"1" ,Adresse:"OndAddr"

SERIAL:
Partie_haute: "1516167704"
Carte_Filtre_AC: "1515111908"
Carte_Relais: "1515132948"
Carte_Commande: "1515118378"

SERIAL NEW:
Nouvelle_Carte_Filtre_AC: "1641114884"
Nouvelle_Carte_Commande: "11/04/2017"
Date: ""
Anootation: ""


MON PROBLEME:
Si je ne mets pas despace entre met jeton dans mon fichier text, il me decale ma ligne DATE sur Carte commande !! Cest pas bon du tout quelqun a une idee ?
Messages postés
12590
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
5 avril 2020
2 923
Bonjour,

Je ne comprend pas ta première boucle for, plus particulièrement ceci :

('findstr /n /r . "!ONDULEUR_SERIAL!" ^| findstr "^^%OndNum%:"')

A quelle chaîne de caractères fait référence le findstr ???
poparnassus
Messages postés
421
Date d'inscription
vendredi 28 mars 2014
Statut
Membre
Dernière intervention
25 décembre 2019
12
Au numero de ligne
Messages postés
12590
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
5 avril 2020
2 923
Je viens de tester avec succès ceci :

@echo off
color 0A
Setlocal enableextensions enabledelayedexpansion
cls

echo Entree le numero d'onduleur:
set /P OndNum=":"

:: Recherche les numero de series en fonction du num de l'onduleur
for /f "tokens=1,* delims=;" %%i in ('findstr /n /r . "!ONDULEUR_SERIAL!" ^| findstr "^^%OndNum%:"') do (set data=%%i) && (set data_serial=%%j)

for /f "tokens=*" %%A in ("!data_serial!") do (
set ligne=%%A
set modif=!ligne:;;;;;;;=;NONE;NONE;NONE;NONE;NONE;NONE;!
set modif=!modif:;;;;;;=;NONE;NONE;NONE;NONE;NONE;!
set modif=!modif:;;;;;=;NONE;NONE;NONE;NONE;!
set modif=!modif:;;;;=;NONE;NONE;NONE;!
set modif=!modif:;;;=;NONE;NONE;!
set modif=!modif:;;=;NONE;!

for /f "tokens=1,2,3,4,5,6,7,8 delims=;" %%a in ('echo !modif!') do (

if POP%%a==POP (set Partie_haute=NONE) else (set Partie_haute=%%a)
if POP%%b==POP (set Carte_Filtre_AC=NONE) else (set Carte_Filtre_AC=%%b)
if POP%%c==POP (set Carte_Relais=NONE) else (set Carte_Relais=%%c)
if POP%%d==POP (set Carte_Commande=NONE) else (set Carte_Commande=%%d)
if POP%%e==POP (set Nouvelle_Carte_Filtre_AC=NONE) else (set Nouvelle_Carte_Filtre_AC=%%e)
if POP%%f==POP (set Nouvelle_Carte_Commande=NONE) else (set Nouvelle_Carte_Commande=%%f)
if POP%%g==POP (set annotation=NONE) else (set annotation=%%g)
if POP%%h==POP (set Date_x=NONE) else (set Date_x=%%h)

echo.
echo Partie_haute = !Partie_haute!
echo Carte_Filtre_AC = !Carte_Filtre_AC!
echo Carte_Relais = !Carte_Relais!
echo Carte_Commande = !Carte_Commande!
echo Nouvelle_Carte_Filtre_AC = !Nouvelle_Carte_Filtre_AC!
echo Nouvelle_Carte_Commande = !Nouvelle_Carte_Commande!
echo annotation = !annotation!
echo Date_x = !Date_x!

echo. & pause

)
)

exit
poparnassus
Messages postés
421
Date d'inscription
vendredi 28 mars 2014
Statut
Membre
Dernière intervention
25 décembre 2019
12
Je comprends pas Le "POP", elle vient d(ou cette variable ?
barnabe0057
Messages postés
12590
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
5 avril 2020
2 923 > poparnassus
Messages postés
421
Date d'inscription
vendredi 28 mars 2014
Statut
Membre
Dernière intervention
25 décembre 2019

Ce n'est pas une variable, j'aurais pu mettre n'importe quel caractère à la place de POP, c'est un clin d'oeil à ton pseudo ;)

Je teste simplement si chaque token/variable est non nul, si c'est nul je définis ce token/variable à NONE
poparnassus
Messages postés
421
Date d'inscription
vendredi 28 mars 2014
Statut
Membre
Dernière intervention
25 décembre 2019
12
aah okk :-) mais ca marche pas:


:_RchOnd
set OndNum=0
set compt_OND_SERIAL=0
for /f "delims=" %%i in ('type "!ONDULEUR_SERIAL!"') do set /a compt_OND_SERIAL+=1

cls
call :Plan_addressage
::Donne l'adresse d'un numéro d'onduleur
echo %compt_OND_SERIAL%
echo Entree "r" pour revenir en arriere:
echo Entree le numero d'onduleur:
set /P OndNum=":"
if %OndNum%==r goto affichage
if %OndNum%==0 goto _RchOnd
if %OndNum% GTR %compt_OND_SERIAL% goto _RchOnd
::Recherche les numero de series en fonction du num de l'onduleur
for /f "tokens=1,* delims=;" %%i in ('findstr /n /r . "!ONDULEUR_SERIAL!" ^| findstr "^^%OndNum%:"') do (set data=%%i) && (set data_serial=%%j)
goto part_4

:part_4
for /f "tokens=*" %%A in ("!data_serial!") do (
set ligne=%%A
set modif=!ligne:;;;;;;;=;NONE;NONE;NONE;NONE;NONE;NONE;!
set modif=!modif:;;;;;;=;NONE;NONE;NONE;NONE;NONE;!
set modif=!modif:;;;;;=;NONE;NONE;NONE;NONE;!
set modif=!modif:;;;;=;NONE;NONE;NONE;!
set modif=!modif:;;;=;NONE;NONE;!
set modif=!modif:;;=;NONE;!
echo !modif!
pause

for /f "tokens=1,2,3,4,5,6,7,8 delims=;" %%a in ('echo !modif!') do (
if POP%%a==POP set Partie_haute=NONE else (set Partie_haute=%%a)
if POP%%b==POP set Carte_Filtre_AC=NONE else (set Carte_Filtre_AC=%%b)
if POP%%c==POP set Carte_Relais=NONE else (set Carte_Relais=%%c)
if POP%%d==POP set Carte_Commande=NONE else (set Carte_Commande=%%d)
if POP%%e==POP set Nouvelle_Carte_Filtre_AC=NONE else (set Nouvelle_Carte_Filtre_AC=%%e)
if POP%%f==POP set Nouvelle_Carte_Commande=NONE else (set Nouvelle_Carte_Commande=%%f)
if POP%%g==POP set annotation=NONE else (set annotation=%%g)
if POP%%h==POP set Date_x=NONE else (set Date_x=%%h)))
goto End_RchOnd

:End_RchOnd
::RESULTAT, affichage des donnees.
color 0C
cls
call :Plan_addressage
echo.
echo RESULTAT:
echo Numero_Onduleur:"!OndNum!" ,Adresse:"OndAddr"
echo.
echo --------------------------------------------------------------------
echo SERIAL:
echo Partie_haute: "%Partie_haute%"
echo Carte_Filtre_AC: "%Carte_Filtre_AC%"
echo Carte_Relais: "%Carte_Relais%"
echo Carte_Commande: "%Carte_Commande%"
echo --------------------------------------------------------------------
echo.
echo --------------------------------------------------------------------
echo SERIAL NEW:
echo Nouvelle_Carte_Filtre_AC: "%Nouvelle_Carte_Filtre_AC%"
echo Nouvelle_Carte_Commande: "%Nouvelle_Carte_Commande%"
echo Date: "%Date_x%"
echo Anootation: "%annotation%"
echo --------------------------------------------------------------------
pause
goto _RchOnd




::RESLUTAT

REM J'ai ajouter un echo !modif! pour voir, le resultat est bon, par contre dans la boucle suivante quelque chose ne va pas
:37
1516167680;1513937967;1513943931;1515134043;1640112089;NONE;18/04/2017;NONE;NONE;NONE;NONE;
Appuyez sur une touche pour continuer...

RESULTAT:
Numero_Onduleur:"37" ,Adresse:"OndAddr"

--------------------------------------------------------------------
SERIAL:
Partie_haute: ""
Carte_Filtre_AC: ""
Carte_Relais: ""
Carte_Commande: ""
--------------------------------------------------------------------

--------------------------------------------------------------------
SERIAL NEW:
Nouvelle_Carte_Filtre_AC: ""
Nouvelle_Carte_Commande: ""
Date: ""
Anootation: ""
--------------------------------------------------------------------
Appuyez sur une touche pour continuer...
barnabe0057
Messages postés
12590
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
5 avril 2020
2 923 > poparnassus
Messages postés
421
Date d'inscription
vendredi 28 mars 2014
Statut
Membre
Dernière intervention
25 décembre 2019

Je dois m'absenter je regarderai ça ce soir.

Est-ce que tu pourrais me donner le contenu du fichier !data_serial! ?
poparnassus
Messages postés
421
Date d'inscription
vendredi 28 mars 2014
Statut
Membre
Dernière intervention
25 décembre 2019
12
Voici une partie de son contenu !data_serial!

Je mets pas tout seulement les 9 premieres lignes


001;1516167704;1515111908;1515132948;1515118378;1641114884;;11/04/2017;;;;;
002;1516167696;1513955869;1515995665;1515134039;1641114886;;11/04/2017;;;;;
003;1516167687;1514967927;1516148214;1516147403;1641114908;;11/04/2017;;;;;
004;1516167672;1514967995;1515132990;1515118370;1641114861;;11/04/2017;;;;;
005;1614125482;Manquant;Manquant;Manquant;Manquant;;11/04/2017;;;;;
006;1516167698;1513955867;1515995663;1515134036;Manquant;;11/04/2017;;;;;
007;1516167684;1514968018;1516148211;1515134057;1640128472;;11/04/2017;;;;;
008;1516167708;1513955766;1515995727;1511838069;1641115376;;11/04/2017;;;;;
009;1516167682;1516167682;1513955743;1516148209;1515134061;1641115374;11/04/2017;;;;;