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 :

Inception de boucles for (ou pas ?) [Batch]


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 13
    Par défaut Inception de boucles for (ou pas ?)
    Bonjour à tous,

    J’ai un petit problème de batch : j’aimerais que tous les fichiers d’un dossier soient répartis en fonction de leur nom. Tous les fichiers ont un nom sur un même modèle : 00-AB-ACTION. Les deux premiers chiffres correspondent à l’identifiant du dossier, les deux lettres, au nom du propriétaire et la dernière partie, c’est le type de dossier.

    L’arborescence du dossier d’archive est la suivante : identifiant-[deux lettres qui peuvent changer] \ propriétaire \ type de dossier.

    Comme je ne suis pas sûr d’être clair dans mes explications, un exemple :

    Il faudrait que le fichier "018-LOUIS-Voiture bleue.pdf" aille se ranger dans le sous-dossier : 000-099\018-WV\018-LOUIS\ACHAT (sachant que mon dossier 018-WV contient un sous dossier 018-LOUIS, 018-AGATHE, 018-TRUNKS, et que chacun contient un sous-dossier ACHAT, VENTE, LOCATION, etc.), et ce, pour chaque fichier de mon dossier « Courrier entrant ».

    J’ai réussi à faire un batch pour ouvrir un dossier en particulier avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    set /p "a= Quel dossier ouvrir ?"
    
    for /d %%a in (
      "\\DossierReseau\%a:~0,1%00-%a:~0,1%99\%a%-*"
    ) do set "fichierArchive=%%~fa"
    
    explorer %fichierArchive%
    
    GOTO eof
    Ca me fait déjà gagner pas mal de temps, mais pour passer à l’étape supérieure, j’avoue que je suis un peu paumé ! Intuitivement, il me semble qu’il y a quelque chose à chercher du côté des boucles, mais j’ai du mal à y parvenir. Quelque chose comme « pour chaque fichier, voir de quel type il s’agit [il n’y en a pas énormément de possibles], aller dans le sous-dossier de l’identifiant, puis du propriétaire, et le déplacer dans le sous-dossier correspondant »… sauf que j’ai beaucoup de mal à transposer ça en code (et peut-être que je fais juste fausse route et que vous avez de meilleures idées). Juste pour voir si j’arrivais à extraire la valeur de l’identifiant, j’ai tenté un début avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     @echo off
    for %%z in (*.pdf) do (
    echo %%z
    set i=%z:~0,2%
    echo %i%
    )
    pause
    GOTO eof
    Mais déjà rien que là, je bloque :’(

    Si une âme charitable passe par là, je lui serai éternellement reconnaissant ! Toute piste sera la bienvenue !

  2. #2
    Membre Expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Par défaut
    salut,

    pour simplifier je te conseil l'utilisation do for /f avec l'expansion retardée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @echo off
    
    setlocal enabledelayedexpansion
    
    for /f "tokens=1,2 delims=-" %%a in ('dir /b /a-d *.pdf') do (
        set "id=%%a"
        set "nom=%%b"
        echo !id!
        echo !nom!
    )
    Pour le reste essaye d'être un peu plus clair ! Pour que l'on comprenne ta structure de repertoire :

    Le 018 sera toujours VW ? par exemple !


  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 13
    Par défaut
    Super, merci beaucoup ! Je vais tester ça tout à l'heure (et essayer deux trois autres trucs, je ferai un update si ça donne quelque chose).

    Chaque identifiant est unique, mais il peut y avoir de petites blagues au milieu avec des identifiants qui ne font pas la même longueur, comportent des chiffres/lettres en plus, etc. Par exemple, le 018 sera toujours 018-VW, mais il peut y avoir un 018-20-RD en plus, ou 018-X-KA, voire même un 018-20-X-HD. Si je pouvais, je simplifierais plutôt l'arborescence, malheureusement c'est impossible Par contre, les deux ou trois lettres du propriétaire sont limitées à une dizaine voire vingtaine.

    Je pense que je vais déjà tester aujourd'hui de voir si j'arrive à trouver une méthode pour récupérer à partir du nom du fichier :
    - dans une variable, les deux ou trois lettres du propriétaire ;
    - dans une autre, l'identifiant sans les lettres finales.
    - boucler pour afficher le nom de chaque fichier du dossier.

    Je pense que si déjà j'en arrive là, le reste doit pouvoir se régler avec des IF assez facilement (mais peut-être que je me plante lourdement, on verra).

    Je remets un exemple, j'ai conscience que l'organisation de base est un peu bordélique, malheureusement je dois composer avec :
    A partir du fichier : 426-AG-LOCATION.PDF, je dois le ranger dans 400-499\426-00-XL\426-AG\426-AG-DOCUMENTS OFFICIELS

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 13
    Par défaut
    Bon, j'avais testé ça de mon côté :
    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
    @echo off
    setlocal enabledelayedexpansion
    for %%n in (*.pdf) do (
    	set identif=%%n
    	set p=PROPRIO
    	set i=ID
    	echo %%n 
    	echo %%n | find "-AG-" > nul && set p=AG
    	echo %%n | find "-LS-" > nul && set p=LS
    	echo Proprio : !p!
    	
    	echo %%n | find "-!p!-" > nul && set i=!identif:~0,4!
    	echo Identifiant est : !i!
    	)
    pause
    exit
    Ca fonctionne pour les dossiers "simples", mais du coup, ça ne marche pas pour toutes les exceptions (les dossiers du type 1234-10-AG). J'ai essayé un peu par tous les bouts de faire fonctionner le FOR /f, mais j'avoue que j'ai du mal. L'idéal serait de pouvoir utiliser la variable p en tant que séparateur (ou plutôt -%p%-) et de mettre tout ce qui est à gauche dans une variable "identifiant" et tout ce qui est à droite dans une variable "action". A partir de là, ça devrait être bon (enfin j'espère ! ).

    Sinon, l'alternative testée (mais échouée, et qui de toute façon serait moins pratique) était d'utiliser les expressions régulières pour savoir sous quelle forme était l'identifiant afin de le récupérer. Par exemple : if ????-??-*, prendre les 4 premiers caractères. if ????-?-??-*, les 6 premiers caractères. if ????-??-?-??-*, les 9 premiers. Mais il me resterait encore le problème d'obtenir les caractères à droite de l'identifiant.

    A nouveau, si quelqu'un a une idée (ou besoin de plus de précisions), je suis preneur !

    NB/ La solution donnée plus haut marche bien, mais idem, seulement pour les fichiers avec seulement IIII-PP-AAAAAA. Je galère toujours pour les autres, mais c'est déjà un gros pas en avant, merci !
    NB2/ Réflexion faite, je pourrais modifier le nom des fichiers avant modification en remplaçant les - de l'ID par un autre symbole (genre un truc qui n'est pas du tout utilisé, comme £) puis quand je commence à traiter chaque fichier, remplacer tous les £ par des -. Faut juste que je trouve comment mais les cas devraient être assez limités pour que ça soit jouable... Enfin ça alourdit bien, donc si vous avez une technique plus efficace, je prends ! En tout cas, je commence à approcher de quelque chose de fonctionnel, donc un grand merci !
    NB3/ La nuit porte conseil : si je prends le problème à l'envers, ça devrait marcher (à confirmer) : je vais changer le nom des fichiers en amont en remplaçant par un £ les - autour du nom du propriétaire (comme ils ne sont pas nombreux, ça devrait le faire), puis quand je fais le for /f, je remets le tout en ordre. Comme c'est l'élément le plus facile à identifier et à modifier, je devrais obtenir un découpage propre avec les tokens, et je n'aurais plus qu'à appliquer les différentes réorientations avec des IF. Je pense qu'il y a plus propre, mais mon but est surtout que ça fonctionne au final ! Je ferai un update (et je mettrai ça en résolu si ça se passe bien).

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 13
    Par défaut
    Après un peu de bricolage, ça a l'air de fonctionner. Je fais une première boucle FOR qui renomme le fichier en mettant des symboles $ aux endroits stratégiques, puis je découpe avec une seconde boucle qui renomme à la volée les fichiers pour rétablir les -. Encore une fois, il y a sans doute plus simple, mais au moins j'arrive au résultat escompté ! Pour plus de clarté, si je bloque à un autre endroit du projet, j'ouvrirai un autre topic.

    Merci !

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

Discussions similaires

  1. Boucle for avec pas irrégulier
    Par Hammid11 dans le forum MATLAB
    Réponses: 8
    Dernier message: 26/05/2015, 09h50
  2. Parcourir une boucle for par pas différent de 1
    Par balix dans le forum Général Python
    Réponses: 4
    Dernier message: 17/05/2014, 14h00
  3. Boucle for ne marche pas
    Par ironzorg dans le forum SDL
    Réponses: 8
    Dernier message: 24/06/2007, 13h22
  4. boucle for qui ne marche pas
    Par Invité dans le forum Langage
    Réponses: 16
    Dernier message: 12/06/2006, 10h59
  5. [langage] boucle "for" modification du pas
    Par K-ZimiR dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2004, 11h54

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