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 les clés de registre [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 69
    Points : 67
    Points
    67
    Par défaut Script pour les clés de registre
    Bonjour,
    j'essaye d'écrire un script pour supprimer des clés de registre mais je bloque sur une boucle imbriquée.


    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
    REM la variable à modifier selon la recherche.
    set str=test
    REM TODO str en %1:~1,-1
    
    rem parce que c'était une clé avec peu de valeur str=test, mais définit le point de départ de la recherche
    set key=HKLM\SOFTWARE\Classes\Interface
    
    for /f "tokens=1" %%i in ('reg query %key% /s /f %str%') do ( 
    	for /f "tokens=1" %%p in ('echo '%%i' ^| findstr "%key:~4%"') do (
    		rem si %%p:~4 != key:~4
    			rem set ckey=%%p
    			rem reg export %ckey%%%i backup.reg
    			rem reg delete %ckey%%%i
    		rem sinon ckey=%%p
    	)
    )
    L'idée est donc de faire une recherche dans la base de registre à partir d'une chaine.
    A partir de ce résultat, si la ligne est un chemin, mettre à jour ckey puis exporter la clé avant de la supprimer.

    Sauf que je ne parviens pas à récupérer le chemin de la clé pour pouvoir l'exporter.

    J'ai rajouté quelques commentaires pour que ce soit un peu plus clair sur le code.

    Si une bonne âme voulait bien me donner un coup de pouce. ^^'

  2. #2
    Membre habitué

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2011
    Messages : 104
    Points : 191
    Points
    191
    Par défaut
    Bonjour,


    je vois plusieurs erreurs dans ton code:

    si %%p:~4 != key:~4 = if "!variable1:~4!"=="!key:~4!"

    tu dois en plus activer les expansion de variable avant ta boucle pour pouvoir traiter des variables dans celle-ci (setlocal enabledelayedexpansion).
    tu dois aussi definir variable1=%%p .

    test ceci déjà, sa devrait te faire avancer.

    fait quelques recherches sur internet, tu devrait avoir toutes les réponses pour construire ton batch et le comprendre.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 69
    Points : 67
    Points
    67
    Par défaut
    Merci pour le test et le coup de la variable expansée.
    J'étais rapidement passé dessus, car ce que je cherche avant tout pour l'instant

    Mon soucis vient de %key% qui est modifié à l'exécution.
    HKLM étant devenu HKEY_LOCAL_MACHINE.

  4. #4
    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,

    Reg ne fait aucune différence entre le sigle HKLM et sa forme littérale (HKEY...)

    Mais pourquoi tu fais une recherche alors que tu sais à la base quelle clef tu dois exporter et supprimer ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 69
    Points : 67
    Points
    67
    Par défaut
    Reg ne fait pas la différence en paramètre.
    Je me suis mal exprimé d'ailleurs...

    C'est pas key qui est modifié... C'est le chemin en retour de reg qui ne correspond pas à HKLM (l'avantage de cette écriture, c'est que les quatres root key font 4 lettres).
    Je fais mon reg query avec HKLM ou HKEY... et la commande me retourne des chemins HKEY...

    Quant au pourquoi je fais une reg query, c'est parce que justement à la base je ne connais pas son emplacement. Je connais seulement le nom de la clé. Un nom de clé que je veux prendre en paramètre à terme.

    Par contre en ce moment j'ai des erreurs avec les tokens et le retour de reg query. Il suffit d'un espace dans le nom de la clé et ça plante la commande export / del pour la clé en cours.
    J'ai fait une redirection dans un fichier pour savoir les séparateurs de champ, quatre espace dans le fichier, mais à l'affichage des fois il y a plus d'espace, ce qui me laisse croire à des tabulations.

    Je cherche voir pour gérer les tabs, j'ai cru lire que c'était "delims=<tab>" mais j'ai des trucs sortis de l'espace en retour.
    L'idée pour contourner la difficulté serait de mettre en token la chaine REG. Ce que je suis en train de chercher (ça pourrait aussi faire le test sur plusieurs espaces).

  6. #6
    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
    Tu connais au moins le nom de la clef d'interface, un nom de cette forme
    "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}", parce que sinon tu en as pour la journée en batch pour traiter toutes les sous-clefs de "interface".

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 69
    Points : 67
    Points
    67
    Par défaut
    Je m'étais placé dans interface car c'était un endroit où il y avait peu de clés "test". ^^'

    Je sais pas du tout où serait la(les) clé(s) affectée(s) par le script !
    Enfin pas encore...

  8. #8
    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
    Ah oui, mais la base de registre est un ensemble quand même organisé, on ne fait pas un script de suppression de clef sans avoir une cible précise, une petite erreur dans le paramètre et l'ordinateur n'est plus opérationnel.

    Non, non, attends d'avoir plus d'infos sur le besoin réel, après on verra pour une script fiable qui y répond.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 69
    Points : 67
    Points
    67
    Par défaut
    Le but du script étant de supprimer du registre toute trace relative à une chaine précise, l'emplacement de la clé est donc initialement inconnu.

    Sauf si je veux traiter des chaines spécifiques, avec des recherches préalable et coder en dur un chemin d'accès... Mais je perds pas mal en réutilisation du script.

  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
    Ben écoute, donne un exemple précis de ce que tu veux faire en faisant bien la différence entre clef, valeur et donnée, et je t'aiderais à monter ton script.

    Après, bien sur, plus la clef est haute dans la hiérarchie ou l'arborescence si tu préfères, et plus le temps pour le traitement sera lent et te semblera interminable, utilisation de la console et de "for" oblige.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 69
    Points : 67
    Points
    67
    Par défaut
    Je me rends compte que j'avais un petit soucis de vocabulaire, je confondais clé et valeur.

    Je veux avant tout récupérer la valeur pour pouvoir la traiter.
    J'ai trouvé une astuce en utilisant l'underscore comme délimiteur et en ignorant le " REG" (soit 4 caractères).

    J'ai eu peur que des underscores puissent apparaitre dans le nom de valeur, mais j'ai fait un :

    reg query HKLM /v _ /s
    Fin de la recherche*: 0 correspondance(s) trouvée(s).

    Aussi sur ma second boucle je vais avoir :
    set value=%%p
    avec un export %ckey%\%value:~0,-4%

    ***

    Dommage qu'on puisse pas éditer les messages ayant plus de deux jours ?

    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
    REM la variable à modifier selon la recherche.
    set str=test
    REM TODO str en %1:~1,-1
    
    rem parce que c'était une clé avec peu de valeur str=test, mais définit le point de départ de la recherche
    set key=HKLM\SOFTWARE\Classes\Interface
    
    setlocal enableDelayedExpansion 
    for /f "tokens=*" %%i in ('reg query %key% /s /f %str%') do ( 
    	for /f "tokens=1" %%p in ('echo '%%i' ^| findstr "%key:~4%"') do (
    		rem si '%%p' == ''
    			set value=%%i
    			reg export %ckey%!value:~0,-4! backup.reg
    			reg delete %ckey%!value:~0,-4!
    		rem sinon ckey=%%p
    	)
    )
    endlocal

  12. #12
    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
    re,

    À la vue de tes paramètres, je me rends compte que ta version reg est une version de Vista ou 7, alors que moi j'ai la version 3 de XP. Comme les différences sont significatives, je verrais pour récupérer une version plus récente et je te dirais ce qu'il en est demain, au plus tard, en fin de semaine.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 69
    Points : 67
    Points
    67
    Par défaut
    Je m'en suis rendu compte en faisant des tests avec une VM sous XP.
    Et j'aimerai que le batch soit utilisable sur Seven comme sur XP...

    Sauf que j'ai zappé de copier la version XP du batch, qui est pour l'instant sur une autre machine.
    Donc si t'as la commande en tête pour XP, je pourrai la tester sur Seven.

  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
    Ça tombe bien parce que le reg de 7 ne fonctionne pas sous xp, à cause du jeu des interdépendances des libs.

    Sinon, OK, tu veux travailler sur les valeurs, mais une valeur n'est jamais garanti comme étant unique, alors attention aux effets de bord. Ensuite, une fois la valeur détectée, tu veux supprimer la valeur en elle-même ou la clef correspondante et de facto, toutes les autres valeurs qu’elle contient ?

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 69
    Points : 67
    Points
    67
    Par défaut
    Pour la commande "universelle" : reg query %key% /s.
    Mais du coup je dois tester les valeurs pour m'assurer qu'elles correspondent à la chaine

    Je voudrais supprimer la valeur elle-même.

    J'ai abandonné l'idée d'avoir un paramètre, car si présence d'espace, il faut mettre des guillemets, lesquels je n'arrive pas à protéger dans la mesure où ils sont considérés dès que j'essaye de les manipuler.

    Je marque résolu car le script suivant est fonctionnel. Reste le soucis du paramètre.

    Je verrai pour le valider sur XP dans la soirée ou ce week-end.

    ***

    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
    @echo off
    rem variable à modifier selon la recherche
    set str=test
    
    rem clé racine de la recherche, à modifier selon
    set key=HKLM\SOFTWARE\Classes\Interface
    
    rem cmd 7 (recherche "optimale") : reg query HKLM\SOFTWARE\Classes\Interface /s /f %str%
    
    setlocal enableDelayedExpansion
    set /a index=0
    for /f "tokens=*" %%i in ('reg query %key% /s') do (
    	rem vérifie que %p soit une clé valide => ckey
    	rem ne pas mettre d'espace après le i ! C'est joli mais c'est pris dans l'écho.
    	for /f "tokens=*" %%p in ('echo %%i^| findstr "%key:~4%"') do (
    		if '%%i' == '%%p' set ckey=%%p
    	)
    	for /f "tokens=1 delims=_" %%s in ('echo %%i^| findstr "%str%"') do set value=%%s
    		if '!value!' neq '' (
    			set /a index+=1
    			reg export !ckey! /y backup!index!.reg
    			reg delete !ckey! /f /v "!value:~0,-4!"
    		)
    	)
    )
    endlocal
    Merci pour les conseils et infos.

  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
    Ben écoute, je te mets quand même l'ébauche que j'avais fait ce matin en attendant plus de détails de ta part. Je la poste telle quelle, car il ne me semble plus nécessaire de la développer étant donné que t'as passé ta discussion en résolut ou abandonné, je sais pas.

    Bonne continuation.

    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
    @echo off
    set "tmpfile=f_str.tmp"
    set "keyparent=HKEY_LOCAL_MACHINE\SOFTWARE\Macromedia"
    set "value=version"
    set "new="& set "prev="
    rem edition du fichier de recherche pour findstr
    cd.>"%tmpfile%"
    (echo ^^HKEY_.*$
    echo ^^ *%value%	.*$)>>"%tmpfile%"
    
    for /f "tokens=1,* delims=:" %%i in ('reg query "%keyparent%" /s ^| findstr /i /g:"%tmpfile%" ^| findstr /in ".*"') do call :getkey "%%j"
    del "%tmpfile%"
    pause
    goto :eof
    
    :getkey
    set "new=%~1"
    if "%new:~,1%"==" " echo %prev%
    set "prev=%new%"
    goto :eof
    Si jamais tu veux utiliser des paramètres, il suffit de remplacer les lignes 3 et 4 par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set "keyparent=%~1"
    set "value=%~2"

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 69
    Points : 67
    Points
    67
    Par défaut
    Merci pour le coup du %~1 !
    xD

    Je viens de me rendre compte que j'étais passé dessus dans l'aide de for...

    Tu peux m'expliquer les lignes 7 à 11 stp de ton script, stp ?

  18. #18
    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
    C'est pour faire une recherche multiple sur des expressions régulières différentes, que j'enregistre dans un fichier temporaire, et que je transmets à findstr en paramètre avec l'option /g. Cf l'aide en ligne de findstr (findstr /?) pour plus d'infos.

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 69
    Points : 67
    Points
    67
    Par défaut
    Merci encore.

    J'avoue que le coup du findstr avec plusieurs regex est sympathique pour ne garder qu'une boucle et des tests.

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

Discussions similaires

  1. script pour les profil itinerant?
    Par delphino7 dans le forum Windows Serveur
    Réponses: 0
    Dernier message: 31/03/2008, 13h48
  2. [REQUETE] Additionner un champ pour les clés primaires identiques
    Par skeut dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 07/03/2008, 23h13
  3. Script pour les infos système
    Par soulhouf dans le forum Linux
    Réponses: 14
    Dernier message: 12/04/2006, 16h03
  4. Questions sur les clés de registre
    Par cjacquel dans le forum MFC
    Réponses: 1
    Dernier message: 30/04/2005, 19h12

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