.BAT - Récupérer "Données" du Registre WINDOWS [Résolu/Fermé]

Signaler
Messages postés
131
Date d'inscription
lundi 13 avril 2009
Statut
Membre
Dernière intervention
12 avril 2020
-
 Micromega -
Bonjour,

J'ai créé une entrée dans le registre Windows qui se présente ainsi :

[HKEY_CLASSES_ROOT\TEST]
@="C:\\Program Files (x86)\\DOSSIER A SUPPRIMER"

D'un autre côté j'ai un .bat qui souhaiterait récupérer la donnée : "C:\\Program Files (x86)\\DOSSIER A SUPPRIMER" afin de supprimer directement le dossier.

Je souhaite utiliser le registre, cela m'évite de faire une recherche longue dans tous les disques.

Comment puis-je récupérer la donnée du registre pour que mon .bat l'utilise ?

C'est au-delà de mes compétences...
Merci pour vos aides.

14 réponses

Messages postés
18187
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
31 juillet 2020
4 937
hello
avec la commande reg, voir :
reg query /?
Messages postés
131
Date d'inscription
lundi 13 avril 2009
Statut
Membre
Dernière intervention
12 avril 2020

Salut Dubcek,

Tout d'abord merci à toi pour m'aider une fois de plus. Tu es toujours là pour filer un coup de pouce, c'est cool !

"Reg Query", c'est bien une partie de code qui me manquait.

J'ai fait : Reg query "HKEY_CLASSES_ROOT\TEST"
et il m'a bien trouvé : C:\Program Files (x86)\DOSSIER A SUPPRIMER

Je souhaite utiliser cette valeur, soit pour effacer un dossier (ici "DOSSIER A SUPPRIMER"), soit lancer un ".exe" qui aura été identifié de la même manière.

Je pensais que c'était simple, j'ai donc fait un code en bat comme ça :

Reg query "HKEY_CLASSES_ROOT\TEST"
rd /s /q "DOSSIER A SUPPRIMER"

Mais je dois être à côté de la plaque finalement. J'ai fait des recherches sur internet mais j'ai rien trouvé qui traite d'une possible action après avoir récupéré le chemin.

Une idée ?

Merci.
Messages postés
18187
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
31 juillet 2020
4 937
il faut extraire le nom de la chaine retournée par reg query essayer:
@echo off
for /F "tokens=3* delims=\" %%a in ('reg query HKEY_CLASSES_ROOT\TEST ^| findstr REG_') do (
echo le chemin d'accès est %%a
set valeur=%%a
)
echo valeur=%valeur%
Bonjour,

Lorsque je lance, j'ai ce message :

Erreur : Erreur : le système n'a pas trouvé la clé ou la valeur de Registre spéc
ifiée.
valeur=
Appuyez sur une touche pour continuer...

j'ai essayé de bidouiller, mais rien de concluant...

:/
Messages postés
18187
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
31 juillet 2020
4 937
en interactif, que retourne la commande
Reg query "HKEY_CLASSES_ROOT\TEST" 
Salut Dubcek,

En fait j'avais commis une erreur en recopiant le code.
Le résultat est plutôt positif, voici ce que j'obtiens :


le chemin d'accÞs est DOSSIER A SUPPRIMER
valeur=DOSSIER A SUPPRIMER
Appuyez sur une touche pour continuer...


Maintenant à quel endroit et comment puis-je insérer un :

rd /s /q (pour supprimer un dossier)
ou
call (pour lancer une application .exe contenu dans le dossier trouvé par la clef registre)
??
Messages postés
18187
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
31 juillet 2020
4 937
remplacer
 echo valeur=%valeur%
par
 rd /s/q "%valeur%"
C'est ici que j'avais essayé également d'incorporer le "RD" ou le "Call", mais je reçois comme message :

"Le fichier spécifié est introuvable" (et cette fois-ci j'ai pas fait d'erreur ;))

Si je fais à la place un :
echo valeur=%valeur%

il me dit :

le chemin d'acc?¿s est DOSSIER A SUPPRIMER
valeur=DOSSIER A SUPPRIMER

Si je fais seulement un :
Reg query "HKEY_CLASSES_ROOT\TEST"
J'obtiens : C:\Program Files (x86)\DOSSIER A SUPPRIMER


Voici le code que j'ai fait en suivant tes indications :

echo off
for /F "tokens=3* delims=\" %%a in ('reg query HKEY_CLASSES_ROOT\TEST ^| findstr REG_') do (
echo le chemin d'accès est %%a
set valeur=%%a
)
rd /s /q "%valeur%"

pause
end

La valeur de "RD" tient compte de tout le chemin donné par "reg query"?

On est vraiment proche du but maintenant...
Messages postés
18187
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
31 juillet 2020
4 937
c'est clair qu'il faut le chemin complet, essayer
echo off
for /F %%a in ('reg query HKEY_CLASSES_ROOT\TEST ^| findstr REG_') do (
echo le chemin d'accès est %%a
set valeur=%%a
)
echo rd /s /q "%valeur%"

pause
end
Essayé, j'obtiens :

Erreur : Erreur : le système n'a pas trouvé la clé ou la valeur de Registre spécifiée.


Nous vaincrons...

:/
Messages postés
18187
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
31 juillet 2020
4 937
avec cette commande ?
('reg query HKEY_CLASSES_ROOT\TEST ^| findstr REG_')
Si je fais simplement :

('reg query HKEY_CLASSES_ROOT\TEST ^| findstr REG_')

J'obtiens :

D:\Bureau>('reg query HKEY_CLASSES_ROOT\OKOK | findstr REG_' )
''reg' n'est pas reconnu en tant que commande interne
ou externe, un programme exécutable ou un fichier de commandes.
Messages postés
131
Date d'inscription
lundi 13 avril 2009
Statut
Membre
Dernière intervention
12 avril 2020

=D

De mieux en mieux : En faisant le dernier code j'obtiens :

rd /s /q "C:\Program Files (x86)\DOSSIER A SUPPRIMER"
Appuyez sur une touche pour continuer...

Mais il n'y a aucune action, le dossier n'est pas supprimé.
J'ai pensé que ça pouvait venir des droits administrateurs, j'ai donc essayé sur un autre disque, mais j'ai le même problème : la commande semble ok, mais il n'y a pas d'action...
Messages postés
18187
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
31 juillet 2020
4 937
il faut enlever le echo dans do (echo rd /s/q "%%b")
Messages postés
131
Date d'inscription
lundi 13 avril 2009
Statut
Membre
Dernière intervention
12 avril 2020

Bravo Dubcek !

Ca fonctionne admirablement bien désormais.
Voici donc le code à utiliser pour supprimer un dossier à partir du chemin du registre :


@echo off
For /F "tokens=3,*" %%a in ('reg query HKEY_CLASSES_ROOT\TEST ^| findstr REG_') do (rd /s /q "%%b")

pause



J'ai pas essayé, mais pour lancer un programme, il me semble qu'il faut remplacer le "rd /s /q" par un "call" tout simplement.

Un grand merci encore à toi Dubcek !
Messages postés
18187
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
31 juillet 2020
4 937
oui, après le do, on peut mettre n'importe quelle commande à la place de rd, et entre () si il y a plusieurs commandes
Messages postés
131
Date d'inscription
lundi 13 avril 2009
Statut
Membre
Dernière intervention
12 avril 2020

Super. Merci Dubcek.
Messages postés
131
Date d'inscription
lundi 13 avril 2009
Statut
Membre
Dernière intervention
12 avril 2020

Bonjour,

Je me permets de ré-ouvrir ce sujet, car après utilisation de cette commande en .bat qui marche parfaitement, je suis tombé sur un problème :

Si à partir d'une clef registre définie, je fais :

For /F "tokens=3,*" %%a in ('reg query HKEY_CLASSES_ROOT\TEST ^| findstr REG_') do (echo rd /s /q "%%b")

Je vais obtenir par exemple :
C:\\Program Files (x86)\\DOSSIER 1\\DOSSIER2

La commande va me supprimer le "DOSSIER 2", mais je voudrais supprimer directement la racine, donc : DOSSIER1 (qui comprend DOSSIER 2 et le reste à l'intérieur)

Ma question est, comment avec cette commande avoir une rétro action ?

Merci de vos aides
Messages postés
18187
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
31 juillet 2020
4 937
pour exécuter un exe
C:> cc
cd "\Program Files (x86)\Dossier 1\\Dossier 2"
call prog.exe
code
@echo off
set reg=C:\Program Files (x86)\Dossier 1\Dossier 2\Dossier 3
setlocal enableDelayedExpansion
For /F "delims=" %%b in ("%reg%") do (
for /f "delims=" %%c in ("%%b") do (
set ff=%%~pc
set ff=!ff:~0,-1!
for /f "delims=" %%d in ("!ff!") do (
echo cd "%%~pd\Dossier 2"
echo call prog.exe
)
)
)
Bonjour Dubcek,

Grace à tes aides et tes conseils, j'arrive à y voir plus clair.

Dans tes derniers codes, je ne comprends pas la ligne :
set reg=C:\Program Files (x86)\Dossier 1\Dossier 2\Dossier 3
Car, le chemin n'est pas forcément dans c:\Program Files

Sinon lors de mes tests, j'ai eu des résultats plutôt positifs, mais j'ai également trouvé un problème :

Si je fais :

setlocal enableDelayedExpansion
For /F "tokens=3,*" %%a in ('reg query "HKEY_CLASSES_ROOT\Suite1\Suite2" ^| findstr REG_') do (
for /f "delims=" %%c in ("%%b") do (
set ff=%%~pc
set ff=!ff:~0,-1!
for /f "delims=" %%d in ("!ff!") do (
rd /s/q "%%~pd"
)
)
)


Le chemin du dossier à supprimer est "\Program Files (x86)\Dossier 1\Dossier 2\Dossier 3". Lorsque je lance le .bat à partir du disque C:\ l'opération réussi. Mais, j'éxécute depuis mon bureau qui est sur D:\ et dans ce cas la commande échoue.

J'ai remarqué que le chemin ne comporte pas la lettre du lecteur, et dans mon utilisation, le .bat ne sera pas forcément sur le lecteur ou se trouve le dossier.

Comment puis-je ajouter la lettre du lecteur (qui est bien présente dans le registre) ?

Merci
Messages postés
18187
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
31 juillet 2020
4 937
Dans tes derniers codes, je ne comprends pas la ligne :
set reg=C:\Program Files (x86)\Dossier 1\Dossier 2\Dossier 3
Car, le chemin n'est pas forcément dans c:\Program Files
c'est un chemin qui pourrait être retourné par le reg query de ta boucle for, je n'ai pas cette clé dans mon registre

c'est %%~pc qui enlève le lecteur.
il faut le récupérer avant avec %%~dc
setlocal enableDelayedExpansion
For /F "tokens=3,*" %%a in ('reg query "HKEY_CLASSES_ROOT\Suite1\Suite2" ^| findstr REG_') do (
for /f "delims=" %%c in ("%%b") do (
set L=%%~dc
set ff=%%~pc
set ff=!ff:~0,-1!
for /f "delims=" %%d in ("!ff!") do (
rd /s/q "!L!%%~pd"
)
)
)
Messages postés
18187
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
31 juillet 2020
4 937
il y aurait un autre moyen avec le chemin, c'est d'utiliser .. le répertoire au dessus, exemple
soit le chemin c=\a\b\c\d
"%c%\.." est \a\b\c
"%c%\..\.." est \a\b
Messages postés
131
Date d'inscription
lundi 13 avril 2009
Statut
Membre
Dernière intervention
12 avril 2020

Bonjour Dubcek,

J'ai fais plusieurs tests et le dernier code fonctionne bien.
Pour l'instant je n'ai pas relevé de problème particuliers.
Je vais continuer certains tests dans les prochains jours, mais j'espère que je n'aurai pas à reposter ici.

Une fois encore merci à toi pour ta patience et ton efficacité.
Messages postés
131
Date d'inscription
lundi 13 avril 2009
Statut
Membre
Dernière intervention
12 avril 2020

Bonjour Dubcek,

Juste une dernière question à propos du code.

J'utilise donc ce code là qui fonctionne très bien :


@Echo off
setlocal enableDelayedExpansion
For /F "tokens=3,*" %%a in ('reg query "CLEF REGISTRE" ^| findstr REG_') do (
for /f "delims=" %%c in ("%%b") do (
set L=%%~dc
set ff=%%~pc
set ff=!ff:~0,-1!
for /f "delims=" %%d in ("!ff!") do (

rd /s/q "!L!%%~pd" >NUL 2>&1

)
)
)


Si je veux aller en avant du chemin que me donne le registre je fais :

"!L!%%~pd\DOSSIER 3\DOSSIER 4" ça fontionne très bien et il n'y a pas de souci.

Mais comment je peux faire pour désigner un dossier qui se trouve en arrière ?
Par exemple si le chemin que me donne le registre est :

c:\TEST\DOSSIER 1\DOSSIER 2

Comment faire pour désigner "DOSSIER 1" ou "TEST" ?

Merci
Messages postés
131
Date d'inscription
lundi 13 avril 2009
Statut
Membre
Dernière intervention
12 avril 2020

Comme ça ? :

@Echo off
setlocal enableDelayedExpansion
For /F "tokens=3,*" %%a in ('reg query "CLEF REGISTRE" ^| findstr REG_') do (
for /f "delims=" %%c in ("%%b") do (
set L=%%~dc
set ff=%%~pc
set ff=!ff:~0,-1!
for /f "delims=" %%d in ("!ff!") do (

C:> set c=C:\TEST\DOSSIER 1\DOSSIER 2

C:> for /F "tokens=1-16 delims=:\" %a in ("%c%") do @echo %b
TEST

C:> for /F "tokens=1-16 delims=:\" %a in ("%c%") do @echo %c
DOSSIER 1

C:> for /F "tokens=1-16 delims=:\" %a in ("%c%") do @echo %d
DOSSIER 2

rd /s/q "!L!%%~pd" >NUL 2>&1

)
)
)
Messages postés
18187
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
31 juillet 2020
4 937
je montrais un exemple en interactif sur mon disque C:
si reg query retourne C:\TEST\DOSSIER 1\DOSSIER 2
alors
For /F "tokens=3,*" %%a in ('reg query "CLEF REGISTRE" ^| findstr REG_') do (
for /F "tokens=1-16 delims=:\" %%p in ("%%b") do (

%%p contient C, %%q TEST, %%r DOSSIER 1, %%s DOSSIER 2
Bonjour Dubcek,

Je comprends bien la méthode, mais je bloque toujours sur la syntaxe.
J'ai fait :

@Echo off
setlocal enableDelayedExpansion
For /F "tokens=3,*" %%a in ('reg query "CLEF REGISTRE" ^| findstr REG_') do (
for /F "tokens=1-16 delims=:\" %%q in ("%%b") do (

echo rd /s/q "%%q"

)
)
)

pause

J'obtiens en réponse : rd /s/q "C"

C'est normal ou je me suis encore trompé dans la syntaxe du code ?

merci.
Messages postés
18187
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
31 juillet 2020
4 937
que veux-tu faire ?
c'est juste, %%q c'est C, %%r TEST, etc
%%q est C sans : parce que : est traité comme séparateur avec \
Bonjour, Dubcek

J'ai compris !

il faut donc faire rd /s/q "%%q:\%%r\Dossier particulier"

pour remonter le dossier et désigner le dossier que l'on souhaite.

Merci à toi. On a fait un bon tour des solutions possibles avec l'utilisation d'une clef registre, je pense.

Merci encore.

A une prochaine ;)