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 :

[Batch] Copie de fichiers en fonction d'une partie du nom de fichier


Sujet :

Scripts/Batch

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 16
    Points : 12
    Points
    12
    Par défaut [Batch] Copie de fichiers en fonction d'une partie du nom de fichier
    Bonjour,

    Je suis débutant dans les scripts batch et votre aide me serait très utile.
    J'ai actuellement dans l'entreprise où je travaille une tâche répétitive à effectuer tout les matins.

    Je m'explique :

    Je reçois une archive compressée contenant plusieurs fichiers .pdf que j'extrais dans un dossier.
    Ces fichiers extraits ont tous un nom identique : Toto100.pdf, Toto200.pdf, etc...

    Ce que je souhaite c'est créer un script batch me permettant de copier les fichiers dans 2 dossiers différents, ceci en fonction de leur nom.
    Les fichiers comportant un nom entre 100 et 200 devraient être copiés dans le sous-dossier Toto1 et le reste dans le dossier Toto2.

    J'ai actuellement déjà fait quelques recherches et ai trouvé un script me permettant de supprimer les espaces dans les noms de fichiers. J'ai également pu me renseigner sur la fonction "Xcopy" qui me permettrait de copier les fichiers. Cependant je ne trouve rien sur comment définir les plages de nombres sur lesquelles il devra copier dans tel ou tel dossier, et comment appliquer ces plages de nombres à la fonction xcopy sur une partie du nom du fichier.


    J'espère avoir été explicite et reste à disposition pour toutes questions.



    EDIT
    Résultat :

    Code Final pour remplir le fichier contenant la liste à comparer :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    For /L %%N IN (1000,1,2999) Do echo %%N >> listeET.txt
    For /L %%N IN (7700,1,8500) Do echo %%N >> listeET.txt
    Code Final pour copier les fichiers en fonction d'une partie de leur nom :

    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
    setlocal enabledelayedexpansion
    @echo off
    for /r "c:\toto" %%i in (*.pdf) do (
    set chemin_complet=%%~fi
    set nom_extention=%%~nxi
    for /f "tokens=1,2,3,4 delims=_" %%i in ("!nom_extention!") do (
    set p1=%%i
    set p2=%%j
    set p3=%%k
    set p4=%%l
    set p5=!p1:~3!
    set etat=0
    for /f "tokens=*" %%i in ('type "C:\toto\listeET.txt" ^| find "!p5!"') do set etat=1
    if  !p5! LSS 1000 set etat=0
    if "!etat!"=="1" move "!chemin_complet!" "c:\toto\ETE"
    if "!etat!"=="0" move "!chemin_complet!" "c:\toto\ETF"
    set etat=0
    )
    )

  2. #2
    Membre habitué

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2011
    Messages : 104
    Points : 191
    Points
    191
    Par défaut
    la méthode me parait simple:

    1: exécuter un déplacement des fichiers pdf avec le filtre "Toto1*.pdf Toto200.pdf" vers dossier 1

    2: exécuter un déplacement de tout le reste vers dossier 2

    une idée pour le code:

    for /r "source" %%i in (*Toto1*.pdf *Toto200.pdf) do (xcopy "%%~fi" "dossier 1")

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Bonjour et merci de la réponse rapide.


    J'ai pris un mauvais exemple.
    Les plages que je souhaiterais sont :

    1000 --> 2999
    7700 --> 8500

    Le soucis est que si je met comme départ toto1* il comptera toto100 et le copiera alors qu'il ne le doit pas. Idem pour toto7*.

    Y'a-t il une solution ? je ne vois pas vraiment comment faire

  4. #4
    Membre habitué

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2011
    Messages : 104
    Points : 191
    Points
    191
    Par défaut
    Bon... il faut faire un code un peu plus compliqué alors^^

    Option 1: si tous tes fichiers on un nom formaté de manière identique, faire une boucle qui récupère la partie numérique puis exécute des conditions qui détermine si on copie ou non.

    Option 2: faire un fichier contenant tout les nom de fichier a copier puis faire un boucle qui copie si la chaine et trouvé dans le fichier.

    Option 3: xcopy propose d'ajouter en paramètre un fichier contenant les noms de fichiers a exclure. (le plus simple à faire)

    tu peux lister quelques noms de tes fichiers ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    ET1668_15112011_FIT11710601_C.pdf
    ET8955_16082011_FIT11511432_C.pdf
    ET575_23072011_FIT11415986_C.pdf

    La partie numérique intéressante se trouve après ET et avant le premier _

    Tes solutions me paraissent intéressantes en effet.

    La 2ème me parait plus simple à faire avec mes compétences. Je vais essayer mais je doute vraiment réussir à interroger le fichier texte avec des conditions. Puis les dates dans les noms de fichiers est aléatoire.

    La 3ème solution est simple en effet mais trop laborieuse je pense car je devrais créer une liste des 3000 que je ne veux pas copier et la date à la fin des fichiers est elle aléatoire.

  6. #6
    Membre habitué

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2011
    Messages : 104
    Points : 191
    Points
    191
    Par défaut
    code pour option 2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    setlocal enabledelayedexpansion
    
    for /r "source" %%i in (*) do (
    set chemin_complet=%%~fi
    set nom_extention=%%~nxi
    
         set etat=0
         for /f "tokens=*" %%i in ('type "chemin du fichier" ^| find "!nom_extention!"') do set etat=1
    
              if "!etat!"=="1" xcopy "!chemin_complet!" "destination"
    
    )
    j'ai pas testé je te laisse ce plaisir^^

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    J'ai testé et ca me parait en bonne voie. La copie se fait bien si je rentre les noms exacts (avec la date) de fichiers dans le fichier texte.

    Il me reste un soucis. Comme je l'ai dit plus haut, la date dans le nom du fichier est aléatoire. Je peux remplir mon fichier texte avec les exclusions, mais je ne peut pas rentrer toutes les dates en plus..

    Y aurait-il un moyen de rogner les noms de fichier dans une variable jusqu'au "_"et de comparer cette variable au fichier texte contenant la liste des exclusions (le tout sans renommer le fichier initial) ? Eventuellement y aurait-il moyen de ne pas chercher une occurence exacte dans mon fichier et de ne chercher qu'une partie du nom de fichier ?

  8. #8
    Membre habitué

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2011
    Messages : 104
    Points : 191
    Points
    191
    Par défaut
    Biensur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    rem on défini les parties du nom de fichier avec l'underscore comme délimiteur
    for /f "tokens=1,2,3,4 delims=_" %%i in ("!nom_extention!") do (
    set p1=%%i
    set p2=%%j
    set p3=%%k
    set p4=%%l
    )
    donc sa donnerai:
    ET1668_15112011_FIT11710601_C.pdf
    !p1!_!p2!_!p3!_!p4!

    donc tu fait un find sur !p1!__!p3!_!p4! donc sur ET1668__FIT11710601_C.pdf

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Extra ! Merci beaucoup !!!! Réponses rapides et de qualité !

    Ca fonctionne bien désormais !

    Par contre aurais-je un moyen de remplir facilement le fichier texte via un batch également qui me remplirais chaque ligne comme ceci :
    ET1000
    ET1001
    ET1002
    ..........

    et ce jusqu'au une valeur voulue ?




    Voici le code actuel permettant de supprimer les espaces dans le nom du fichier, de séparer le nom en plusieurs parties dans des variables, puis de faire une boucle qui copie si la chaine est trouvé dans un fichier texte séparé.

    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
    21
    22
    23
    24
    25
    26
    setlocal enabledelayedexpansion
    
    
    for /f "delims=" %%a in ('dir /b') do call :cmd "%%a"
    exit
    :cmd
    set fichierbck=%~1
    set fichier=%fichierbck: =%
    ren "%fichierbck%" "%fichier%"
    
    for /r "c:\toto" %%i in (*) do (
    set chemin_complet=%%~fi
    set nom_extention=%%~nxi
    
    for /f "tokens=1,2,3,4 delims=_" %%i in ("!nom_extention!") do (
    set p1=%%i
    set p2=%%j
    set p3=%%k
    set p4=%%l
    )
         set etat=0
    
         for /f "tokens=*" %%i in ('type "C:\toto\liste.txt" ^| find "!p1!"') do set etat=1
              if "!etat!"=="1" xcopy "!chemin_complet!" "c:\toto\test"
    
    )

  10. #10
    Membre habitué

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2011
    Messages : 104
    Points : 191
    Points
    191
    Par défaut
    Ben en gros tu peu faire une boucle ou tu récupère la première partie du non (ex=ET1000) que tu parse avec [set p1_moin_les_deux_premiers_caracteres=!p1:~2!] et ensuite tu peux faire des conditions du genre [if /I !p1_moin_les_deux_premiers_caracteres! GTR 1245 if /I !p1_moin_les_deux_premiers_caracteres! LSS 1368 echo !p1!>>"ton fichier"]

    aide toi de if /? pour construire tes conditions

  11. #11
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 16
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    Désolé de la réponse tardive.

    J'ai réussi à me débrouiller avec la commande for pour remplir mon fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    For /L %%N IN (1000,1,2999) Do echo %%N >> listeET.txt
    For /L %%N IN (7700,1,8500) Do echo %%N >> listeET.txt

    Voici le code final pour la copie en fonction d'une partie du nom de fichier.

    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
    setlocal enabledelayedexpansion
    @echo off
    for /r "c:\toto" %%i in (*.pdf) do (
    set chemin_complet=%%~fi
    set nom_extention=%%~nxi
    for /f "tokens=1,2,3,4 delims=_" %%i in ("!nom_extention!") do (
    set p1=%%i
    set p2=%%j
    set p3=%%k
    set p4=%%l
    set p5=!p1:~3!
    set etat=0
    for /f "tokens=*" %%i in ('type "C:\toto\listeET.txt" ^| find "!p5!"') do set etat=1
    if  !p5! LSS 1000 set etat=0
    if "!etat!"=="1" move "!chemin_complet!" "c:\toto\ETE"
    if "!etat!"=="0" move "!chemin_complet!" "c:\toto\ETF"
    set etat=0
    )
    )
    Je met le sujet en résolu.

    J'ajoute que ce forum est d'une grande qualité, tant au niveau des personnes venant répondre aux questions qu'au contenu de celui-ci.
    Je vous remercie beaucoup de votre aide !!

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

Discussions similaires

  1. [XL-2007] Ouverture d'un fichier en fonction d'une partie de son nom
    Par Yamiral dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 09/11/2012, 17h02
  2. [XL-2002] Sélectionner fichier en fonction d'une partie de son nom
    Par johan89 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 02/11/2011, 20h48
  3. Renommage d'une partie de nom de fichiers en masse et aussi à l'intérieur
    Par sclinard dans le forum Shell et commandes POSIX
    Réponses: 2
    Dernier message: 17/09/2010, 15h02
  4. Recherche fichier dont on connait une partie du nom
    Par kluh dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/11/2008, 08h31
  5. suppression fichier en fonction d'une date
    Par kalyparker dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 02/07/2007, 14h19

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