Boucle For

Fermé
poparnassus Messages postés 426 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 25 décembre 2019 - Modifié le 21 avril 2017 à 23:05
barnabe0057 Messages postés 14439 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 14 avril 2024 - 23 avril 2017 à 17:25
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


A voir également:

4 réponses

barnabe0057 Messages postés 14439 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 14 avril 2024 4 905
Modifié le 23 avril 2017 à 18:05
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
poparnassus Messages postés 426 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 25 décembre 2019 30
Modifié le 21 avril 2017 à 23:34
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
0
poparnassus Messages postés 426 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 25 décembre 2019 30
Modifié le 22 avril 2017 à 01:11
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 ?
0
barnabe0057 Messages postés 14439 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 14 avril 2024 4 905
Modifié le 22 avril 2017 à 08:42
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 ???
0
poparnassus Messages postés 426 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 25 décembre 2019 30
22 avril 2017 à 20:42
Au numero de ligne
0
barnabe0057 Messages postés 14439 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 14 avril 2024 4 905
Modifié le 22 avril 2017 à 22:52
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
0
poparnassus Messages postés 426 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 25 décembre 2019 30
Modifié le 23 avril 2017 à 13:13
Je comprends pas Le "POP", elle vient d(ou cette variable ?
0
barnabe0057 Messages postés 14439 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 14 avril 2024 4 905 > poparnassus Messages postés 426 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 25 décembre 2019
Modifié le 23 avril 2017 à 13:10
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
0
poparnassus Messages postés 426 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 25 décembre 2019 30
23 avril 2017 à 13:27
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...
0
barnabe0057 Messages postés 14439 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 14 avril 2024 4 905 > poparnassus Messages postés 426 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 25 décembre 2019
Modifié le 23 avril 2017 à 13:35
Je dois m'absenter je regarderai ça ce soir.

Est-ce que tu pourrais me donner le contenu du fichier !data_serial! ?
0
poparnassus Messages postés 426 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 25 décembre 2019 30
Modifié le 23 avril 2017 à 13:56
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;;;;;
0