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 renommer un fichier XML en fonction de la valeur d'une de ses balises


Sujet :

Scripts/Batch

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Script pour renommer un fichier XML en fonction de la valeur d'une de ses balises
    Bonjour,

    Sauriez vous comment réaliser un script qui renomme un fichier xml en fonction de la valeur d'une des balises qu'il contient ?

    Shématisé cela donnerait le workflow suivant:

    input.xml (contient une balise <id>valeur</id>) => script.bat => output.xml (avec output = valeur)

    Merci d'avance pour vos réponses et conseils

  2. #2
    Membre chevronné
    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
    Points : 1 991
    Points
    1 991
    Par défaut
    Salut,

    celà depends de la structure de ton fichier Xml..

    mais j'ai fait à l'aveuglette un fichier Xml : (file.xml) puis un code qui le renomme selon l'ID


    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
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <Tips>
     <unPeuDeTout>
      <Info>
        <titre>mettre son nom dans la barre des tâches</titre>
        <desc> 
          <ParLeRegistre>
           <clef>HKCU\Control Panel\International</clef>
           <valeur>s1159 s2359</valeur> 
          </ParLeRegistre>
        </desc>
      </Info>
      <Info>
        <titre>comment changer mon nom</titre>
        <desc>
          <ParUnId>
            <id>Mon nouveau nom</id>
          </ParUnId>
        </desc>
      </Info>
      <Info>
       <titre>Ouvrir une nouvelle instance du registre</titre>
       <desc>regedit -m ou bien regedit /m</desc>
      </Info>
     </unPeuDeTout>
    </Tips>
    et voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @echo off
    
    ::_Chemin + nom du fichier Xml
    Set fileXml=C:\dossier 3\file.xml
    
    for /f "tokens=3 delims=<>" %%i In (
      'type "%fileXml%"^|findstr /c:"<id>"') do (
          ren "%fileXml%" "%%i.xml")
    pause

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Automatisation du renommage de fichier
    Merci pour ton code qui répond parfaitement parfaitement à ma question. Super sympas.

    Maintenant je cherche à automatiser tout ça.

    L'idée serait de détecter l'arrivée du fichier XML dans un répertoire temporaire de "renomage", le renommer et le bouger dans un répertoire final si tout s'est bien passé.
    Si une erreur est survenue il faudrait idéalement pouvoir recommencer un certain nombre de fois puis le bouger dans un répertoire erreur si le nombre d'essais est dépassé.

    Merci encore

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    le mieux est d'utiliser WMI.

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Regarde ce tuto, mais en batch cela me semble difficile à réaliser même avec WMIC ou alors il faut creuser

  6. #6
    Membre chevronné
    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
    Points : 1 991
    Points
    1 991
    Par défaut
    salut,

    une autre version du 1er code

    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
    48
    49
    50
    51
    @echo off
    
    goto _jumpInfo
    ================================================================
     Le Script va déclencher un compte à rebours %c% si
     dossier %Source% ne contient pas de fichiers Xml..
     à la présence de fichiers Xml le script va chercher s'il y a 
     une balise <id> et va déclencher un autre compte à rebours %n%
     si l'<id> n'est pas présente..
     Par contre si l'ID est présente, son contenu va être le nouveau 
     nom du fichier Xml, et va ensuite être déplacer vers le dossier 
     %dest% 
    Exemple: <id>Storage 3</id>   --->  Storage.xml
    =================================================================
    :_jumpInfo
    
    Setlocal enableextensions&Set /a c=5,n=5
    
    :_répertoire Source
    Set source=c:\walid2
    
    :_dossier de destination le créer s'il n'existe pas
    Set dest=D:\dest
    If not Exist "%dest%" Md "%dest%"
    
    Pushd "%source%"
    :Loop
     If not exist "*.xml" (for %%V In (CALL Goto:EOF) Do %%V :NotExist)
     (FindStr "<id>" *.xml >NUL)  || (GOTO:NoTag)
     cls&dir /a-d/b "*.xml"&echo/*******************************&Echo/
     for /f "tokens=1,2 delims=:" %%A In ('findstr "<id>" *.xml') do (
     Set _="%%B"
     Call Set _=%%_:^<id^>=#%%
     Call Set _=%%_:^</id^>=#%%
     for /f "tokens=2 delims=#" %%a In ('Call echo.%%_%%^|more') do (
     Move /Y "%%~fA" "%dest%\%%a.xml"
     echo "%%~fA" ------^> %%a.xml))
    Popd
    Pause&Goto:eof
    
    :NoTag
     cls&echo/&echo     PAS DE BALISE ^<id^>: %n%
     Ping -n 5 LocalHost >nul 
     Set /a n-=1
     If %n% neq 0 goto:Loop
     Goto:eof
     :NotExist
     cls&echo/&echo     PAS DE FICHIERS XML: %c%
     Ping -n 5 LocalHost >nul
     Set /a c-=1
     If %c% neq 0 goto:Loop

  7. #7
    Candidat au Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Janvier 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2019
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Depuis dimanche que j'aessaye de le faire fonctioner mais j'arrive pas est possible comprendre ou je me trompe ?

    Citation Envoyé par I'm_HERE Voir le message
    salut,

    une autre version du 1er code

    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
    48
    49
    50
    51
    @echo off
    
    goto _jumpInfo
    ================================================================
     Le Script va déclencher un compte à rebours %c% si
     dossier %Source% ne contient pas de fichiers Xml..
     à la présence de fichiers Xml le script va chercher s'il y a 
     une balise <id> et va déclencher un autre compte à rebours %n%
     si l'<id> n'est pas présente..
     Par contre si l'ID est présente, son contenu va être le nouveau 
     nom du fichier Xml, et va ensuite être déplacer vers le dossier 
     %dest% 
    Exemple: <id>Storage 3</id>   --->  Storage.xml
    =================================================================
    :_jumpInfo
    
    Setlocal enableextensions&Set /a c=5,n=5
    
    :_répertoire Source
    Set source=c:\walid2
    
    :_dossier de destination le créer s'il n'existe pas
    Set dest=D:\dest
    If not Exist "%dest%" Md "%dest%"
    
    Pushd "%source%"
    :Loop
     If not exist "*.xml" (for %%V In (CALL Goto:EOF) Do %%V :NotExist)
     (FindStr "<id>" *.xml >NUL)  || (GOTO:NoTag)
     cls&dir /a-d/b "*.xml"&echo/*******************************&Echo/
     for /f "tokens=1,2 delims=:" %%A In ('findstr "<id>" *.xml') do (
     Set _="%%B"
     Call Set _=%%_:^<id^>=#%%
     Call Set _=%%_:^</id^>=#%%
     for /f "tokens=2 delims=#" %%a In ('Call echo.%%_%%^|more') do (
     Move /Y "%%~fA" "%dest%\%%a.xml"
     echo "%%~fA" ------^> %%a.xml))
    Popd
    Pause&Goto:eof
    
    :NoTag
     cls&echo/&echo     PAS DE BALISE ^<id^>: %n%
     Ping -n 5 LocalHost >nul 
     Set /a n-=1
     If %n% neq 0 goto:Loop
     Goto:eof
     :NotExist
     cls&echo/&echo     PAS DE FICHIERS XML: %c%
     Ping -n 5 LocalHost >nul
     Set /a c-=1
     If %c% neq 0 goto:Loop

  8. #8
    Membre chevronné
    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
    Points : 1 991
    Points
    1 991
    Par défaut
    salut,

    d'abord il faut savoir que les fichiers de commandes NT n'ont pas de vrais outil qui permettent de manipuler XML sans risque...mais voici un petit exemple que tu peux ameliorer et ainsi l'adapter à ton cas

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    C:\Users\walid\AppData\Local\Temp\BAT>dir *.xml /b
    file.xml
     
    C:\Users\walid\AppData\Local\Temp\BAT>type file.xml
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <Tips>
     <unPeuDeTout>
      <Info>
        <titre>mettre son nom dans la barre des tÔches</titre>
        <desc>
          <ParLeRegistre>
           <clef>HKCU\Control Panel\International</clef>
           <valeur>s1159 s2359</valeur>
          </ParLeRegistre>
        </desc>
      </Info>
      <Info>
        <titre>comment changer mon nom</titre>
        <desc>
          <ParUnId>
            <id>25</id>
          </ParUnId>
        </desc>
      </Info>
      <Info>
       <titre>Ouvrir une nouvelle instance du registre</titre>
       <desc>regedit -m ou bien regedit /m</desc>
      </Info>
     </unPeuDeTout>
    </Tips>
    C:\Users\walid\AppData\Local\Temp\BAT>type file.cmd
    @echo off
    setlocal disabledelayedexpansion
     
    :: on enregistre n'importe quelle caractÞre peu utilisable X (ici ascii 12)
    for /f %%z in ('cls') do set "z=%%z"
     
    :: on cherche dans fichier file.xml une balise <id>
    for /f "delims=" %%a in ('type file.xml ^| findstr "<id>"') do (
        set "line=%%a"
        setlocal enabledelayedexpansion
     
        :: on replace les balises ouvrantes et fermantes ID par le caractÞre X
        set "line=!line:<id>=%z%!"
        set "line=!line:</id>=%z%!"
     
        for /f "tokens=*" %%A in ("!line:%z%=!") do (
            endlocal
            set "rmint="
     
            :: on teste si le contenu de la balise est un nombre
            for /f "delims=0123456789" %%_ in ("%%A") do set "rmint=%%_"
     
            :: si c'est le cas et s'il est plus grand que 5 alors on renomme
            if not defined rmint if %%A GTR 5 rename file.xml "%%A.xml"
        )
    )
    endlocal
    C:\Users\walid\AppData\Local\Temp\BAT>file.cmd
     
    C:\Users\walid\AppData\Local\Temp\BAT>dir *.xml /b
    25.xml
     
    C:\Users\walid\AppData\Local\Temp\BAT>


    bons tests

Discussions similaires

  1. Script awk ou ksh pour découper un fichier xml
    Par Griffith dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 15/05/2007, 22h58
  2. [MySQL] Script PHP pour générer un fichier xml
    Par totofe49 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 11/05/2007, 15h12
  3. 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
  4. Réponses: 1
    Dernier message: 10/09/2006, 16h09
  5. Appel d'une fonction pour renommer un fichier
    Par navis84 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 13/04/2006, 15h13

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