.BAT - Récupérer "Données" du Registre WINDOWS
RésoluMicromega -
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.
- Reg query
- Registre windows - Guide
- Creer un fichier .bat - Guide
- Clé windows 10 - Guide
- Montage video windows - Guide
- Fin windows 10 - Guide
14 réponses
La problématique porte sur l’extraction d’un chemin stocké dans une clé de registre Windows pour qu’un fichier batch puisse supprimer ce dossier ou lancer un executable.
Les solutions évoquées utilisent Reg query pour récupérer le chemin enregistré sous HKEY_CLASSES_ROOT\TEST, puis une boucle FOR /F avec l’extension delayed expansion afin d’extraire et recomposer le chemin sans perte d’espaces.
Des exemples montrent d’extraire le chemin avec %%~pb, de retirer le caractère final et d’assembler le chemin complet avant d’employer rd /s /q ou call pour lancer un exécutable dans le dossier trouvé.
En pratique, tester avec echo et gérer les guillemets ou les espaces est indispensable, car Reg query peut renvoyer des valeurs entre guillemets et contenir des espaces.
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.
@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%
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...
:/
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionEn 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)
??
"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...
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
Erreur : Erreur : le système n'a pas trouvé la clé ou la valeur de Registre spécifiée.
Nous vaincrons...
:/
('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.
J'ai fait :
For /F %a in ('reg query HKEY_CLASSES_ROOT\TEST | findstr REG_') do (e
cho le chemin d'accès est %a )
Et j'obtiens :
(echo le chemin d'accès est (par )
le chemin d'accès est (par
Il me trouve un chemin d'accès qui est "Par", ça correspond à quelque chose en .bat ?
En tout cas là il répond quelque chose, il n'y a pas d'erreur.
Si j'exécute (en .bat) le dernier code que tu m'as transmis tout semble ok, il trouve bien le bon chemin à partir du registre :
le chemin d'accès est (par défaut) REG_SZ C:\Program Files (x86)\DOSSIER A SUPPRIMER
Appuyez sur une touche pour continuer...
J'ai rééssayé d'ajouter un RD /q /s à la suite sous divers tentatives, mais ça n'a pas fonctionné.
Ce qui est sûre c'est que l'on récupère le bon chemin à partir du registre.
Et ce qui bloque c'est de réutiliser ce chemin afin de supprimer le dossier...
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
J'ai fais :
For /F "tokens=3,*" %%a in ('reg query "HKEY_CLASSES_ROOT\TEST" ^| findstr REG_') do (rd /s /q "%%~pb")
Cela semble avoir fonctionné (je ne suis pas encore tout à fait sûr), mais j'aurais besoin de retourner encore une fois en arrière, que faut-il ajouter pour retourner en arrière?
Merci
Il n'y a pas moyen à partir de ça :
For /F "tokens=3,*" %%a in ('reg query "HKEY_CLASSES_ROOT\TEST" ^| findstr REG_') do (rd /s /q "%%~pb")
d'avoir quelque chose de plus simple pour désigner des dossiers précédents au dossier que désigne la clef registre?
Merci :)
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
@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
)
)
)
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.