batch file - programacion - ¿Cómo puedo obtener el valor de una clave de registro dentro de un script por lotes?
lenguaje batch (16)
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
- resto de ValueName (incluidos los espacios adicionales), así que appdir = ValueName
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.
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.
)
Gracias, solo necesito usar:
SETLOCAL EnableExtensions
Y pon un:
2^>nul
En el REG QUERY llamado en el comando FOR. ¡Muchas gracias de nuevo! :)
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.
)
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.
Me doy cuenta de que esta es una vieja pregunta, pero este one-liner es más o menos el mismo que tu intento 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
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.
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)
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.
)
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"
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=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 programa / Symantec / pcAnywhere.
@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 programa (x86) / acme Software Inc / APP /
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
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"