Как получить значение раздела реестра из пакета script?
Мне нужно использовать команду REG QUERY для просмотра значения ключа и установить результат в переменную с помощью этой команды:
FOR /F "tokens=2* delims= " %%A IN ('REG QUERY "KeyName" /v ValueName') DO SET Variable=%%B
Но если ключ не существует, я получаю сообщение об ошибке, отображаемое в консоли. Мне нужно скрыть эту ошибку! Я попытался поместить 2 > nul после команды, чтобы остановить stderr, но это работает, если я вызываю только команду:
REG QUERY "KeyName" /v ValueName 2>nul
Если я поместил его в команду FOR так:
FOR /F "tokens=2* delims= " %%A IN ('REG QUERY "KeyName" /v ValueName') DO SET Variable=%%B 2>nul
Отображается ошибка.
Так кто-нибудь знает, как скрыть ошибку? Или, может быть, другая команда тоже видит, существует ли ключ или нет?
Спасибо
PS: Я использую Windows XP
Ответы
Ответ 1
Это работает для меня:
@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
необходимо, так как команда REG QUERY
использует двойные кавычки.
skip=4
игнорирует все выходные данные, за исключением строки, которая имеет имя, тип и значение, если оно существует.
2^>nul
предотвращает появление текста ошибки. ^
- это символ escape, который позволяет помещать >
в команду for
.
Когда я запускаю script выше, как указано, я получаю этот вывод:
Value Name = DefaultColor
Value Type = REG_DWORD
Value Value = 0x0
Если я изменил значение VALUE_NAME
на BogusValue
, тогда я получаю следующее:
"HKEY_CURRENT_USER\Software\Microsoft\Command Processor"\BogusValue not found.
Ответ 2
Эта работа для меня с переменной, которая содержит пробелы в 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%
Переменная A
содержит все данные перед первым пространством, B
- часть останова ValueName (включая дополнительные пробелы), поэтому appdir = ValueName
Ответ 3
Основываясь на решении tryToBeClever (с которым я также сталкивался и исправлялся пробным и ошибочным, прежде чем найти его), я также предлагаю передать результат вывода reg query
через find
для фильтрации нежелательных строк из-за несоответствия ! REG.EXE VERSION x.y
. Фильтрация find
и твикинг tokens
также позволяют точно выбирать то, что мы хотим (как правило, значение). Также добавлены кавычки, чтобы избежать неожиданных результатов с именами клавиш/значений, содержащими пробелы.
Конечный результат, предложенный, когда нас интересует только выбор значения:
@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
)
Потенциальным препятствием при использовании find
является то, что уровень ошибок, установленный reg
при возникновении ошибок, теперь запутывается, поэтому следует использовать этот подход только для ключей, которые, как известно, существуют и/или после предыдущей проверки.
Небольшая дополнительная оптимизация (add skip=1
, чтобы избежать обработки первой строки вывода) может быть выполнена в тех случаях, когда имя ключа также содержит имя значения (как в случае с HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion
и CurrentVersion
) но устраняет большую гибкость, поэтому их следует использовать только в конкретных случаях использования.
Ответ 4
Для Windows 7 (Professional, 64-бит - не могу говорить для других), я вижу, что REG больше не выплевывает
! REG.EXE VERSION 3.0
как в XP. Таким образом, вышеизложенное необходимо изменить, чтобы использовать
skip=2
вместо 4 - что делает вещи беспорядочными, если вы хотите, чтобы ваш script был переносимым. Хотя это гораздо более тяжелый и сложный, решение WMIC может быть лучше.
Ответ 5
По какой-то причине код Патрика Каффа не работает в моей системе (Windows 7), вероятно, из-за комментария tryToBeClever. Модификация этого немного сделала трюк:
@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.
)
Ответ 6
@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%
Это работает для меня в Win7, где ключ имеет пробел, а значение также имеет пробел.
Таким образом, сохраняя приведенное выше в c:\temp как test.bat, откройте окно cmd и запустите его.
C:\TEMP > тест
C:\Program Files (x86)\acme Software Inc\APP\
Ответ 7
Это работает, если значение содержит пробел:
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.
)
Ответ 8
Отличный уровень решений здесь.
Мое маленькое зерно соли, как решение @Patrick Cuff не работает из коробки; У меня было 2 проблемы.
- Я использую Windows 7 = > изменен на "skip = 2"
- Значение значения реестра содержало пробел
Value Value = C:\Program Files\...
Вот решение, которое я нашел: беря 4 токена и устанавливая ValueValue на %% C и %% D. (Спасибо @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.
)
Ответ 9
Я понимаю, что это старый вопрос, но этот однострочный интерфейс в значительной степени похож на вашу оригинальную попытку с несколькими дополнениями. Он работает с путями, включая пробелы, и работает как в XP, так и в Windows 7, даже если ключ не найден (и скрывает ошибку). % fn% будет пустым, если ключ не существует. В этом примере отображается текущее имя файла рабочего стола:
for /f "tokens=2*" %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\Desktop" /v Wallpaper 2^>^&1^|find "REG_"') do @set fn=%%b
Ответ 10
Спасибо, мне просто нужно использовать:
SETLOCAL EnableExtensions
И поставьте a:
2^>nul
В запрос REG QUERY, вызываемый в команде FOR.
Большое спасибо!:)
Ответ 11
@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
)
Как вы обрабатываете пробел в переменной %% A? Это приводит к C:\Program. Фактический путь - C:\Program Files\Symantec\pcAnywhere.
Ответ 12
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\в конце KEY_NAME
Ответ 13
Я сталкивался с множеством ошибок на компьютерах под управлением Windows XP при использовании WMIC (например, из-за поврежденных файлов на машинах). Следовательно, лучше всего использовать WMIC для Win XP в коде. Нет проблем с WMIC на Win 7, хотя.
Ответ 14
Вы можете получить значение раздела реестра, как показано ниже
@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
те, кто задается вопросом, как добавить reg-ключи, вот путь.
REGEDIT4
; @ECHO OFF
; CLS
; REGEDIT.EXE /S "%~f0"
; EXIT
[HKEY_CURRENT_USER\Software\Test]
"TestVal"="Succeeded"
Ответ 15
Чтобы получить конкретный ответ на значение реестра, вы можете использовать следующий запрос:
REG QUERY "Key_Name" /v "Value_Name" /s
например:
REG QUERY "HKEY_CURRENT_USER\Программное обеспечение\Microsoft\Командный процессор" /v "EnableExtensions" /s
здесь
/v: Запросы для определенных значений ключа реестра.
/s: запрашивает все подразделы и значения рекурсивно (например, dir/s)
Ответ 16
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"