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 :

Script pour renommage de fichier


Sujet :

Scripts/Batch

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2009
    Messages : 68
    Points : 56
    Points
    56
    Par défaut Script pour renommage de fichier
    Bonjour,

    J'écris en ce moment mon premier script batch et je m'arrache les cheveux...

    Le but: automatiser le renommage de fichiers docx de la forme AA_BB_CC en CC_AA.

    J'ai testé 2 méthodes, et j'ai un problème dans les deux. Pouvez-vous m'aider à trouver ce qui cloche svp?

    • 1er essai: appel d'une subroutine


    Problème: la boucle tourne une fois de trop ! Tous les fichiers sont renommés puis, le 1er fichier a avoir été renommé est renommé à nouveau avant que le programme ne quitte.

    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
    @echo off
    SETLOCAL enableExtensions enableDelayedExpansion
    title Renommage de fichiers PDF automatique
    mode con cols=80 lines=16
    color B
     
    rem MAIN BATCH FILE PROGRAM----------------------------------
     
    rem Selection du repertoire contenant les fichiers à renommer
    set /p repertoire=Saissez le chemin absolu du repertoire:
     
    rem Parcours de tous les fichiers du répertoire
    for %%f in (%repertoire%\*.docx) do call :process %%~nf
    goto :EOF
     
    :process
    set old_file_name=%1
    rem Extraction des elements du nom de fichier
    for /f "tokens=1,2,3 delims=_" %%a in ("%old_file_name%") do (
    	set new_name_part_2=%%a
    	set new_name_part_3=%%b
    	set new_name_part_1=PO%%c
    	)
    rem Construction du nouveau nom de fichier
    set new_file_name=%new_name_part_1%_%new_name_part_2%
    rem renommage du fichier
    ren %repertoire%\%old_file_name%.docx %new_file_name%.docx
    echo Fichier %1 renomme en %new_file_name%!
    pause > nul
    goto :EOF

    • 2eme essai: sans subroutine


    Résultat: "Fichier AA_BB_CC renomme en _"
    Problème: les variables de la deuxième boucle for sont perdues à la sortie de cette même boucle...

    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
    SETLOCAL enableExtensions enableDelayedExpansion
    title Renommage de fichiers PDF automatique
    mode con cols=80 lines=16
    color B
     
    rem MAIN BATCH FILE PROGRAM----------------------------------
     
    rem Selection du repertoire contenant les fichiers à renommer
    set /p repertoire=Saissez le chemin absolu du repertoire:
     
    rem Parcours de tous les fichiers du répertoire
    for %%f in (%repertoire%\*.docx) do (
    	set old_file_name=%%~nf
    	rem Extraction des elements du nom de fichier
    	for /f "tokens=1,2,3 delims=_" %%a in ("%old_file_name%") do (
    		set new_name_part_2=%%a
    		set new_name_part_3=%%b
    		set new_name_part_1=PO%%c
    		)
    	rem Construction du nouveau nom de fichier
    	set new_file_name=!new_name_part_1!_!new_name_part_2!
    	rem renommage du fichier
    	ren %repertoire%\%old_file_name%.docx !new_file_name!.docx
    	echo Fichier %%~nf renomme en !new_file_name!!
    	pause > nul 
    	)
     
    echo Attention je vais quitter
    pause > nul
    goto :EOF

    Je suis à cours d'idée... Merci d'avance pour votre aide!

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur .NET en devenir
    Inscrit en
    Août 2017
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 : 546
    Points : 1 084
    Points
    1 084
    Par défaut
    Bonjour,

    Voilà la solution :

    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
    32
    33
    @echo off
    SETLOCAL enableExtensions enableDelayedExpansion
    title Renommage de fichiers PDF automatique
    mode con cols=150 lines=32
    color B
    chcp 1252 >nul
     
    rem MAIN BATCH FILE PROGRAM----------------------------------
     
    rem Selection du repertoire contenant les fichiers à renommer
    set /p repertoire="Saisissez le chemin absolu du répertoire: " 
     
    rem on teste si le répertoire existe et on se positionne dedans
    cd /d %repertoire% || exit /b 1
     
    if not exist "temp" (mkdir "temp")
     
    rem Parcours de tous les fichiers du répertoire
    for %%A in (*.docx) do (call:process "%%~fA")
     
    move "temp\*.*" "%repertoire%\" >nul
    rmdir "temp"
     
    echo. & pause
    exit /b 0
     
    :process
    echo.
    for /f "tokens=1,2,* delims=_" %%a in ("%~n1") do (
    	move "%~1" "temp\%%c_%%a%~x1" >nul
    	echo Fichier [%~nx1] renommé en [%%c_%%a%~x1]
    )
    goto :EOF

    Je suis obligé de déplacer les fichiers dans un dossier temporaire sinon la boucle traite certains fichiers plusieurs fois, ce qui est tout à fait normal.

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2009
    Messages : 68
    Points : 56
    Points
    56
    Par défaut
    Wahou!!!! Super, merci beaucoup barnabe0057!

    C'est vraiment un code très propre et très concis (ça m'a fait apprendre un tas d'autres commandes ) et ca marche du tonnerre!

    Le test d'existence du répertoire pour éviter le plantage est un must ... et j'admire la puissance de passer le nom complet du fichier en paramètres de la subroutine!

    Petite question cependant pour bien comprendre: pourquoi est-ce que la boucle ne s’arrête pas après avoir traiter tous les fichiers du répertoire (ce qui est pourtant ce qu'on lui dit de faire)?

    Code Batch : Sélectionner tout - Visualiser dans une fenêtre à part
    for %%A in (*.docx) do (call:process "%%~fA")

    On dirait que la création d'un répertoire temporaire est une solution de contournement pour empêcher la boucle de tourner une fois de trop...

    Merci encore pour votre aide, j’apprécie vraiment!

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur .NET en devenir
    Inscrit en
    Août 2017
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 : 546
    Points : 1 084
    Points
    1 084
    Par défaut
    Je suis content que tu apprécies mes petites astuces, surtout si ça te permet d'apprendre.

    Concernant le problème avec la boucle, je ne suis pas encore assez pointu sur le fonctionnement de l'interpréteur de commandes pour te donner une explication correcte.
    Apparemment la boucle re-liste les fichiers à un moment ou à un autre, du coup les fichiers renommés sont considérés comme non-traités, et donc traités une deuxième fois. Enfin c'est ma théorie (un peu bancal je l'admets !).

Discussions similaires

  1. script pour rendre des fichiers cachés visibles
    Par yucef83 dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 21/03/2008, 15h15
  2. [Upload] script pour uploader un fichier
    Par koKoTis dans le forum Langage
    Réponses: 2
    Dernier message: 12/02/2008, 09h31
  3. Script pour exécuter un fichier .sql
    Par jeanjean0403 dans le forum SQL
    Réponses: 7
    Dernier message: 04/10/2007, 21h55
  4. Choix pour un script pour effacer des fichiers
    Par mindover280 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 22/07/2007, 23h42
  5. Script de renommage auto fichier d'un repertoire
    Par faventin dans le forum Windows
    Réponses: 1
    Dernier message: 09/11/2006, 21h27

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