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 :

Renommer fichier selon chaine de caractères dans son contenu [Batch]


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 15
    Par défaut Renommer fichier selon chaine de caractères dans son contenu
    Exposé du problème :

    Je récupère des mises à jour (19 fichiers) nommés selon le principe nod[0x????].nup où [0x????] est un nombre hexadécimal de 4 chiffres aléatoire dans un dossier Updfiles.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set "source=%ProgramFiles%\Eset\ESET Online Scanner\Modules\data\updfiles\"
    dir /A-D /B "%Source%*.nup"
    Je souhaite les renommer en fonction de la chaine de caractères trouvée dans leur contenu :
    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
    Colonne 1 : chaine de caractères de recherche | Colonne 2 : nom du fichier destination
    LOADER0 em000_32_l0.nup
    PERSEUS0 em001_32_l0.nup
    PERSEUS1 em001_32_l1.nup
    ENGINE0 em002_32_l0.nup
    ENGINE1 em002_32_l1.nup
    ENGINE2 em002_32_l2.nup
    ARCHIVES0 em003_32_l0.nup
    ADVHEUR0 em004_32_l0.nup
    ADVHEUR1 em004_32_l1.nup
    CLEANER0 em005_32_l0.nup
    CLEANER1 em005_32_l1.nup
    CLEANER2 em005_32_l2.nup
    ANTISTEALTH0 em006_32_l0.nup
    ANTISTEALTH1 em006_32_l1.nup
    ANTISTEALTH2 em006_32_l2.nup
    Exemple : la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    pushd "%Source%"
    findstr /R "ENGINE[0-2]" *.nup
    popd
    retourne
    nod156A.nup:name=ENGINE0
    nod284E.nup:name=ENGINE1
    nod504C.nup:name=ENGINE2
    avec ma table précédente, le 1er fichier nod156A.nup doit être renommé en em002_32_l0.nup
    Je souhaite trouver le code le plus concis possible pour faire cette opération sur les 19 fichiers.

    Mon code actuel
    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
    @echo off &Setlocal enableextensions
    Set "source=%ProgramFiles%\Eset\ESET Online Scanner\Modules\data\updfiles\"
    set "filtre=*.nup"
    
    for /f "skip=1 tokens=1-2 delims= " %%a in ('findstr /R "_32_l[0-2]*" %~s0') do (
    	for /f "tokens=*" %%c in ('dir /A-D /B "%source%*.nup"') do (
    		for /f "tokens=*" %%z in ('findstr /R "%%a" "%source%%%c"') do (
    		@echo found: %%a in %%c &pushd "%source%" &echo.ren %%c %%b &popd
    		)
    	)
    )
    goto :eof
    
    [TABLE]
    LOADER0 em000_32_l0.nup
    PERSEUS0 em001_32_l0.nup
    PERSEUS1 em001_32_l1.nup
    ENGINE0 em002_32_l0.nup
    ENGINE1 em002_32_l1.nup
    ENGINE2 em002_32_l2.nup
    ARCHIVES0 em003_32_l0.nup
    ADVHEUR0 em004_32_l0.nup
    ADVHEUR1 em004_32_l1.nup
    CLEANER0 em005_32_l0.nup
    CLEANER1 em005_32_l1.nup
    CLEANER2 em005_32_l2.nup
    ANTISTEALTH0 em006_32_l0.nup
    ANTISTEALTH1 em006_32_l1.nup
    ANTISTEALTH2 em006_32_l2.nup

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 948
    Par défaut
    Je ne comprends pas bien pourquoi tu cherches le code le plus concis possible? un code concis n'est pas nécessairement plus compréhensible ni plus rapide à executer. Quel est le but final?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 15
    Par défaut
    Citation Envoyé par Flamby38 Voir le message
    Quel est le but final?
    Améliorer mes connaissances en "programmation" de scripts en soumettant mon code et avoir l'avis de [1-2] experts sur ce forum qui apportent toujours des réponses qui démontrent la distance qui sépare le débutant (éclairé) de l'expert (avisé).

    J'aime les réponses de ces personnes car elles me donnent matière à réflexion et me permettent de progresser.

    C'est après avoir trouvé une réponse à un problème pour moi insoluble postée sur ce forum que j'ai décidé de m'inscrire pour pouvoir leur poser des questions quand je ne sais pas... encore.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 948
    Par défaut
    ok, eh bien bon apprentissage alors
    par contre je ne peux pas t'aider.

  5. #5
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par Bilou_Gateux Voir le message
    Améliorer mes connaissances en "programmation" de scripts en soumettant mon code et avoir l'avis de [1-2] experts sur ce forum qui apportent toujours des réponses qui démontrent la distance qui sépare le débutant (éclairé) de l'expert (avisé).

    J'aime les réponses de ces personnes car elles me donnent matière à réflexion et me permettent de progresser.

    C'est après avoir trouvé une réponse à un problème pour moi insoluble postée sur ce forum que j'ai décidé de m'inscrire pour pouvoir leur poser des questions quand je ne sais pas... encore.
    Le problème de la "concision" est un faux problème, et un vrai piège à c..

    Je t'explique : certains langages, dont le batch, peuvent devenir "write-only". C'est à dire que dans certains cas, on peut écrire un programme effectuant une action donnée, mais qu'il est presque impossible de comprendre avec une simple lecture (= sans exécution) ce que fait le programme en question... Ce qui pose le problème de la maintenabilité du programme par la suite, y compris par le développeur initial.

    Je ne saurais donc t'encourager à ne PAS chercher la concision à tout prix, mais plutôt à bien comprendre ce que tu fais, par exemple en comprenant ce que "coûtent" chacune des opérations élémentaires que tu effectues.

    Typiquement, j'ai une sainte horreur des instructions multiples : tout code possédant plusieurs instructions sur une même ligne passe chez moi au broyeur, et ceci quel que soit le langage. Batch inclus.

    Tu peux également aller jeter un œil à ce post sur l'utilisation correcte des commandes avec FOR /F : je ne saurais trop te conseiller d'utiliser usebackq avec tes commandes.

    Pour le reste (optimisation du programme), je t'avoue qu'habituellement, il est relativement simple de recréer un jeu de test. Ce n'est pas le cas de ton problème initial, donc ce serait mieux que tu uploades une archive ZIP avec des fichier .NUP adéquats de façon à pouvoir, éventuellement, tester une solution plus optimale. Il doit être possible de faire ça avec seulement deux boucles imbriquées, je pense.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  6. #6
    Membre Expert
    Avatar de I'm_HERE
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 013
    Par défaut
    salut,



    :: untested.bat

    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
    @echo off &Setlocal enableextensions
    
    
    Set "source=%ProgramFiles%\Eset\ESET Online Scanner\Modules\data\updfiles\"
    
    cd /d "%source%"
    
    for /f "tokens=1*" %%a in ('findstr /R "_32_l[0-2]*" %~s0') do (
      for %%c in (*.nup) do find "%%a" <"%%c">nul && echo  ren "%%c" "%%b"
    )
    pause
    goto :eof
    
    [TABLE]
    LOADER0 em000_32_l0.nup
    PERSEUS0 em001_32_l0.nup
    PERSEUS1 em001_32_l1.nup
    ENGINE0 em002_32_l0.nup
    ENGINE1 em002_32_l1.nup
    ENGINE2 em002_32_l2.nup
    ARCHIVES0 em003_32_l0.nup
    ADVHEUR0 em004_32_l0.nup
    ADVHEUR1 em004_32_l1.nup
    CLEANER0 em005_32_l0.nup
    CLEANER1 em005_32_l1.nup
    CLEANER2 em005_32_l2.nup
    ANTISTEALTH0 em006_32_l0.nup
    ANTISTEALTH1 em006_32_l1.nup
    ANTISTEALTH2 em006_32_l2.nup
    si ça fonctionne enlève le echo

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 948
    Par défaut
    Ecoutez les sages paroles de mac lak, un code simple et bien organisé c'est la garantie que quand tu le reliras 1 an plus tard tu le comprendras encore

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 15
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Tu peux également aller jeter un œil à ce post sur l'utilisation correcte des commandes avec FOR /F : je ne saurais trop te conseiller d'utiliser usebackq avec tes commandes.

    Il doit être possible de faire ça avec seulement deux boucles imbriquées, je pense.
    J'avoue ne jamais m'être posé la question de l'utilité ou non de usebakq. Merci de m'avoir éclairé sur son objectif.

    Par concision, j'entendais justement avoir le minimum de boucles imbriquées.

    La solution de I'm_HERE répond à mes attentes :
    Citation Envoyé par I'm_HERE Voir le message
    salut,



    :: untested.bat
    Merci, résultat OK. Une seule modification de ma part pour toujours être postionné dans le bon répertoire en cas d'appel de ce batch depuis un autre.

    @echo off &Setlocal enableextensions


    Set "source=%ProgramFiles%\Eset\ESET Online Scanner\Modules\data\updfiles\"

    pushd "%source%"

    for /f "tokens=1*" %%a in ('findstr /R "_32_l[0-2]*" %~s0') do (
    for %%c in (*.nup) do find "%%a" <"%%c">nul && echo ren "%%c" "%%b"
    )
    popd
    pause
    goto :eof

    [TABLE]
    LOADER0 em000_32_l0.nup
    PERSEUS0 em001_32_l0.nup
    PERSEUS1 em001_32_l1.nup
    ENGINE0 em002_32_l0.nup
    ENGINE1 em002_32_l1.nup
    ENGINE2 em002_32_l2.nup
    ARCHIVES0 em003_32_l0.nup
    ADVHEUR0 em004_32_l0.nup
    ADVHEUR1 em004_32_l1.nup
    CLEANER0 em005_32_l0.nup
    CLEANER1 em005_32_l1.nup
    CLEANER2 em005_32_l2.nup
    ANTISTEALTH0 em006_32_l0.nup
    ANTISTEALTH1 em006_32_l1.nup
    ANTISTEALTH2 em006_32_l2.nup

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

Discussions similaires

  1. [VBS] Recherche chaine de caractères dans un fichier
    Par parker13 dans le forum VBScript
    Réponses: 1
    Dernier message: 08/07/2006, 00h22
  2. Réponses: 3
    Dernier message: 07/06/2006, 14h40
  3. [VB]Recherche d'une chaine de caractère dans un fichier
    Par Empty_body dans le forum VB 6 et antérieur
    Réponses: 26
    Dernier message: 16/02/2006, 09h10
  4. Ecriture d'une chaine de caractères dans un fichier
    Par fleur_de_rose dans le forum MFC
    Réponses: 6
    Dernier message: 10/02/2006, 09h34
  5. chaines de caractères dans fichier .rc ou .res
    Par raggadoll dans le forum C++Builder
    Réponses: 5
    Dernier message: 22/03/2004, 15h19

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