IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

[batch] double boucle for


Sujet :

Windows

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut [batch] double boucle for
    Bonjour à tous,

    Je suis un p'tit nouveau sur le forum !


    Je viens de démarrer la programmation batch, et je coince sérieux sur un problême incompréhensible :

    Mon objectif est de modifier des tags dans une liste de fichiers DICOM
    J'utilise pour cela des executables qui me permettent des les éditer via la console.

    voilà le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    set D=1000
    for %%f in (*.dcm) do (
    
    for /f "delims=" %%a in ('dcmdump.exe +P "0010,0010" %%f ^|tr -s " " ";"  ^|cut -d ";" -f 3 ^| tr -d [] ^| cut -d "_" -f 2') do (
            set M=%%a
            )
    
    for /f "delims=" %%a in ('dcmdump.exe +P "0010,0020" %%f ^|tr -s " " ";"  ^|cut -d ";" -f 3 ^| tr -d [] ^| cut -d "_" -f 3') do (
            set F=%%a
            )
    
    dcmodify.exe -m "(0010,0010)=%D%_%M%_%F%" %%f
    dcmodify.exe -m "(0010,0020)=%D%_%M%_%F%" %%f
    )
    Explication :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dcmdump.exe +P "0010,0010" %%f ^|tr -s " " ";"  ^|cut -d ";" -f 3 ^| tr -d [] ^| cut -d "_" -f 2
    Cette ligne me renvoie 4 chiffres. Cette commande fonctionne sans souci (la suivante également, c'est juste l'ID du tag qui change)

    Ces 4 chiffres je les stocke respectivement dans les variables M et F :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for /f "delims=" %%a in ('dcmdump.exe +P "0010,0010" %%f ^|tr -s " " ";"  ^|cut -d ";" -f 3 ^| tr -d [] ^| cut -d "_" -f 2') do (
            set M=%%a
            )
    
    for /f "delims=" %%a in ('dcmdump.exe +P "0010,0020" %%f ^|tr -s " " ";"  ^|cut -d ";" -f 3 ^| tr -d [] ^| cut -d "_" -f 3') do (
            set F=%%a
            )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dcmodify.exe -m "(0010,0010)=%D%_%M%_%F%" %%f
    dcmodify.exe -m "(0010,0020)=%D%_%M%_%F%" %%f
    Jusque là ça fonctionne quand je le fais un à un.

    Là ou ça coince, c'est quand je veux qu'il me le fasse pour chaque fichier (sachant que chaque fois il doit récupérer un tag unique pour M et F). D est fixe du début à la fin. Je fais donc une double boucle for et voilà ce que me crache la console avec 2 fichiers DICOM (extension .dcm)

    http://imageshack-france.com/show.ph...batch.JPG.html


    Les variables M et F ne sont pas remplacé tout de suite ! Il m'execute d'abord la boucle sans prendre en compte les variables

    concretement j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dcmodify.exe -m "(0010,0010)=1000__" %%f
    au lieu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dcmodify.exe -m "(0010,0010)=1000_XXXXX_XXXXX" %%f


    une bonne âme serait la bienvenue ! je suis sec ! Je comprends pas...

    merci d'avance

    EDIT : je viens de rerevérifier : chacune des commandes fonctionnent ! là ou ça coince c'est quand je fais une nouvelle boucle "for" (pour la liste des fichiers) contenant donc les autres "for"

    EDIT 2 : je viens de remarquer un truc encore plus bizarre : si j'ai 2 fichiers DICOM, la boucle est éxecutée 3 fois ! si j'ai 3 fichiers DICOM la boucle est executée 4 fois etc..... pourquoi ?

  2. #2
    Débutant  
    Avatar de koKoTis
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 438
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 438
    Points : 2 415
    Points
    2 415
    Par défaut
    déja quand tu fait des long script fait plutit des batch (.bat)

    essaue comme ca pour voir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for /f "delims=" %%a in ('dcmdump.exe +P "0010,0010" %%f ^|tr -s " " ";"  ^|cut -d ";" -f 3 ^| tr -d [] ^| cut -d "_" -f 2') do (
            echo %%a
            )
    
    for /f "delims=" %%a in ('dcmdump.exe +P "0010,0020" %%f ^|tr -s " " ";"  ^|cut -d ";" -f 3 ^| tr -d [] ^| cut -d "_" -f 3') do (
            echo %%a
            )
    et fait moi une capture du résultat

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    hello

    mais c'est un script batch ! (extension .bat)

    voilà le script avec les modifs. J'ai aussi rajouté qq délimiteurs pour mieux voir les boucles

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    set D=1000
    @echo --------------------------------------------------------------------------------
    @echo --------------------------------------------------------------------------------
    @echo --------------------------------------------------------------------------------
    
    for %%f in (2222*) do (
    for /f "delims=" %%a in ('dcmdump.exe +P "0010,0010" %%f ^|tr -s " " ";"  ^|cut -d ";" -f 3 ^| tr -d [] ^| cut -d "_" -f 2') do echo M=%%a
    for /f "delims=" %%a in ('dcmdump.exe +P "0010,0020" %%f ^|tr -s " " ";"  ^|cut -d ";" -f 3 ^| tr -d [] ^| cut -d "_" -f 3') do echo F=%%a
    dcmodify.exe -m "(0010,0010)=%D%_%M%_%F%" %%f
    dcmodify.exe -m "(0010,0020)=%D%_%M%_%F%" %%f
    @echo --------------------------------------------------------------------------------
    @echo --------------------------------------------------------------------------------
    @echo --------------------------------------------------------------------------------
    )

    sortie d'écran :

    http://imageshack-france.com/show.ph...atch2.JPG.html


    j'ai l'impression qu'il ignore la commande "echo" (comme "set" d'ailleurs) dans la boucle. Une fois en dehors de la boucle, il exécute ce qu'il y avait à l'intérieur...

  4. #4
    Débutant  
    Avatar de koKoTis
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 438
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 438
    Points : 2 415
    Points
    2 415
    Par défaut
    les echo fonctionne parfaitement

    les boucle font deux tours déja, il faut savoir si tu veut récupérer se qu'elles affichent en premier ou en deuxiéme


    je ne connait pas tes commande dcmdump.exe dcmodify.exe -m

    la dessus je peut rien te dire

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    pour les commandes, voilà un exemple de sortie :

    http://imageshack-france.com/show.ph...atch3.JPG.html

    les boucle font deux tours déja, il faut savoir si tu veut récupérer se qu'elles affichent en premier ou en deuxiéme
    Je comprends pas trop ce que tu veux dire.....

    voilà ce que le programme doit faire :

    => soit D = 1000
    => pour tout les fichiers du repertoire courant se terminant par .dcm
    => récupérer dans le tag 0010,0010 du fichiers courant les chiffres du milieu donné par la sortie de dcmdump.exe et stocker la sortie dans M (pour milieu)
    => de même avec le tag 0010,0020 => stocker dans F (pour fin)
    => modifier le tag 0010,0010 du fichier courant avec les valeurs de 1000_%M%_%F%
    => de meme mais pour le tag 0010,0020

    concretement si tu regardes la capture précédente, je t'ai renvoyé la sortie "brut" de dcmdump.exe.... les numéros entre [] m'interesse et mon objectif c'est de changer uniquement les 4 1er chiffres de tout les fichiers (sachant que les autres chiffres sont uniques pour chaque fichiers)


    une idée ?

  6. #6
    Débutant  
    Avatar de koKoTis
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 438
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 438
    Points : 2 415
    Points
    2 415
    Par défaut
    le je peut pas t'aider

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    je viens de rerelire ton post

    en fait oui les "echo" fonctionne bien. C'est justement leurs valeurs que je souhaite "intégré" dans dcmodify.exe !!

    pourquoi n'as-t-il pas remplacé les variables dans dcmodify.exe ? c'est juste ça qui me bloque, si j'ai la solution j'ai fini !

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    je comprends pas !
    j'ai légèrement modifié le script (j'ai remis le "set", suivi d'un echo")

    Voilà la sortie avec un seul fichier...

    http://imageshack-france.com/show.ph...atch4.JPG.html


    voilà le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    set D=1000
    @echo --------------------------------------------------------------------------------
    @echo --------------------------------------------------------------------------------
    @echo --------------------------------------------------------------------------------
    
    for %%f in (2222*) do (
    for /f "delims=" %%a in ('dcmdump.exe +P "0010,0010" %%f ^|tr -s " " ";"  ^|cut -d ";" -f 3 ^| tr -d [] ^| cut -d "_" -f 2') do (
                 set M=%%a
                 echo %M%)
                 
    for /f "delims=" %%a in ('dcmdump.exe +P "0010,0020" %%f ^|tr -s " " ";"  ^|cut -d ";" -f 3 ^| tr -d [] ^| cut -d "_" -f 3') do (
                 set F=%%a
                 echo %F%
                 )
    dcmodify.exe -m "(0010,0010)=%D%_%M%_%F%" %%f
    dcmodify.exe -m "(0010,0020)=%D%_%M%_%F%" %%f
    @echo --------------------------------------------------------------------------------
    @echo --------------------------------------------------------------------------------
    @echo --------------------------------------------------------------------------------
    )

    autre remarque qui peut servir :

    si je relance la commande dans la même console, vu que les variables existent toujours, les valeurs sont bien remplacées dans dcmodify.exe ! (mais ce sont toujours les mêmes quelque que soit le fichier de la boucle qui, je le rappelle, à une ID unique)

  9. #9
    Débutant  
    Avatar de koKoTis
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 438
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 438
    Points : 2 415
    Points
    2 415
    Par défaut
    tu ne peut pas afficher une variable que tu créer dans une bouclen dans cette même boucle a moin d'activer l'expension retader des variable

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    voilà qui est interessant !

    un chti peu plus de détails please ? (j'en ai encore jamais entendu parlé de ce truc là...)

  11. #11
    Débutant  
    Avatar de koKoTis
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 438
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 438
    Points : 2 415
    Points
    2 415
    Par défaut
    comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    set D=1000
    @echo --------------------------------------------------------------------------------
    @echo --------------------------------------------------------------------------------
    @echo --------------------------------------------------------------------------------
    setlocal enableDelayedExpansion 
    
    for %%f in (2222*) do (
    for /f "delims=" %%a in ('dcmdump.exe +P "0010,0010" %%f ^|tr -s " " ";"  ^|cut -d ";" -f 3 ^| tr -d [] ^| cut -d "_" -f 2') do (
                 set M=%%a
                 echo !M!)
                 
    for /f "delims=" %%a in ('dcmdump.exe +P "0010,0020" %%f ^|tr -s " " ";"  ^|cut -d ";" -f 3 ^| tr -d [] ^| cut -d "_" -f 3') do (
                 set F=%%a
                 echo !F!
                 )
    dcmodify.exe -m "(0010,0010)=%D%_%M%_%F%" %%f
    dcmodify.exe -m "(0010,0020)=%D%_%M%_%F%" %%f
    
    endlocal

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    ok merci, je viens justement de lire qq petits trucs dessus


    je vais faire l'essai tout à l'heure


    merci encore !

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    hé ben malheuresement le résultat est identique....


    je commence à croire que je n'y arriverais jamais, sauf en repartant à 0 et surtout pas en batch.... c'est la misère

    sachant en plus que mon éventail de language est limité à quelque connaissance de base en C, je sens que j'ai pas encore fini pfff


    EDIT : j'ai rien dit ! ça fonctionne parfaitement (j'avais oublié de remplacer les "%" par des "!"


    merci beaucoup pour le coup de main !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Double boucle for
    Par Goliw dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 19/05/2011, 08h16
  2. doubles boucles for
    Par tpscience dans le forum MATLAB
    Réponses: 7
    Dernier message: 26/04/2009, 19h38
  3. Sortir d'une double boucle FOR-END
    Par azboul dans le forum MATLAB
    Réponses: 4
    Dernier message: 05/12/2007, 11h07
  4. Batch - Deux boucle For imbriquées plus un FC
    Par Lorponos dans le forum Windows
    Réponses: 17
    Dernier message: 27/07/2006, 14h58
  5. [Debutant] Batch et Boucle for
    Par ludovic.fernandez dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 06/05/2004, 19h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo