Signaler

Boucle For

Posez votre question poparnassus 368Messages postés vendredi 28 mars 2014Date d'inscription 20 mai 2017 Dernière intervention - Dernière réponse le 23 avril 2017 à 17:25 par barnabe0057
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


Afficher la suite 
Utile
+0
plus moins
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 368Messages postés vendredi 28 mars 2014Date d'inscription 20 mai 2017 Dernière intervention - 22 avril 2017 à 01:10
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 ?
Répondre
Donnez votre avis
Utile
+0
plus moins
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 368Messages postés vendredi 28 mars 2014Date d'inscription 20 mai 2017 Dernière intervention - 22 avril 2017 à 20:42
Au numero de ligne
Répondre
Donnez votre avis
Utile
+0
plus moins
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 368Messages postés vendredi 28 mars 2014Date d'inscription 20 mai 2017 Dernière intervention - 23 avril 2017 à 13:04
Je comprends pas Le "POP", elle vient d(ou cette variable ?
Répondre
barnabe0057 10298Messages postés lundi 2 mars 2009Date d'inscription 24 mai 2017 Dernière intervention - 23 avril 2017 à 13:08
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
Répondre
poparnassus 368Messages postés vendredi 28 mars 2014Date d'inscription 20 mai 2017 Dernière intervention - 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...
Répondre
barnabe0057 10298Messages postés lundi 2 mars 2009Date d'inscription 24 mai 2017 Dernière intervention - 23 avril 2017 à 13:34
Je dois m'absenter je regarderai ça ce soir.

Est-ce que tu pourrais me donner le contenu du fichier !data_serial! ?
Répondre
poparnassus 368Messages postés vendredi 28 mars 2014Date d'inscription 20 mai 2017 Dernière intervention - 23 avril 2017 à 13:49
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;;;;;
Répondre
Donnez votre avis
Utile
+0
plus moins
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
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !