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 :

Boucle FOR /L et nom de fichier sur 3 digits [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Par défaut Boucle FOR /L et nom de fichier sur 3 digits
    Bonjour la communauté,

    On m'a posé la problématique suivante que je dois réaliser en Batch DOS cmd (et uniquement sous ce "langage")
    Je dois réaliser un script dont le but est de concaténer avec la commande copy /b plusieurs fichiers afin d'en obtenir un seul. Le nombre de fichiers à concaténer est variable et doit être renseigné par l'utilisateur. Mais par contre, mon problème principal, c'est que le nom des fichiers à concaténer (qui contient un numéro à la fin et commence toujours par "Fic") est sur 3 digit. Ainsi, le premier fichier ne s'appelle pas Fic1.bin mais Fic001.bin, puis Fic002.bin et ainsi de suite

    J'ai une idée approximative de la forme que doit avoir mon script mais il y a un ou deux points de détail sur lesquels je coince, notamment sur comment forcer le nom du fichier (enfin son séquençage) sur 3 caractères

    Pour l'instant, ça commence comme quelque chose du style :
    ========
    Code batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    set /p Nb=Combien de fichiers a concaténer ?
     
    FOR /L %%A IN (1,1,%Nb%) DO (
     
    copy /b Final.bin+Fic&%A% Final.bin
     
    )
    ========
    Je n'ai même pas besoin de le tester pour savoir qu'il ne marchera pas en l'état car j'ai plusieurs problèmes que je ne sais pas résoudre :
    - Est-ce que la commande FOR /L peux recevoir une variable nommée par %Nb% ou alors faut-il utiliser une autre notation ?
    - Faire en sorte que la variable %A% qui contient le numéro de séquençage utilisé après pour trouver le nom du fichier à lire pour le concaténer soit sur 3 digits
    - Comment, dans la commande "copy /b" former le nom du fichier à chercher sur la base de sa "racine" Fic auquel on ajoute le numéro de séquençage sur 3 digits

    Voilà
    J'espère avoir été clair et exhaustif et suis dans l'attente de vos suggestions ou questions
    Par avance, un grand merci

  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,

    Voilà une autre approche :

    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
    @echo off
    Setlocal enableextensions enabledelayedexpansion
    chcp 1252 > nul
    
    set "Nb=0"
    set /p "Nb=Combien de fichiers à concaténer ? "
    
    set "file=Final.bin"
    set /a var=0
    
    echo. > %file%
    
    for /f %%A in ('dir /b /a-d "*.bin" ^| findstr /b "Fic"') do (
    set /a var+=1
    if !var! LEQ %Nb% (set file=!file! + %%A)
    )
    
    echo. & copy /b !file!
    
    pause
    endlocal
    exit

  3. #3
    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,


    la technique pour avoir des 0 devant tes nombres :

    1- On rajoute 3 zeros devant le nombre : 1 => 0001
    2- On récupère les 3 derniers caractères de la variable : 0001 => 001

    Donc avec FOR /L

    Code bat : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    @echo off
    setlocal enabledelayedexpansion
     
    set "$c=1"
     
         for /l %%a in (1,1,100) do (
               set "$num=000%%a"
               echo !$num:~-3!
         )



  4. #4
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Par contre pour avoir 2 zéros devant et donc 3 chiffres en tout, 2 zéros suffisent

  5. #5
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 37
    Par défaut
    Citation Envoyé par barnabe0057 Voir le message
    Bonjour,

    Voilà une autre approche :

    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
    @echo off
    Setlocal enableextensions enabledelayedexpansion
    chcp 1252 > nul
    
    set "Nb=0"
    set /p "Nb=Combien de fichiers à concaténer ? "
    
    set "file=Final.bin"
    set /a var=0
    
    echo. > %file%
    
    for /f %%A in ('dir /b /a-d "*.bin" ^| findstr /b "Fic"') do (
    set /a var+=1
    if !var! LEQ %Nb% (set file=!file! + %%A)
    )
    
    echo. & copy /b !file!
    
    pause
    endlocal
    exit
    J'apprécie l'effort mais même si je ne comprends pas tout ton script, je crois qu'il s'écarte, pour certains points, totalement du problème énoncé. Bien qu'on rentre un nombre de fichier à traiter, la boucle va prendre tous les fichiers dans le répertoire courant se terminant par .bin et contenant Fic (accessoirement, le mot Fic pourrait être au milieu, il le prendrait quand même) et la boucle s'arrête quand le nombre de fichiers traités est supérieur au nombre donné au début, c'est bien ça ?
    Autre point, sauf erreur de ma part, la commande "echo. > %file%" va créer le fichier avec un caractère qui n'a rien à faire là (au contraire d'une commande "touch" sous Unix par exemple)
    Et sinon, pour ma culture personnelle, à quoi serve le Setlocal et le chcp dans le script ? Si on laisse la page de code à 850, ça ne marchera pas ?

  6. #6
    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
    Tu as presque compris le fonctionnement, il y a juste une ou deux subtilités qui t'ont échappé : la boucle va effectivement lister tous les fichiers BIN commençant par "Fic", dans l'ordre alphabétique donc dans l'ordre croissant vu que les fichiers sont numérotés. Ensuite la variable FILE, travaillant de concert avec la variable VAR, va récupérer le nombre de fichiers indiqués, pas la totalité.

    Concernant ECHO. ça n'affiche pas de point, ça affiche une ligne vide.

    Concernant SETLOCAL ENABLEDELAYEDEXPANSION, ça sert à activer l'expansion retardée des variables, j'en ai besoin pour la variable FILE.

    Concernant CHCP 1252, ça sert à afficher correctement les caractères accentués.

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

Discussions similaires

  1. [Batch] msdos.bat - boucle for - ecrire un ) dans un fichier texte
    Par eric4510 dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 19/04/2015, 11h33
  2. [Débutant] Boucle for - Incrementer un nom de variable
    Par titus2709 dans le forum MATLAB
    Réponses: 3
    Dernier message: 13/05/2011, 12h51
  3. Réponses: 3
    Dernier message: 16/12/2010, 18h33
  4. [Batch] Makefile, batch & boucle FOR
    Par alband85 dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 09/06/2009, 10h10
  5. BATCH : Boucle FOR qui ne boucle pas ?!
    Par agyar dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 25/10/2008, 11h27

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