Comment puis-je obtenir la valeur d’une clé de registre à partir d’un script de traitement par lots?

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 apparaît dans la console. J’ai besoin de cacher cette erreur! J’ai essayé de mettre un 2> nul après la commande pour arrêter le stderr, mais cela fonctionne si j’appelle seulement 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 non?

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 toute la sortie sauf pour la ligne qui porte le nom, le type et la valeur de la valeur, si elle existe.

    2^>nul empêche l’ 2^>nul du texte d’erreur. ^ est le caractère d’échappement qui vous permet de placer le > dans la commande for .

    Lorsque je lance le script ci-dessus, j’obtiens cette sortie:

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

    Si je change la valeur de VALUE_NAME en BogusValue alors j’obtiens ceci:

     "HKEY_CURRENT_USER\Software\Microsoft\Command Processor"\BogusValue not found. 

    Cela fonctionne 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 – rest une partie de ValueName (y compris les espaces supplémentaires), donc appdir = ValueName

    Sur la base de la solution TryToBeClever (que j’ai également trouvée par erreur avant de la trouver), je suggère également de transmettre la sortie de résultat de reg query via find afin de filtrer les lignes non désirées dues à ! REG.EXE VERSION xy ! REG.EXE VERSION xy incohérence. Le filtrage de la find et le réglage des tokens permettent également de choisir exactement ce que nous voulons (généralement la valeur). Également ajouté des guillemets pour éviter des résultats inattendus avec des noms de 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 mise en garde possible de l’utilisation de find est que le errorlevel défini par reg lorsque des erreurs se produisent est maintenant masqué, il ne faut donc utiliser cette approche que pour les clés connues pour être présentes et / ou après une validation précédente.

    Une minuscule optimisation supplémentaire (add 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 plus grande souplesse, il ne doit donc être utilisé que dans des cas d’utilisation particuliers.

     @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 a également un espace. Donc en enregistrant ce qui précède dans c: \ temp comme test.bat, ouvrez une fenêtre cmd et exécutez-la.

    C: \ temp> test

    C: \ Program Files (x86) \ Logiciel Acme Inc \ APP \

    Pour Windows 7 (Professional, 64 bits – ne peut pas parler pour les autres), je constate que REG ne crache plus

     ! 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 rend les choses compliquées si vous voulez que votre script soit portable. Bien qu’il soit beaucoup plus lourd et complexe, une solution basée sur WMIC peut être meilleure.

    Pour une raison quelconque, le code de Pasortingck Cuff ne fonctionne pas sur mon système (Windows 7) probablement à cause du commentaire de TryToBeClever. La 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. ) 

    Je me rends compte que c’est une vieille question – mais ce one-liner est à peu près le même que votre essai original avec quelques ajouts. Il fonctionne avec des chemins, y compris des espaces, et fonctionne à la fois dans XP et Windows 7 même si la clé est introuvable (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 

    Excellent niveau de solutions ici.

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

    • J’utilise Windows 7 => changé pour “sauter = 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. ) 

    Merci, j’ai juste besoin d’utiliser:

     SETLOCAL EnableExtensions 

    Et mettre un:

     2^>nul 

    Dans le REG QUERY appelé dans la commande FOR. Merci encore une fois! 🙂

     @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.

     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

    J’ai rencontré beaucoup d’erreurs sur les ordinateurs Windows XP lors de l’utilisation de WMIC (par exemple en raison de fichiers corrompus sur les machines). Par conséquent, il est préférable de ne pas utiliser WMIC pour Win XP en code. Aucun problème avec WMIC sur Win 7 cependant.

    Vous pouvez obtenir la valeur 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 append des clés de reg, voici un moyen.

     REGEDIT4 ; @ECHO OFF ; CLS ; REGEDIT.EXE /S "%~f0" ; EXIT [HKEY_CURRENT_USER\Software\Test] "TestVal"="Succeeded" 

    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

    Par exemple: REG QUERY “HKEY_CURRENT_USER \ Software \ Microsoft \ Processor Processor” / v “EnableExtensions” / s

    here / v: requêtes pour des valeurs de clé de registre spécifiques.

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

     set regVar_LocalPrjPath="LocalPrjPath" set regVar_Path="HKEY_CURRENT_USER\Software\xyz\KeyPath" :: ### Resortingeve VAR1 ### FOR /F "skip=2 tokens=2,*" %%A IN ('reg.exe query %regVar_Path% /v %regVar_LocalPrjPath%') DO set "VAR1=%%B"