Boucle For

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. 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. 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
      1. 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 ?
    2. 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 ???
      1. Au numero de ligne
    3. 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
      1. Je comprends pas Le "POP", elle vient d(ou cette variable ?
      2. @poparnassusCe 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
      3. 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...
      4. @poparnassusJe dois m'absenter je regarderai ça ce soir.

        Est-ce que tu pourrais me donner le contenu du fichier !data_serial! ?
      5. 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;;;;;