¿Cómo puedo obtener el valor de una clave de registro dentro de un script por lotes?

Necesito usar un comando REG QUERY para ver el valor de una clave y establecer el resultado en una variable con este comando:

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

Pero si la clave no existe, aparece un error en la consola. Necesito ocultar este error! Intenté poner un 2> nul después del comando para detener el stderr, pero esto funciona si solo llamo al comando:

 REG QUERY "KeyName" /v ValueName 2>nul 

Si lo puse en el comando FOR de esta manera:

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

El error se muestra. Entonces, ¿alguien sabe cómo ocultar el error? ¿O tal vez otro comando también ver si existe una clave o no?

Gracias

PD: estoy usando Windows XP

Esto funciona para mí:

 @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 es necesario ya que el comando para REG QUERY usa comillas dobles.

skip=4 ignora todo el resultado excepto la línea que tiene el nombre, el tipo y el valor del valor, si existe.

2^>nul evita que aparezca el texto de error. ^ es el carácter de escape que le permite poner el > en el comando for .

Cuando ejecuto el script anterior como dado, obtengo este resultado:

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

Si cambio el valor de VALUE_NAME a BogusValue entonces obtengo esto:

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

Este trabajo para mí con la variable que contiene espacios en 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 contiene todos los datos antes del primer espacio, B – rest de ValueName (incluidos los espacios adicionales), así que appdir = ValueName

Sobre la base de la solución tryingToBeClever (que también tropecé y me solucionó por prueba y error antes de encontrarlo), también sugiero pasar el resultado de la reg query de reg query través de find para filtrar las líneas no deseadas debido a ! REG.EXE VERSION xy ! REG.EXE VERSION xy inconsistencia. El filtro de find y los ajustes de tokens también permiten elegir exactamente lo que queremos (generalmente el valor). También se agregaron citas para evitar resultados inesperados con nombres de clave / valor que contengan espacios.

Resultado final propuesto cuando solo estamos interesados ​​en obtener el valor:

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

Una advertencia potencial de usar find es que el nivel de error establecido por reg cuando ocurren errores ahora está ofuscado, por lo que uno solo debe usar este enfoque para las claves que se sabe que están allí y / o después de una validación previa.

Se puede realizar una pequeña optimización adicional (agregar skip=1 para evitar el procesamiento de la primera línea de salida) en los casos en que el nombre de la clave también contiene el nombre del valor (como es el caso de HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion y CurrentVersion ) pero elimina la mayor parte de la flexibilidad, por lo que solo debe usarse en casos de uso particulares.

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

Eso funciona para mí en Win7, donde la clave tiene un espacio y el valor también tiene un espacio. Guarde lo anterior en c: \ temp como test.bat, abra una ventana de cmd y ejecútelo.

C: \ temp> prueba

C: \ Archivos de progtwig (x86) \ acme Software Inc \ APP \

Para Windows 7 (Profesional, 64 bits, no puedo hablar por los demás) veo que REG ya no escupe

 ! REG.EXE VERSION 3.0 

como lo hace en XP. Entonces lo anterior necesita ser modificado para usar

 skip=2 

en lugar de 4, lo que complica las cosas si quieres que tu script sea portátil. Aunque es mucho más pesado y complejo, una solución basada en WMIC puede ser mejor.

Por alguna razón, el código de Patrick Cuff no funciona en mi sistema (Windows 7) probablemente debido al comentario de tryingToBeClever. Modificarlo un poco hizo el truco:

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

Esto funciona si el valor contiene un espacio:

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

Me doy cuenta de que esta es una vieja pregunta, pero este one-liner es más o menos el mismo que tu bash original con un par de adiciones. Funciona con rutas que incluyen espacios, y funciona tanto en XP como en Windows 7 incluso si la clave no se encuentra (y oculta el error). % fn% estará vacío si la clave no existe. Este ejemplo obtiene el nombre de archivo de fondo del escritorio actual:

 for /f "tokens=2*" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper 2^>^&1^|find "REG_"') do @set fn=%%b 

Gran nivel de soluciones aquí.

Mi pequeño grano de sal como la solución @Patrick Cuff no funcionó de la caja; Tuve 2 problemas

  • Utilizo Windows 7 => cambiado a “skip = 2”
  • El valor del valor de registro tenía un espacio Value Value = C:\Program Files\...

Aquí está la solución que encontré: tomar 4 tokens y establecer ValueValue en %% C y %% D. (Gracias @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. ) 

Gracias, solo necesito usar:

 SETLOCAL EnableExtensions 

Y pon un:

 2^>nul 

En el REG QUERY llamado en el comando FOR. ¡Muchas gracias de nuevo! 🙂

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

¿Cómo se maneja un espacio en la variable %% A? Esto resulta en C: \ Program. La ruta real es C: \ Archivos de progtwig \ 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 

dot put \ al final de KEY_NAME

He encontrado muchos errores en las computadoras con Windows XP cuando uso WMIC (por ejemplo, debido a archivos dañados en las máquinas). Por lo tanto, lo mejor es no usar WMIC para Win XP en el código. Sin embargo, no hay problemas con WMIC en Win 7.

Puede obtener el valor de una clave de registro de la siguiente manera

 @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 

aquellos que se preguntan cómo agregar claves de registro, aquí hay una manera.

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

Para obtener una respuesta particular al valor del registro, puede usar la siguiente consulta:

REG QUERY “Key_Name” / v “Value_Name” / s

por ejemplo: REG QUERY “HKEY_CURRENT_USER \ Software \ Microsoft \ Command Processor” / v “EnableExtensions” / s

aquí / v: Consultas para valores de clave de registro específicos.

/ s: consulta todas las subclaves y valores recursivamente (como dir / s)

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