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

Scripts/Batch Discussion :

Difficulté avec boucles For imbriquées, perte de fonctionnalité [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre habitué
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Décembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2012
    Messages : 6
    Par défaut Difficulté avec boucles For imbriquées, perte de fonctionnalité
    Bonjour à tous,

    le contexte : pour aider des radiologues à transmettre à notre service une série de clichés numérisés nous leur adressons une clé USB cryptée dans laquelle se trouve une arborescence de sous-répertoires dont le 1er niveau d'arborescence est l'identifiant du patient et le 2e niveau un nom composé du type de cliché et de la date de réalisation (cette arborescence est crée par script VBA à partir d'un tableau Excel mais peu importe). Le problème que nous rencontrons est que lorsqu'il y a beaucoup de clichés, il est fréquent que quelques-uns soient oubliés. Pour cette raison je souhaiterais faire un petit batch placé dans la clé USB qui leur fournirait directement la liste des clichés manquants dans un fichier texte (en récupérant simplement la liste des sous-répertoires de 2e niveau vides).

    la difficulté:
    --> la syntaxe ci-dessous fonctionne bien pour compter le nombre de clichés dans un sous-répertoire de 2e niveau:
    Code batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for /r MonSousRepertoire %%j in (*.bmp,*.jpg,*.png,*.jpeg,*.raw,*.tiff) do set VrImage=%%j& set /a Compt+=1	
    echo Test : der image du dossier : %VrImage%
    echo Test : Nb fichiers img ds MonSousRepertoire = %Compt%
    pause
    :: si aucune radio dans RepertoireRX alors "Compt" est null et on intègre %%j au fichier de sortie
    If "%Compt%"=="" (
    	echo Radio absente : %%j >> Rx_Abstes2.txt
    )

    --> mais il faut bien générer une boucle itérative pour parcourir tous ces répertoires de 2e niveau (j'obtiens dans la 1ère partie du batch la liste de tous ces répertoires de 2e niveau dans le fichier texte "Liste_sous_dossiers_RX.txt").
    C'est dans l'imbrication des boucles que ça se gâte, alors que la syntaxe qui coince est la même que ci-dessus et que la variable contenant le chemin complet du sous-répertoire de 2e niveau est exacte:
    La ligne : for /r !RepertoireRX! %%j in (*.bmp,*.jpg,*.png,*.jpeg,*.raw,*.tiff) do set VrImage=%%j& set /a Compt+=1 ne déclenche pas d'erreur mais ne permet plus ni de compter le nombre de clichés présents ni de récupérer le nom du dernier cliché ...

    Code batch : 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
    setlocal enableDelayedExpansion 
    for /F %%D in (%CD%Liste_sous_dossiers_RX.txt) do (
    		:: creation d'une sous-boucle uniquement pour recuperer le sous-repertoire dans variable RepertoireRX
    		:: le tokens etoile et le délimiteur antislash permettent de récupérer le chemin complet
    		for /F "tokens=* delims=\" %%E in ("%%D") do (
    			set RepertoireRX=%%E
    			echo chemin répertoire récupéré  via sous-boucle For avec tokens = etoile : "!RepertoireRX!"
    				:: la boucle ci-dessous ne fonctionne pas quand elle est intégrée à une autre boucle ... serieux pb ...
    				for /r !RepertoireRX! %%j in (*.bmp,*.jpg,*.png,*.jpeg,*.raw,*.tiff) do set VrImage=%%j& set /a Compt+=1
    				echo Test : der image repertoire : %VrImage%                                         "-->ECHEC (sans déclenchement erreur ligne précédente) : VrImage est vide même si une radio est présente dans !RepertoireRX!"
    				echo Test : Le dossier !RepertoireRX! contient %Compt% fichiers radiographiques       " -->ECHEC : Compt est vide"
    				pause
    				:: si aucune radio dans RepertoireRX alors "Compt" est null et on intègre RepertoireRX au fichier de sortie
    				If "%Compt%"=="" (
    				echo Radio absente : !RepertoireRX! >> Rx_Abstes2.txt
    									)
    		)
    )
    endlocal

    C'est peut être tout bête (je suis totalement newbie en batch), en tout cas toute aide serait très bienvenue!

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur .NET en devenir
    Inscrit en
    Août 2017
    Messages
    549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET en devenir
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2017
    Messages : 549
    Par défaut
    Bonjour,

    Désolé j'ai beaucoup remodelé votre script.
    Pas besoin du fichier Liste_sous_dossiers_RX.txt le script va les lister et les traiter en même temps.

    Voilà ce que ça donne :

    Code batch : 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    @echo off
    ver | find "10.0." >nul && chcp 65001 >nul || chcp 28591 >nul
    setlocal enableDelayedExpansion
     
    :: la première boucle FOR liste tous les dossiers et sous-dossiers
    :: la deuxième boucle FOR déclenche le comptage des clichés uniquement pour les dossiers de 2ème niveau ou plus
     
    for /f "delims=" %%A in ('2^>nul dir /b /s /ad') do (
     
    	for /f "tokens=3 delims=\" %%E in ("%%~dpnxA") do if not "%%E"=="" (call :comptage "%%~dpnxA")
     
    )
     
    echo. & pause
    exit
     
    :: la fonction nommée "comptage" totalise les fichiers appartenant au dossier reçu en paramètre
     
    :comptage
     
    pushd %1
     
    set Compt=0
    for %%j in (*.bmp *.jpg *.png *.jpeg *.raw *.tiff) do set VrImage=%%j & set /a Compt+=1
     
    popd
     
    if %Compt% GTR 0 (echo. & echo Test : Le dossier %~1 contient %Compt% fichiers radiographiques)
    if %Compt% EQU 0 (echo Radio absente : %~1 >>Rx_Abstes2.txt) else (echo Test : dern. image répertoire : %VrImage%)
     
    goto :eof

    ps : le script est à placer à la racine de la clé usb

  3. #3
    Membre habitué
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Décembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2012
    Messages : 6
    Par défaut impressionnant
    @ Barnabe0057 :
    déjà un immense merci d'avoir pris ce temps pour recoder entièrement la démarche, je suis toujours bluffé de voir que des super-pros tendent à ce point la main aux débutants coincés à mi-paroi!
    D'ailleurs, pour continuer l'analogie avec la montagne, j'ai l'impression d'être parti pour un petit trek sur la colline d'en face et d'avoir été soudain téléporté sur la chaine Himalayenne (en tongues et T-Shirt!) *:ô).
    Le script marche super bien, avec un code très structuré et condensé qui m'impressionne beaucoup, mais je suis très sérieusement largué sur de nombreux points; je vais donc essayer de mieux le comprendre et si je n'y parviens pas sur certains aspects je vous demanderai peut-être la traduction car il me parait difficile de diffuser un script que je serai incapable d'adapter ou de déboguer.
    Reconnaissance ++,
    Eric

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur .NET en devenir
    Inscrit en
    Août 2017
    Messages
    549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET en devenir
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2017
    Messages : 549
    Par défaut
    J'espère que la descente de l'Himalaya se passera bien ;-)

    Je suis à votre disposition si vous avez des questions à formuler ou bien des choses à améliorer.

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

Discussions similaires

  1. [XL-2016] Difficultés avec boucles imbriquées
    Par WalTT dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/07/2024, 13h46
  2. [Batch] Boucle FOR imbriquée ? comparaison du contenu d'un fichier avec un autre.
    Par Ry0_Saeba dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 17/01/2019, 14h49
  3. Réponses: 12
    Dernier message: 31/10/2018, 14h43
  4. problème avec n boucles FOR imbriquées
    Par neopi21 dans le forum Général Java
    Réponses: 9
    Dernier message: 09/06/2009, 10h36
  5. [Syntaxe] Boucle For imbriquées en 1.5
    Par Piolet dans le forum Langage
    Réponses: 5
    Dernier message: 09/01/2005, 00h49

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