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 :

Faire un x.BAT pour renommer des fichiers


Sujet :

Scripts/Batch

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 13
    Points : 0
    Points
    0
    Par défaut Faire un x.BAT pour renommer des fichiers
    Bonjour,
    j'avais perdu tout un répertoire (2000 fichiers dans des sous-répertoires) que j'ai pu récupérer; malheureusement TOUS les fichiers ont été renommés de "fred.xyz" en "fred (2013_11_17 14_22_44 UTC).xyz"
    Qui pourrait me faire un x.bat à exécuter en dos pour supprimer une chaîne variable de préférence?
    Merci d'avance.

  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
    Points : 3 768
    Points
    3 768
    Par défaut
    Citation Envoyé par jlcollet Voir le message
    Qui pourrait me faire un x.bat à exécuter en dos pour supprimer une chaîne variable de préférence?
    tu veux quoi exactement en sortie ?

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 13
    Points : 0
    Points
    0
    Par défaut
    Je peux très bien l'exécuter répertoire par répertoire.
    Ce que je veux, à partir d'un parametre tel que par exemple " (2013_11_17 14_22_44 UTC)" (attention il y a 1 car blanc devant la 1ere parenthèse) je veux que tous les fichiers tels que "fred (2013_11_17 14_22_44 UTC).xyz" redeviennent "fred.xyz".
    Si c'est possible je te remercie grandement!

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 13
    Points : 0
    Points
    0
    Par défaut
    Bonjour,
    as-tu pu avancer?
    Merci

  5. #5
    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
    Points : 3 768
    Points
    3 768
    Par défaut
    Salut,

    ceçi doit fonctionner pour ton cas :

    j'ai mis un ECHO devant le REN pour que tu puisses tester si la sortie est OK.
    si c'est le cas retire le ECHO et voilà.

    Place ce bat dans le répertoire de départ de ton arborescence et fait un test.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @echo off
    setlocal EnableDelayedExpansion
    
    for /f "tokens=1* delims=(" %%a in ('dir /a-d/b/s ^| find "("') do (set $final=%%a
               echo ren "%%~dpnxa (%%b" "!$final:~0,-1!.*")

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 13
    Points : 0
    Points
    0
    Par défaut
    Salut et merci,
    en tant qu'ancien programmeur (45ans de celà!) je trouve ton batch magnifique!

    le nombre de fichiers à renommer ainsi que les sous-répertoires est parfait!
    Le suffixe est aussi supprimé!
    Deux problèmes cependant:
    =====ce que tu as généré=====
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ren "D:\Retraite\Nouveau dossier\IBM_retraite_112003 (2013_10_26 09_29_00 UTC).doc" "D:\Retraite\Nouveau dossier\IBM_retraite_112003.*"
    =====ce qu'il faudrait========
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ren D:\Retraite\"Nouveau dossier"\"IBM_retraite_112003 (2013_10_26 09_29_00 UTC)".doc "IBM_retraite_112003".*
    ========================
    - la " " ne peut apparaître que s'il y a 1 blanc
    - le répertoire ne doit pas apparaître dans la partie renommée

    Peux-tu faire celà?

    Merci d'avance

  7. #7
    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
    Points : 3 768
    Points
    3 768
    Par défaut
    Merci,

    Effectivement n'ayant testé que dans le répertoire courant, je n'ai pas vu le problème du chemin qui n'est pas accepté en 2eme argument du REN.

    Essaye comme ça (On évite même la création d'une variable et on a plus besoin de l'expansion retardé) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @echo off
    
    for /f "tokens=1* delims=(" %%a in ('dir /a-d/b/s ^| find "("') do (
             echo ren "%%~dpnxa (%%b" "%%~na.*")
    Ou de cette manière avec un MOVE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @echo off
    
    setlocal EnableDelayedExpansion
    
    for /f "tokens=1* delims=(" %%a in ('dir /a-d/b/s ^| find "("') do (set $ext=%%b
             echo move "%%~dpnxa (%%b" "%%~na!$ext:~-4!")
    Pour ce qui est de la structure des " " elle est parfaite, il n'y a rien à changer, elle englobe tous le chemin.


  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 13
    Points : 0
    Points
    0
    Par défaut
    Salut et encore merci.

    La génération est parfaite et tu as raison, les " " peuvent englober tout le chemin.
    Sans doute un dernier petit hic; si j'éxécute chaque commande une à une, ca marche, ie le format est bon: bravo. Si j'en exécute plusieurs, ca marche aussi.
    Mais l'exécution du batch qui génére donc bien toutes les commandes, avec un format correct n'exécute pas ces commandes?
    As-tu une idée?
    Bonne journée

  9. #9
    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
    Points : 3 768
    Points
    3 768
    Par défaut
    Salut,

    Montre le code que tu essayes de faire fonctionner.


  10. #10
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    salut tout le monde,
    sachadee

    Retraite, c'est que c'est important... voici ma contribution alors... c'est suffisamment fiable et complet, avec une petite journalisation, pour un usage qui se veut normalement unique...

    pour faire un test au préalable, il suffit de commenter la ligne avec "ren" (ligne 23) en ajoutant par exemple "echo" ou "::" devant.

    le script doit être placé dans le dossier parent.

    bon courage...

    renamingFiles.cmd
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    @echo off
    set _success_op=0
    set _error_op=0
    set _total_op=0
    set _error_log=log.txt
    (echo.& echo.%date% - %time% [errors]&echo.-------------------------------------)>>"%_error_log%"
    for /f "tokens=*" %%i in ('dir /s /b /a-d "* (*).*"') do call :renaming "%%~dpi" "%%~ni" "%%~xi"
    (echo.-------------------------&echo. total errors: %_error_op%)>>"%_error_log%"
    call :set_title end
    echo.
    pause
    "%_error_log%"
    goto :eof
    
    :renaming
    set /a _total_op+=1
    set "_file=%~1%~2%~3"
    set "_ext=%~3"
    set /p "=> %~2%~3 ... "<nul
    if not exist "%_file%" call :trace_error& goto :eof
    set "_new_name="
    for /f "tokens=1,* delims=()" %%i in ("%~2") do call :set_new_name %%~i
    ren "%_file%" "%_new_name%%_ext%" 2>nul
    if errorlevel 1 call :trace_error& goto :eof
    call :trace_success
    goto :eof
    
    :set_new_name
    set "_new_name=%*"
    goto :eof
    
    :set_title
    title Renaming:   success[%_success_op%]   error[%_error_op%]   total[%_total_op%] 
    goto :eof
    
    :trace_error
    set /a _error_op+=1
    echo.error
    echo.%_file%>>"%_error_log%"
    call :set_title
    goto :eof
    
    :trace_success
    set /a _success_op+=1
    echo.ok
    call :set_title
    goto :eof

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 13
    Points : 0
    Points
    0
    Par défaut
    Merci beau coup à tous les deux mais un merci particuliers à Sachadee: si peu de lignes de code, c'est fabuleux.
    Pour répondre à sa question: c'est ton code, inchangé:
    ====================
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @echo off
    setlocal EnableDelayedExpansion
    
    for /f "tokens=1* delims=(" %%a in ('dir /a-d/b/s ^| find "("') do (
             echo ren "%%~dpnxa (%%b" "%%~na.*")
    ====================
    il génère ce qu'il faut, par exemple:
    ====================
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ren "D:\Famille Trucmuch\Thumbs (2013_10_26 09_29_00 UTC).db" "Thumbs.*"
    ren "D:\Famille Trucmuch\Travaux Caro (2013_10_26 09_29_00 UTC).doc" "Travaux Caro.*"
    ren "D:\Famille Trucmuch\Cadastres\Trouville_11_les_jardins_du_Père (2013_10_26 09_29_00 UTC).pdf" "Trouville_11_les_jardins_du_Père.*"
    ====================
    Cependant 3 points:
    - le code généré ne s'exécute pas, je ne sais pourquoi; par contre je le prends et je le recopie sur la ligne de commande: ca marche!
    - un petit problème de formatage : si le fichier à renommer à des caractères spéciaux (".()[]+") la suppression du suffixe ne se fait pas
    - dernier point sans doute pour moi, sans doute que mon buffer de commande générées n'est pas assez grand car il me manque des commandes.

    Mon problème est résolu mais je regarderai demain la solution de Minnesota.

    Merci encore pour le bon boulot que vous faites si gentiment.

  12. #12
    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
    Points : 3 768
    Points
    3 768
    Par défaut
    As-tu supprimé le echo. Dans le code ?

    Il faut le supprimer pour que la commande s'éxecute


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @echo off
    
    for /f "tokens=1* delims=(" %%a in ('dir /a-d/b/s ^| find "("') do (
             ren "%%~dpnxa (%%b" "%%~na.*")

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 13
    Points : 0
    Points
    0
    Par défaut
    Sachadee,
    ton code fonctionne parfaitement (une fois le "echo" viré! honte à moi!); juste le problème prêt de formatage du fichier à renommer : si il y à des caractères spéciaux (".()[]+") la suppression du suffixe ne se fait pas. Pour tout le reste c'est bon.

    Minnesota,
    avec le echo devant ren, les pbs suivants: (2exemples, mais c'est le meme pb partout)

    > gigaset s445 (2013_10_26 09_29_00 UTC).pdf ... ren "E:\test4\Matériel\Siemens\gigaset s445 (2013_10_26 09_29_00 UTC).pdf" "gigaset s445.pdf"
    error
    > gigaset s79h (2013_10_26 09_29_00 UTC).pdf ... ren "E:\test4\Matériel\Siemens\gigaset s79h (2013_10_26 09_29_00 UTC).pdf" "gigaset s79h.pdf"
    error


    fichier error.log
    E:\test4\Matériel\Siemens\gigaset s445 (2013_10_26 09_29_00 UTC).pdf
    E:\test4\Matériel\Siemens\gigaset s79h (2013_10_26 09_29_00 UTC).pdf

    D'autre part cela tue la session DOS. (inutilisable)
    Le nombre de lignes à renommer et de répertoires/sous-répertoires a l'air bon.

    Merci à tous les deux

  14. #14
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    Que le script se ferme à la fin des opérations, c'est tout à fait normal. Si tu veux que ta console reste ouverte, tu peux insérer un "echo.& cmd /k" entre la ligne 12 et 13.

    Maintenant que ça t'affiche "error", c'est-à-dire que ça te fixe un errorlevel 1 après un "echo", c'est un mystère je peut même pas dire que c'est un problème de code page (à cause du caractère accentué) étant donné que le test d'existence du fichier en ligne 20 réussit. À tout hasard, tu peux toujours placer un "verify off>nul" en ligne 23 ce qui repasserait le "echo ren..." à la 24. Mais là sur le moment je vois pas... c'est très bizarre...

  15. #15
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 13
    Points : 0
    Points
    0
    Par défaut
    je pense que tu n'as pas regardé le code généré que je t'ai envoyé dans les 2exemples: c'est quoi ce qui traîne avant le rename " gigaset s445 (2013_10_26 09_29_00 UTC).pdf ..."
    faudrait que tu le supprimes.
    Merci

  16. #16
    Membre émérite
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Points : 2 274
    Points
    2 274
    Par défaut
    Pour avoir un aperçu du fonctionnement normal, il faut mettre "::" en lieu et place du "echo", devant le "ren", comme ça, la commande qui devrait être lancée en fonctionnement normal, ne serait ni affichée, ni exécutée.

    Ce qui est affiché avec le "echo", on va dire que c'est le "mode démo détaillé".

    mais en "mode démo simple", c'est-à-dire avec les 2 deux-points "::",
    tu devrais avoir quelque chose comme ça :

    > gigaset s445 (2013_10_26 09_29_00 UTC).pdf ... ok
    > gigaset s79h (2013_10_26 09_29_00 UTC).pdf ... ok
    ....
    en mode "actif", sans "::" et sans "echo", la commande "ren" est exécutée
    et le script pourrait produire une sortie de ce genre :

    > gigaset s445 (2013_10_26 09_29_00 UTC).pdf ... ok
    > gigaset s79h (2013_10_26 09_29_00 UTC).pdf ... error
    ....
    là où tu as un "error", ça veut dire que l'opération de re-nommage a échoué, et donc ça te permet d'agir en conséquence.

  17. #17
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 13
    Points : 0
    Points
    0
    Par défaut
    Minnesota laisse tomber!
    J'ai eu une bonne solution et j'en remercie Sachadee. A propos c'est quoi le langage utilisé?
    Toi tu m'expliques que tu génères des âneries et que c'est normal...
    tout va bien.
    Merci

  18. #18
    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
    Points : 3 768
    Points
    3 768
    Par défaut
    Jlcollet,

    Toi tu m'expliques que tu génères des âneries et que c'est normal...
    minnesota t'as proposé une solution fonctionnelle et complète avec gestion des erreurs. Et connaissant ses codes et ses compètences. Je peux te garantir que c'est loin d'être des âneries.

    C'est possible qu'il y ai quelques adaptations à faire pour coller à ton problème.

    Mais son but était de t'aider. Et le connaissant il t'aurait aidé jusqu'à ce que cela fonctionne parfaitement.

    Donc je trouve (et je suis pas le seul apparemment...) ta réaction un peu extrême.

    Un forum n'a de futur que dans le respect et la convivialité.

    A bon entendeur.....


  19. #19
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 13
    Points : 0
    Points
    0
    Par défaut
    Salut,
    je reconnais que j'ai été un peu sec dans ma réponse;
    il est vrai que son bat est très complet mais je n'arrive pas à le faire marcher et c'est gênant! on dit que le mieux est l'ennemi du bien, ce proverbe signifie qu'en cherchant mieux, on risque de perdre ce qui est bien.
    Merci pour tout

Discussions similaires

  1. [XL-2010] Macro pour renommer des fichiers à partir d'une liste de nom de fichiers
    Par thomahh dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 25/01/2013, 17h03
  2. problème pour renommer des fichiers
    Par PadawanInPerl dans le forum Langage
    Réponses: 5
    Dernier message: 15/12/2009, 12h25
  3. Création d'un .bat pour déplacer des fichiers
    Par harmonia1981 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 31/10/2009, 12h45
  4. Fichier .bat pour compresser des fichiers de logs
    Par Quartus dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 26/06/2008, 16h45
  5. Recherche d'un script PHP pour renommer des fichiers en masse
    Par pekka77 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 19/11/2006, 23h43

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