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 :

Renommage de fichiers [Batch]


Sujet :

Scripts/Batch

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Octobre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Octobre 2019
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Renommage de fichiers
    Bonjour,
    J’ai un petit souci avec la création d’un fichier bat, et j’aimerais savoir si quelqu’un serait en mesure de m’aider
    Je m’explique : toutes les minutes, j’ai un certain nombre de machines qui renvoient des fichiers log
    Ceux ci sont nommés : AAAA-MM-JJ-hh-mm-ss-ref_machine.log
    Ces fichiers log sont automatiquement exportés et regroupés vers un dossier, sur une machine distante où ils sont traités «*au fil de l’eau*» (premier arrivé, premier à passer ds un logiciel de vérification/concaténation des données)
    Tout marche très bien donc, forcément, ça ne pouvait pas durer
    Il est maintenant demandé que les logs soient traités toutes les heures, à rebours (le dernier arrivé, puis l’avant dernier, ...) or, le logiciel ne m’offre pas la possibilité de trier les fichiers en entrée
    Je cherche donc à modifier le nom de la palanquée de log, afin d’y inclure un numéro de compteur
    Par exemple : 0001-2019-10-14-10-00-00-machineX ; 0002-2019-10-14-10-00-00-machineY ; [...] ; 0042-2019-10-14-09-57-00-machineX ; etc
    Pour ce faire, j’ai commencé un petit script batch que voici :

    Code Batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @echo off
    set nb_log = 0
    for %%a in (*.log) do set /a nb_log = nb_log + 1 
    for %%a in (*.log) do (
    ren "%%~a" "%nb_log - %%~na%%~xa" & set /a nb_log = nb_log -1)

    Ce que je voulais faire :
    - compter le nbre de log dans le dossier (boucle +)
    - pour chaque log, le renommer en ajoutant le numéro de compteur (sur 4, voire 5 chiffres ... je ne sais pas comment forcer cela : boucle conditionnelle ?) et diminuer le compteur (boucle moins)

    Ce que ça fait :
    - compter le nombre de log
    - ajouter à tous les noms de fichier, le nombre total de log (sur 2 chiffres si moins de 100, 3 chiffres si moins de 1000, etc ...)

    Fin du pavé ; quelqu’un sait-il comment m’aider à débloquer cela ?
    Merci d’avance !
    Alex

  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,

    Tu peux t'inspirer de mon exemple :

    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
    @echo off
    setlocal enableextensions enabledelayedexpansion
    chcp 65001 >nul
     
    set nb_log=0
     
    for /f "delims=" %%A in ('dir /b /a-d "*.log" ^| sort /R') do (
     
    set /a nb_log+=1
    set index=000!nb_log!
    set index=!index:~-4!
     
    ren "%%~fA" "!index!-%%~nxA"
     
    )

    pause

  3. #3
    Candidat au Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Octobre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Octobre 2019
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour Barnabe,
    Je te remercie pour ta réponse !
    J’aimerais m’inspirer de ta proposition de façon à pouvoir trouver la solution, malheureusement je ne comprends pas tout ce que ton script réalise
    Par exemple, pourquoi le caractère ^ avant le pipe, ou pourquoi certaines variables sont en % et d’autres en !
    Ou encore, comment fonctionnent les lignes avec index

    D’habitude, je me sers de labview pour programmer, et du coup je n’ai pas l’habitude de taper des lignes de codes, et j’avoue être un peu à la rue quand il s’agit de le faire ^^
    Merci d’avance pour les éclaircissements !

    Alex

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Un autre code pour coller avec la demande.

    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
    @echo off
    setlocal enabledelayedexpansion
     
    :: Calcule le nombre de log
    set /A nb_log=0
    for %%a in (*.log) do set /a nb_log+=1
     
    :: Calcule le nombre de caractère, du nombre de log
    SET /A longueur=0
    :loop
    IF NOT "!nb_log:~%longueur%!"=="" (
    	SET /A longueur+=1
    	GOTO loop
    )
     
    for %%a in (*.log) do (
    	:: Ajout de Zéro
    	set nb_log=0000000000000000000!nb_log!
    	:: Découpe la chaine sur le nombre voulu
    	set nb_log=!nb_log:~-%longueur%!
    	::Renomme
    	echo ren "%%~a" "!nb_log!-%%~nxa"
    	:: Décrémente le compteur
    	set /a nb_log-=1
    )
     
    pause

  5. #5
    Candidat au Club
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Octobre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Octobre 2019
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonsoir,
    Tout d'abord, un grand merci à vous deux pour vos réponses !!

    @Barnabe : en recopiant ton code, j'avais fait une erreur et remplacé le dernier ~ par un -
    Résultat, ça ne fonctionnait pas.
    Aujourd'hui, tout fonctionne parfaitement ... mais je n'ai toujours pas compris pourquoi/comment ^^
    Si tu as donc l'occasion de passer par ici pour commenter ton script, je lirai ca avec plaisir !! :-)

    @Eric : je crois qu'il manque une ligne de code reprenant le contenu du dernier echo (ou alors, on peut virer l'instruction echo ... ca marche aussi ^^)
    De plus, lors de l’exécution du script sur 11 fichiers tests (datés du 01 au 11/10), j'obtiens un tri un peu bizarre : tout d'abord, du 04 au 11, puis du 01 au 03.
    Peut-être est-ce lié au fait que les valeurs de compteur allant de 01 à 09 affichent en fait -1 à -9 ... ?

    Encore merci à tous les deux, et au plaisir de vous lire si vous repassez sur ce sujet ! :-)

    Alex

  6. #6
    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
    Bonsoir,

    Je vais essayer d'expliquer : la commande DIR liste les fichiers par ordre alphabétique, vu que tes fichiers ont comme préfixe leur heure et date de création ils sont listés du plus ancien au plus récent, il suffit de rajouter SORT /R pour inverser le tri et obtenir la liste du plus récent au plus ancien.
    A côté de ça j'incrémente un index (la variable nb_log sur laquelle s'appuie la variable index). Ensuite je mixe tout ça dans une boucle FOR et le tour est joué.

    Concernant le caractère d'échappement avant le pipe, c'est simplement une obligation à cet endroit de la boucle FOR, sinon le script plante tout bêtement.

    Concernant l'expansion retardée des variables (variables entourées par des points d'exclamation) je l'active grâce à la directive setlocal enabledelayedexpansion. Il y a surement une bien meilleure explication mais voilà comment je décide si je dois l'utiliser ou pas : si j'attribue une valeur fixe j'utilise une variable avec des pourcents, si j'attribue une valeur qui est susceptible de changer au cours du script alors j'utilise une variable (retardée) avec des points d'exclamation.

  7. #7
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    @Eric : je crois qu'il manque une ligne de code reprenant le contenu du dernier echo (ou alors, on peut virer l'instruction echo ... ca marche aussi ^^)
    De plus, lors de l’exécution du script sur 11 fichiers tests (datés du 01 au 11/10), j'obtiens un tri un peu bizarre : tout d'abord, du 04 au 11, puis du 01 au 03.
    Peut-être est-ce lié au fait que les valeurs de compteur allant de 01 à 09 affichent en fait -1 à -9 ... ?
    Oui il faut bien supprimer echo c'est une erreur de ma part
    Je ne comprend pas ça renomme pas comme il faut ?

    Si la réponse de barnabe0057 te convient on peux en rester la.

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

Discussions similaires

  1. Script de renommage auto fichier d'un repertoire
    Par faventin dans le forum Windows
    Réponses: 1
    Dernier message: 09/11/2006, 21h27
  2. parcourir des tableaux pour faire des copies/renommages de fichiers
    Par Paloma dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 31/10/2006, 09h09
  3. [C#] Renommage de fichiers impossible
    Par xtream dans le forum Windows Forms
    Réponses: 4
    Dernier message: 19/08/2006, 12h02
  4. routine de renommage des fichiers
    Par jeremy.blanche dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 11/08/2006, 11h24
  5. [batch] renommage de fichiers dans des rep enfants
    Par khayyam90 dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 25/08/2005, 09h03

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