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
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.
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
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.
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
@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 \
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.
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.
)
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.
)
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
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.
)
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)
@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.
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.
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! :)
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"
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