Comment puis-je obtenir la valeur d'une clé de registre à partir d'un script de commandes?
J'ai besoin d'utiliser un REG de la commande de REQUÊTE pour afficher la valeur d'une clé et de 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, j'obtiens une erreur affiché 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 je ne l'appel de la commande:
REG QUERY "KeyName" /v ValueName 2>nul
Si je l'ai mis dans la commande comme ceci:
FOR /F "tokens=2* delims= " %%A IN ('REG QUERY "KeyName" /v ValueName') DO SET Variable=%%B 2>nul
L'erreur est indiqué.
Donc, personne ne sait comment cacher l'erreur? Ou peut-être une autre commande trop voir si une clé existe ou pas?
Grâce
PS: je suis sous Windows XP
Vous devez vous connecter pour publier un commentaire.
Cela fonctionne pour moi:
usebackq
est nécessaire, car la commande deREG QUERY
utilise des guillemets doubles.skip=4
ignore toutes les données de sortie, sauf pour la ligne qui a le nom de la valeur, le type et la valeur, si elle existe.2^>nul
empêche le texte de l'erreur d'apparaître.^
est le caractère d'échappement qui vous permet de mettre la>
dans lefor
commande.Quand je lance le script ci-dessus comme donné, j'obtiens ce résultat:
Si je change la valeur de
VALUE_NAME
àBogusValue
puis-je obtenir ceci:skip=2
FOR /F "usebackq skip=2 tokens=1-2*
HKLM\Software
ont 32/64 bits versions. utilisation/reg:64
et/reg:32
à un accès approprié de l'arbre.for /f "usebackq tokens=1-2*" %%a IN ('^(reg query %KEY_NAME% /v %VALUE_NAME% ^| find "%VALUE_NAME%"^) 2^>nul')
? Sauf KEY_NAME contient VALUE_NAME de cette façon, il n'y a pas besoin de s'inquiéter du nombre de lignes reg.exe impressions avant la valeur.Ce travail pour moi avec la variable qui contient des espaces sur Windows 7:
Variable
A
contient toutes les données avant le premier espace,B
- reste de ValueName (y compris les espaces), de sorteappdir = ValueName
3*
est important de vous assurer que l'ensemble reg valeur va dans%%B
Basé sur tryingToBeClever solution (que j'ai aussi tomber sur et moi-même fixé par essais et erreurs avant de le trouver), je propose également le résultat le passage de sortie de
reg query
parfind
dans le but de filtrer les indésirables lignes en raison de la! REG.EXE VERSION x.y
incohérence. Lefind
de filtrage et detokens
peaufiner permet également de choisir exactement ce que nous voulons (généralement la valeur). Également ajouté des guillemets pour éviter des résultats inattendus avec clé/valeur des noms contenant des espaces.Résultat Final proposé lorsque nous sommes seulement intéressés à l'extraction de la valeur:
Un potentiel de mise en garde de l'utilisation de
find
est que le niveau fixé parreg
lorsqu'une erreur se produit est désormais brouillée si l'on ne devrait utiliser cette approche pour les touches connu pour être là et/ou après la validation précédente.Une petite optimisation supplémentaires (ajouter
skip=1
pour éviter le traitement de la première ligne de sortie) peut être fait dans les cas où le nom de la clé contient également le nom de la valeur (comme c'est le cas avecHKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion
etCurrentVersion
) mais supprime plus de souplesse afin de ne devrait être utilisé, en particulier, des cas d'utilisation.Qui fonctionne pour moi dans Win7 où la clé a un espace et de la valeur dispose également d'un espace.
Afin de gagner le ci-dessus dans c:\temp en tant que test.chauve-souris, ouvrez une fenêtre de commande et l'exécuter.
C:\temp>test
C:\Program Files (x86)\acme Software Inc\APP\
Je réalise que c'est une vieille question - mais ce one-liner est à peu près le même que celui de votre originaux essayer avec un couple d'ajouts. Il fonctionne avec des chemins, espaces compris, et fonctionne dans les deux XP et Windows 7, même si la clé n'est pas trouvée (et cache l'erreur). %fn% sera vide si la clé n'existe pas. Cet exemple renvoie l'actuel arrière-plan du bureau nom du fichier:
Pour Windows 7 Professionnel 64 bits ne peux pas parler pour les autres), je vois que REG no plus crache
comme dans XP. Ci-dessus doit être modifié pour utiliser
au lieu de 4 - ce qui rend les choses en désordre si vous voulez que votre script pour être portable. Bien qu'il soit beaucoup plus lourd et complexe, un WMIC solution basée sur le peut-être mieux.
Pour une raison quelconque Patrick Manchette code ne fonctionne pas sur mon système (Windows 7), probablement en raison de tryingToBeClever commentaire. En le modifiant un peu fait le tour:
Cela fonctionne si la valeur contient un espace:
Grand niveau de solutions ici.
Mon petit grain de sel, comme la solution de @Patrick Manchette de ne pas travailler hors de la boîte, j'ai eu 2 problèmes
Value Value = C:\Program Files\...
Voici la solution que j'ai trouvé: prendre 4 jetons et réglage ValueValue de %%%C et%D. (Merci @Ivan!)
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\Command Processor" /v "EnableExtensions" /s
ici
/v : les Requêtes spécifiques de valeurs de clé de registre.
/s : les Requêtes de toutes les sous-clés et valeurs de manière récursive (comme dir /s)
Merci, j'ai juste besoin de l'utiliser:
Et de mettre un:
Dans le REG QUERY appelé dans la commande.
Merci beaucoup encore une fois! 🙂
Comment gérez-vous un espace dans le %%Une variable? Il en résulte C:\Program. Le chemin est C:\Program Files\Symantec\pcAnywhere.
point de mettre \ à la fin de KEY_NAME
Je suis venu à travers de nombreuses erreurs sur les ordinateurs Windows XP lors de l'utilisation de WMIC (par exemple dues à des fichiers corrompus sur les machines). Donc imo préférable de ne pas utiliser WMIC pour Win XP dans le code. Pas de problèmes avec WMIC sur Win 7.
Vous pouvez obtenir le valeur d'un clé de registre comme suit
ceux qui se demandent comment ajouter reg touches, ici, c'est un moyen.