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 :

Rechercher et renommer une chaine de caractère complexe dans un fichier texte [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Par défaut Rechercher et renommer une chaine de caractère complexe dans un fichier texte
    Bonjour à tous,

    Aujourd'hui je m'adresse à vous car je suis totalement perdu. Depuis peu j'essaye d'automatiser certaines tâches par des scripts, mais je dois avouer que je n'y connais rien.

    Il se trouve que dans mon entreprise nous utilisons un logiciel (sur une cinquantaine de postes) qui utilise les listes blanches et noires. Il faudrait que j'arrive à modifier une suite de ces valeurs sans toucher aux autres. Car il me faudrait un temps monstre pour tout faire à la main, que je n'ai pas. De plus, tous les ordis ont des listes blanches et noires différentes.

    P.ex :
    "Whitelist"=hex(7):32,00,34,00,37,00,37,35,00,39,39,00,39,00,31,00,39,00,00,00,\
    36,00,36,00,35,00,32,00,37,00,34,00,36,00,34,00,35,00,00,00,32,00,34,00,37,\

    je voudrais remplacer : 00,35,00,00,00,32,00,34,00,37,\
    par : 00,39,00,33,00,35,00,30,00,31,\

    mais malgré mes recherches et les nombreux posts à ce sujet je ne suis arrivé à rien...

    Si une âme généreuse pouvait m'aider...

    Merci...

  2. #2
    Membre Expert Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Par défaut
    Il va falloir être plus précis sur ce que tu veux remplacer.
    J'imagine que la c'est un exemple que tu donnes, il faut que tu nous donnes la règle de gestion générale.
    Veux-tu remplacer les n derniers nombres ? Toujours la même serie de nombres ? Autre ?

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Par défaut
    Hey,

    En réalité, ce que je veux faire c'est :
    1* extraire la clé de registre
    2* si la valeur existe, la modifier en la remplaçant seulement, sans porter atteinte aux autres
    3* puis la réinjecter
    4* relancer le service

    Je sais tout faire sauf le 2*.

    Oui c'est toujours la même série de nombre que je veux changer, s'il existe, qui correspond à un numéro d'autorisation d'accès (généré à partir du numéro de série de la carte mère) de l'ancien ordi sortant par celui du nouvel ordi.

    Je ne sais pas si je suis assez compréhensible...

    J'ai dans mon fichier texte (Text.txt) :

    "Whitelist"=hex(7):32,00,34,00,37,00,37,35,00,39,39,00,39,00,31,00,39,00,00,00,\
    36,00,36,00,35,00,32,00,37,00,34,00,36,00,34,00,35,00,00,00,32,00,34,00,37,\

    00,39,00,00,00

    Le code de l'ancien ordi : 00,00,00,\
    36,00,36,

    à remplacer par : 34,00,37,\
    00,39,00,

    Voila, j'espère que tu auras compris... (...pas sûr avec mes explications...)

    Mais qu'est ce que tu entends par "la règle générale de gestion" ?

    J'ai essayé de composer autour des idées de scripts que j'ai glané :
    http://blogs.technet.com/b/heyscript...text-file.aspx
    (que je n'arrive pas à faire fonctionner, il ne fait que rajouter un carré à la fin du fichier Text.txt)

    puis j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for /f "delims=," %%a in ('type Text.txt') do call :commande "%%a"
    :commande
    set ligne=%ligne:00,00,00,\36,00,36,=34,00,37,\00,39,00,%
    @echo %ligne% >>Text2.txt
    Même en potassant, je n'arrive pas à trouver la solution...

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Par défaut
    Petit retour, j'ai trouvé ça mais comme je débute en script que depuis un mois... Mon niveau n'est pas assez suffisant pour bien le comprendre...
    Qu'est ce que vous en pensez ?

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    Private Function ChangeWords(sWordsToRemove, sWordsToChange, sFile)
    
        If FileExists(sFile) Then
    '       ouvre le  fichier
            Dim sBuffer
            sBuffer = ReadDataFromFile(sFile)
    '       ligne à changer existe?
            If InStr(1, sBuffer, sWordsToRemove) > 0  Then
                sBuffer = Replace(sBuffer, sWordsToRemove,  sWordsToChange)
                WriteDataToFile sFile, sBuffer
                ChangeWords = True
            End If
    End Function
    
    
    Function ReadDataFromFile(sPathFile)
    '    reader
        Dim oFSO
        Set oFSO = CreateObject("Scripting.fileSystemObject")
    '    fichier
        Dim oFile
        Set oFile = oFSO.GetFile(sPathFile)
    '   stream
        Dim oStream
        Set oStream = oFile.OpenAsTextStream(ForReading)
        
    '   retour
        ReadDataFromFile = oStream.ReadAll
    '   nettoyage
        oStream.Close
        Set oStream = Nothing
        Set oFile = Nothing
        Set oFSO = Nothing
    End Function
    
    Function FileExists(sPathFile)
    '    reader
        Dim oFSO
        Set oFSO = CreateObject("Scripting.fileSystemObject")
        
    '    retour
        FileExists = oFSO.FileExists(sPathFile)
        
    '   nettoyage
        Set oFSO = Nothing
    End Function
    
    Sub WriteDataToFile(sPathFile, sData)
    '   reader
        Dim oFSO
        Set oFSO = CreateObject("Scripting.fileSystemObject")
    '   fichier : chemin, 2 pour  écrire (et écraser), True pour forcer la création du fichier
        Dim oFile
        Set oFile = oFSO.openTextFile(sPathFile, 2, True)
    '   écriture
        oFile.Write sData
    '    nettoyage
        oFile.Close
        Set oFile = Nothing
        Set oFSO = Nothing
    End Sub
    
    'UTILISATION  :
    WriteDataToFile "c:\machin.txt", "mon texte à écrire"

  5. #5
    Membre Expert Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Par défaut
    for /f "delims=," %%a in ('type Text.txt') do call :commande "%%a"
    :commande
    set ligne=%ligne:00,00,00,\36,00,36,=34,00,37,\00,39,00,%
    @echo %ligne% >>Text2.txt

    J'imagine que les \ dans ton fichier de texte sont des retours à la ligne ? Que ce soit le cas ou non, si le format de ton fichier est bien sur plusieurs lignes comme indiqué, c'est ça le plus génant.
    Tu ne peux pas non plus simplement faire le set comme indiqué sur chaque demi-ligne, car tu risque de remplacer des choses que tu ne veux pas.


    Par règle de gestion je veux dire quelque chose de toujours vrai qui permet de trouver facilement la chaine à remplacer.
    Par exemple dans ton cas, les 00,00,00\ en fin de première ligne et les 36,00,36 en début de seconde.
    Les lignes font-elles toujours le meme nombre de caractères ?
    ...

    Toutes ces questions permetteront de répondre ensuite plus ou moins facilement à ton problème.


    Pour ce qui est du script que tu indiques dans ton dernier post. Ce n'est plus du batch mais du VBScript. Tu peux faire ce que tu souhaites en VB, mais tu n'es plus sur le bon forum.

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Par défaut
    Citation Envoyé par Drizzt [Drone38] Voir le message
    J'imagine que les \ dans ton fichier de texte sont des retours à la ligne ?

    Les lignes font-elles toujours le meme nombre de caractères ?

    Pour ce qui est du script que tu indiques dans ton dernier post. Ce n'est plus du batch mais du VBScript. Tu peux faire ce que tu souhaites en VB, mais tu n'es plus sur le bon forum.
    Oui ce sont des retours à la ligne...

    Non elles ne font pas toutes le même nombre de caractères... Car j'aurais bien essayé de mettre des tokens... (Enfin si je ne me trompe pas...)

    Euh... Là ou j'en suis je prends tout, batch ou vbscript !

  7. #7
    Membre Expert Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Par défaut
    Dans tous les cas il faut que tu repondes à ma question, comment identifier ta chaine dans le fichier de la façon la plus précise possible, idéalement unique.

    Sans ça, ce n'est pas la peine de commencer à chercher une solution.


    La réponse attendu peut aller de :
    - Suite : 00,00,00,36,00,36, à n'importe quelle position, éventuellement sur plusieurs lignes.
    à
    - 00,00,00 en fin de la première ligne du fichier, suivi de 36,00,36 en début de seconde ligne avec des lignes de longueur fixes.

    Dans le premier cas par exemple, se pose un problème d'unicite. Si tu as la ligne suivante : 32,00,34,00,00,00,36,00,36,32,00,00
    En supposant qu'un PC est identifié par 6 nombres, les parties oranges et vertes vont représenter deux PC différents et cependant le script va remplacer la fin du premier et le début du second en pensant qu'il s'agit du PC cible.


    De tes précedents postes, en supposant qu'un PC est sur 6 nombres, ta règle de gestion serait peut etre :
    - Suite 00,00,00,36,00,36, débutant à une position 0,6,12,18 ... du fichier, éventuellement sur plusieurs lignes.

    Est-ce bien cela ?

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Par défaut
    Citation Envoyé par Drizzt [Drone38] Voir le message
    Dans tous les cas il faut que tu répondes à ma question, comment identifier ta chaine dans le fichier de la façon la plus précise possible, idéalement unique.
    Oui c'est un numéro unique. Pour la seule façon de l'identifier correctement, c'est de le choper son ID depuis l'ordi source.

    Dans le fichier source, chaque ID fait 51 caractères, séparé par 00,00,00, avant et après. Le soucis, c'est qu'il peut aussi aussi aller à ligne en plein milieu de l'ID.

    Citation Envoyé par Drizzt [Drone38] Voir le message
    La réponse attendu peut aller de :
    - Suite : 00,00,00,36,00,36, à n'importe quelle position, éventuellement sur plusieurs lignes.
    Oui c'est ça !

    - 00,00,00 en fin de la première ligne du fichier, suivi de 36,00,36 en début de seconde ligne avec des lignes de longueur fixes.

    Citation Envoyé par Drizzt [Drone38] Voir le message
    Dans le premier cas par exemple, se pose un problème d'unicite. Si tu as la ligne suivante : 32,00,34,00,00,00,36,00,36,32,00,00
    Non je ne pense pas car les 00,00,00 sont des séparateurs... Je pense qu'ils doivent prévenir ce genre de cas non ?

    Citation Envoyé par Drizzt [Drone38] Voir le message
    En supposant qu'un PC est identifié par 6 nombres, les parties oranges et vertes vont représenter deux PC différents et cependant le script va remplacer la fin du premier et le début du second en pensant qu'il s'agit du PC cible.
    ID est composé de 17 nombres, séparé par des ,

    Citation Envoyé par Drizzt [Drone38] Voir le message
    De tes précedents postes, en supposant qu'un PC est sur 6 nombres, ta règle de gestion serait peut etre :
    - Suite 00,00,00,36,00,36, débutant à une position 0,6,12,18 ... du fichier, éventuellement sur plusieurs lignes.
    D'accord je crois comprendre, oui c'est bien cela, la suite 1 débutant sur n'importe qu'elle position, si elle est trouvé, est remplacé par la suite 2.

  9. #9
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Salut,

    Ta "liste blanche" là, c'est ni plus ni moins qu'une valeur de registre de type chaines multiple, c'est sûr, sur un export depuis la bdr c'est moins parlant. Essaye avec l'utilitaire reg (suivant les systèmes d'exploitation) ce sera plus compréhensible, et si tu as un droit suffisant sur les machines, un fichier INF pourra aussi faire l'affaire.

  10. #10
    Membre Expert Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Par défaut
    Ben moi je suis perdu,

    Tu me parles d'ID sur 17 nombres alors que dans tes exemples tu voulais en remplacer 6.
    Tu me dis que les 00 sont des séparateurs et la encore tu l'avais mis dans ton exemple.

    Du coup je sais plus du tout ce que tu veux remplacer.

  11. #11
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Juin 2011
    Messages : 9
    Par défaut
    Merci minnesota,

    Grâce à toi j'ai résolu mon problème... La solution se trouvait bien dans un fichier inf...

    Merci à Drizzt pour ta patience... Ne connaissant pas ces commandes, ni l'interprétation des fichiers INF, je suis parti dans quelque chose d'hyper compliqué... Je te prie de m'excuser encore...

  12. #12
    Membre Expert
    Inscrit en
    Avril 2010
    Messages
    1 495
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1 495
    Par défaut
    Citation Envoyé par Drizzt [Drone38] Voir le message
    Ben moi je suis perdu
    En vrac, quelques infos sur le sujet, notamment pour comprendre la structure de la donnée.

    Un export reg typique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Windows Registry Editor Version 5.00
    
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dhcp]
    "DependOnService"=hex(7):54,00,63,00,70,00,69,00,70,00,00,00,41,00,66,00,64,00,\
      4e,00,65,00,74,00,42,00,54,00,00,00,00,00
    L’export reg d'une donnée reg_multi_sz, reconnaissable par son marqueur "hex(7)", est une représentation UTF-16 Little Endian de cette donnée, ou chaque caractère alphanumérique-symbolique est codé sur deux octets où un 0D000A00 marque un saut de ligne CRLF (0x0D-0x0A,d13-d10).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    540063007000690070000D000A004100660064000D000A004E0065007400420054000D000A00
    Contenu de la donnée multi-chaines.

    Tcpip
    Afd
    NetBT
    + une ligne vide sans passage à la ligne.
    Sortie requête reg :

    --- instruction -- >reg query hklm\system\currentcontrolset\services\dhcp /v dependonservice

    ! REG.EXE VERSION 3.0

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dhcp
    dependonservice REG_MULTI_SZ Tcpip\0Afd\0NetBT\0\0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Tcpip		T.c.p.i.p.....	54006300700069007000-----0D000A00	+++++ 54,00,63,00,70,00,69,00,70,00-----00,00		
    Afd		A.f.d.....	410066006400-----0D000A00		+++++ 41,00,66,00,64,00----00,00
    NetBT		N.e.t.B.T.....	4E006500740042005400----0D000A00        +++++ 4e,00,65,00,74,00,42,00,54,00-----00,00
    ligne vide      ligne vide	0000					+++++ 00,00
    note : le système d'exploitation n'accepte pas de ligne vide ou chaines vides (autre que la dernière ligne) dans une donnée de type reg_multi_sz, et supprime toutes les chaînes vides qu'il trouve à chaque traitement de la donnée

    Donc il ne peut jamais y avoir ceci :

    Tcpip
    Afd
    NetBT
    ligne vide
    DmServer
    C'est ainsi qu'une succession de 00,00,00,00 marque à coup sûr la fin du contenu de la donnée
    est une succession de 00.00. le séparateur des donnée dans un export reg d'une donnée multi-chaines.

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 01/09/2014, 16h12
  2. Rechercher et remplacer une chaine à un endroit précis dans un fichier
    Par david2109 dans le forum Shell et commandes POSIX
    Réponses: 17
    Dernier message: 26/08/2013, 22h35
  3. Réponses: 10
    Dernier message: 07/07/2011, 13h19
  4. Réponses: 11
    Dernier message: 05/11/2007, 14h38

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