web-dev-qa-db-fra.com

Comment puis-je obtenir la valeur d'une clé de registre à partir d'un script batch?

Je dois utiliser une commande REG QUERY pour afficher la valeur d'une clé et définir le résultat dans une variable avec cette commande:

FOR /F "tokens=2* delims=    " %%A IN ('REG QUERY "KeyName" /v ValueName') DO SET Variable=%%B

Mais si la clé n'existe pas, une erreur s'affiche dans la console. J'ai besoin de cacher cette erreur! J'ai essayé de mettre 2> nul après la commande pour arrêter le stderr, mais cela fonctionne si je n'appelle que la commande:

REG QUERY "KeyName" /v ValueName 2>nul

Si je le mets dans la commande FOR comme ceci:

FOR /F "tokens=2* delims=    " %%A IN ('REG QUERY "KeyName" /v ValueName') DO SET Variable=%%B 2>nul

L'erreur est affichée .. Alors, est-ce que quelqu'un sait comment cacher l'erreur? Ou peut-être une autre commande aussi voir si une clé existe ou pas?

Merci

PS: J'utilise Windows XP

55
Fabius

Cela fonctionne pour moi:

@echo OFF

setlocal ENABLEEXTENSIONS
set KEY_NAME="HKEY_CURRENT_USER\Software\Microsoft\Command Processor"
set VALUE_NAME=DefaultColor

FOR /F "usebackq skip=4 tokens=1-3" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
    set ValueName=%%A
    set ValueType=%%B
    set ValueValue=%%C
)

if defined ValueName (
    @echo Value Name = %ValueName%
    @echo Value Type = %ValueType%
    @echo Value Value = %ValueValue%
) else (
    @echo %KEY_NAME%\%VALUE_NAME% not found.
)

usebackq est nécessaire car la commande à REG QUERY utilise des guillemets doubles.

skip=4 ignore toutes les sorties, à l'exception de la ligne contenant le nom, le type et la valeur, s'ils existent.

2^>nul empêche le texte d'erreur d'apparaître. ^ est le caractère d'échappement qui vous permet de placer le > dans la commande for.

Quand j'exécute le script ci-dessus comme donné, j'obtiens cette sortie:

Value Name = DefaultColor
Value Type = REG_DWORD
Value Value = 0x0

Si je change la valeur de VALUE_NAME en BogusValue, j'obtiens ceci:

"HKEY_CURRENT_USER\Software\Microsoft\Command Processor"\BogusValue not found.
55
Patrick Cuff

Ce travail pour moi avec la variable qui contient des espaces sur Windows 7:

FOR /F "usebackq tokens=3*" %%A IN (`REG QUERY "HKEY_LOCAL_MACHINE\Software\SomeAPP" /v ValueName`) DO (
    set appdir=%%A %%B
    )
ECHO %appdir%

La variable A contient toutes les données avant le premier espace, B - reste de ValueName (y compris les espaces supplémentaires), donc appdir = ValueName 

26
Ivan

Sur la base de la solution tryToBeClever (sur laquelle j’ai trébuché et corrigé par essais-erreurs avant de la trouver), je suggère également de passer le résultat de reg query à find afin de filtrer les lignes indésirables en raison de l’incohérence de ! REG.EXE VERSION x.y. Le filtrage find et le réglage tokens permettent également de choisir exactement ce que nous voulons (généralement la valeur). Ajoutons également des guillemets pour éviter des résultats inattendus avec des noms clé/valeur contenant des espaces.

Résultat final proposé lorsque nous ne souhaitons que récupérer la valeur:

@echo off
setlocal ENABLEEXTENSIONS
set KEY_NAME=HKCU\Software\Microsoft\Command Processor
set VALUE_NAME=DefaultColor
for /F "usebackq tokens=3" %%A IN (`reg query "%KEY_NAME%" /v "%VALUE_NAME%" 2^>nul ^| find "%VALUE_NAME%"`) do (
  echo %%A
)

Une limite potentielle d'utilisation de find est que le niveau d'erreur défini par reg lorsque des erreurs se produisent est maintenant obscurci, de sorte que vous ne devriez utiliser cette approche que pour les clés connues et/ou après une validation précédente.

Une toute petite optimisation supplémentaire (ajoutez skip=1 pour éviter de traiter la première ligne de sortie) peut être effectuée dans les cas où le nom de la clé contient également le nom de la valeur (comme c'est le cas avec HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion et CurrentVersion) mais supprime la flexibilité et doit donc uniquement être utilisé. en particulier des cas d'utilisation.

7
Helder Magalhães

Je me rends compte que c’est une vieille question, mais cette version unique est à peu près la même que celle de votre essai initial avec quelques ajouts. Il fonctionne avec les chemins d'accès, y compris les espaces, et fonctionne à la fois dans XP et Windows 7, même si la clé n'est pas trouvée (et masque l'erreur). % fn% sera vide si la clé n'existe pas. Cet exemple obtient le nom du fichier d'arrière-plan actuel du bureau:

for /f "tokens=2*" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper 2^>^&1^|find "REG_"') do @set fn=%%b
5
ChevyNo1
@echo off
setlocal ENABLEEXTENSIONS
set KEY_NAME=HKLM\SOFTWARE\Wow6432Node\Acme Software Inc\Common
set VALUE_NAME=InstallDir

FOR /F "tokens=2*" %%A IN ('REG.exe query "%KEY_NAME%" /v "%VALUE_NAME%"') DO (set pInstallDir=%%B)
echo %pInstallDir%

Cela fonctionne pour moi dans Win7 où la clé a un espace et la valeur aussi un espace . Donc, en enregistrant ce qui précède dans c:\temp en tant que test.bat, ouvrez une fenêtre cmd et exécutez-la.

C:\temp> test

C:\Fichiers de programme (x86)\acme Software Inc\APP \ 

5
sheir

Pour Windows 7 (Professional, 64 bits - je ne peux pas parler pour les autres), je constate que REG ne se fait plus virer 

! REG.EXE VERSION 3.0

comme dans XP. Donc, ce qui précède doit être modifié pour utiliser

skip=2

au lieu de 4, ce qui complique les choses si vous voulez que votre script soit portable. Bien qu’elle soit beaucoup plus lourde et complexe, une solution à base de WMIC peut être meilleure.

4
tryingToBeClever

Pour une raison quelconque, le code de Patrick Cuff ne fonctionne pas sur mon système (Windows 7) probablement à cause du commentaire de TryToBeClever Le modifier un peu a fait l'affaire:

@echo OFF

setlocal ENABLEEXTENSIONS
set KEY_NAME=HKEY_CURRENT_USER\Software\Microsoft\Command Processor
set VALUE_NAME=DefaultColor

FOR /F "tokens=1-3" %%A IN ('REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul') DO (
    set ValueName=%%A
    set ValueType=%%B
    set ValueValue=%%C
)

if defined ValueName (
    @echo Value Name = %ValueName%
    @echo Value Type = %ValueType%
    @echo Value Value = %ValueValue%
) else (
    @echo %KEY_NAME%\%VALUE_NAME% not found.
)
4
niels

Cela fonctionne si la valeur contient un espace:

FOR /F "skip=2 tokens=1,2*" %%A IN ('REG QUERY "%KEY_NAME%" /v "%VALUE_NAME%" 2^>nul') DO (
    set ValueName=%%A
    set ValueType=%%B
    set ValueValue=%%C
)

if defined ValueName (
    echo Value Name = %ValueName%
    echo Value Type = %ValueType%
    echo Value Value = %ValueValue%
) else (
    @echo "%KEY_NAME%"\"%VALUE_NAME%" not found.
)
4
Andrew S

Grand niveau de solutions ici.

Mon petit grain de sel comme solution @Patrick Cuff n'a pas fonctionné à la sortie de la boîte; J'ai eu 2 problèmes

  • J'utilise Windows 7 => remplacé par "skip = 2"
  • La valeur de la valeur de registre contenait un espace Value Value = C:\Program Files\...

Voici la solution que j'ai trouvée: prendre 4 jetons et définir ValueValue sur %% C et %% D. (Merci @ Ivan!)

setlocal ENABLEEXTENSIONS
set KEY_NAME="HKEY_CURRENT_USER\Software\Microsoft\Command Processor"
set VALUE_NAME=DefaultColor

FOR /F "usebackq skip=2 tokens=1-4" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
    set ValueName=%%A
    set ValueType=%%B
    set ValueValue=%%C %%D
)

if defined ValueName (
    @echo Value Name = %ValueName%
    @echo Value Type = %ValueType%
    @echo Value Value = %ValueValue%
) else (
    @echo "%KEY_NAME:"=%\%VALUE_NAME%" not found.
)
4
Jean-Francois T.

Pour obtenir une réponse particulière à la valeur de registre, vous pouvez utiliser la requête suivante:

REG QUERY "Key_Name"/v "Value_Name"/s

exemple: REG QUERY "Processeur de commande HKEY_CURRENT_USER\Software\Microsoft \" "/ v" EnableExtensions "/ s

here /v: Requêtes pour une valeur de clé de registre spécifique.

/ s: interroge toutes les sous-clés et valeurs de manière récursive (comme dir/s)

0
Ishita Kapur
@echo off
setlocal ENABLEEXTENSIONS
set KEY_NAME=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\awhost32.exe
set VALUE_NAME=Path
for /F "usebackq tokens=3" %%A IN (`reg query "%KEY_NAME%" /v "%VALUE_NAME%" 2^>nul ^| find "%VALUE_NAME%"`) do (
  echo %%A
)

Comment gérez-vous un espace dans la variable %% A? Cela se traduit par C:\Program. Le chemin réel est C:\Program Files\Symantec\pcAnywhere.

0
Tom

J'ai rencontré de nombreuses erreurs sur les ordinateurs Windows XP lors de l'utilisation de WMIC (dues par exemple à des fichiers corrompus sur des machines). Il est donc préférable de ne pas utiliser WMIC pour Win XP dans le code. Pas de problèmes avec WMIC sur Win 7 cependant.

0
unseen_rider

Merci, je dois juste utiliser:

SETLOCAL EnableExtensions

Et mettre un:

2^>nul

Dans la requête REG QUERY appelée dans la commande FOR ..__ Merci encore une fois! :)

0
Fabius

Vous pouvez obtenir le value d'une clé de registre comme suit

@echo OFF
setlocal ENABLEEXTENSIONS
set REG_NAME="HKEY_CURRENT_USER\Software\Test"
set KEY_NAME=TestVal

FOR /F "usebackq skip=2 tokens=1-3" %%A IN (`REG QUERY %REG_NAME% /v %KEY_NAME% 2^>nul`) DO (
    @echo %%A : %%C
)
pause

ceux qui se demandent comment ajouter des clés de registre, voici un moyen.

REGEDIT4

; @ECHO OFF
; CLS
; REGEDIT.EXE /S "%~f0"
; EXIT

[HKEY_CURRENT_USER\Software\Test]
"TestVal"="Succeeded"
0
Sameera R.
echo Off
setlocal ENABLEEXTENSIONS

set KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup"
set VALUE_NAME=release 

REG QUERY %KEY_NAME% /S /v %VALUE_NAME%
endlocal

point mis\à la fin de KEY_NAME

0
jacob justin