Boucle For

poparnassus Messages postés 462 Statut Membre -  
barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   -
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

  1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
     
    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
  2. poparnassus Messages postés 462 Statut Membre 31
     
    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
    1. poparnassus Messages postés 462 Statut Membre 31
       
      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
  3. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
     
    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
    1. poparnassus Messages postés 462 Statut Membre 31
       
      Au numero de ligne
      0
  4. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
     
    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
    1. poparnassus Messages postés 462 Statut Membre 31
       
      Je comprends pas Le "POP", elle vient d(ou cette variable ?
      0
      1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930 > poparnassus Messages postés 462 Statut Membre
         
        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
    2. poparnassus Messages postés 462 Statut Membre 31
       
      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
      1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930 > poparnassus Messages postés 462 Statut Membre
         
        Je dois m'absenter je regarderai ça ce soir.

        Est-ce que tu pourrais me donner le contenu du fichier !data_serial! ?
        0
    3. poparnassus Messages postés 462 Statut Membre 31
       
      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