2009-01-15 4 views
45

мне нужно использовать команду REG QUERY для просмотра значения ключа и установить результат в переменный с помощью следующей команды:Как получить значение раздела реестра из пакетного скрипта?

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

Но если ключ оленьей кожи существует, я получаю ошибку, показанную на консоли. Мне нужно скрыть эту ошибку! Я попытался положить 2> NUL после команды, чтобы остановить поток ошибок, но это работает, если я только вызовите команду:

REG QUERY "KeyName" /v ValueName 2>nul 

Если я положил его в использовании команды, как это:

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

Отображается ошибка. Так кто-нибудь знает, как скрыть ошибку? Или, может быть, еще одна команда тоже видит, существует ли ключ или нет?

Благодаря

PS: Я использую Windows XP

ответ

46

Это работает для меня:

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

Когда я запускаю сценарий выше заданной, я получаю этот выход:

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

Если изменить значение VALUE_NAME к BogusValue тогда я получаю это:

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

В Windows 7, мне нужно использовать 'пропустить = 2' – Saul

+4

Это прекрасно работает, за исключением, что я нашел, что мне нужно изменить «skip = 4» - «skip = 2». Windows 7 x64 –

+0

Вы можете заменить строку значением, не найденным со следующим, чтобы удалить уродливую двойную кавычку: @echo "% KEY_NAME:" =% \% VALUE_NAME% "не найден. –

0

Спасибо, я просто необходимо использовать:

SETLOCAL EnableExtensions 

И поставил:

2^>nul 

В REG QUERY, вызываемый в команде FOR. Еще раз спасибо! :)

4

Для Windows 7 (Professional, 64-бит - не могу говорить за других), я не вижу, что REG больше не выкладывает

! REG.EXE VERSION 3.0 

, как это делает в XP. Таким образом, вышеуказанные потребности должны быть модифицированы для использования

skip=2 

вместо 4 - что делает вещи неаккуратно, если вы хотите, чтобы ваш сценарий, чтобы быть портативным. Хотя это гораздо более тяжелый и сложный, решение на основе WMIC может быть лучше.

4

По какой-то причине код Патрика Каффа не работает в моей системе (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. 
) 
7

На основании решения tryingToBeClever (который я случайно также наткнуться и фиксируется сам методом проб и ошибок, прежде чем найти его), я также предлагаю прохождение выходного результата 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, когда возникают ошибки теперь затемненный поэтому следует использовать только этот подход для ключей, которые, как известно, существуют и/или после предыдущей проверки.

Крошечная дополнительная оптимизация (добавить skip=1, чтобы избежать обработки первой строки вывода) может быть сделано в тех случаях, когда имя ключа также содержит имя значения (как в случае с HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion и CurrentVersion), но удаляет большую гибкость, следует использовать только в особых случаях использования.

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

5
@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) \ акме Software Inc \ APP \

4

Это работает, если значение содержит пробел:

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

Этот работать для меня с переменной, которая содержит пробелы в 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 с ontains все данные до первого места, B - остальная часть VALUENAME (включая дополнительные пространства), так appdir = ValueName

+0

'3 *' важно, чтобы убедиться, что значение всей переменной указано в '%% B' – icc97

+0

Я получал сообщение об ошибке с этим кодом. Пришлось окружить кавычками: set appdir = "%% A %% B" – uzrgm

0
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 

точка поместить \ в конце KEY_NAME

+0

Это слишком сложное решение. Результат лучше, если вы просто используете/v% VALUE_NAME% –

3

Я понимаю, что это старый вопрос - но это однострочный интерфейс в значительной степени совпадает с вашей оригинальной попыткой с несколькими дополнениями. Он работает с путями, включая пробелы, и работает как в 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 
4

Отличный уровень решений здесь.

Мое маленькое зерно соли в качестве решения @ Патрик Кафф не работал из коробки; У меня было 2 проблемы

  • Я использую Windows 7 => изменено на «пропустить = 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. 
) 
+0

Это лучшее решение, которое я нашел, работает на 64-битной Windows 7. Спасибо за ваши старания –

0

Я пришел через много ошибок на компьютерах с Windows XP при использовании WMIC (например, из-за поврежденные файлы на машинах). Следовательно, лучше всего использовать WMIC для Win XP в коде. Однако никаких проблем с WMIC на Win 7.

0

Вы можете получить значение ключевого реестра следующим

@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" 
0

Чтобы получить конкретный ответ на значение реестра, вы можете использовать следующий запрос:

REG QUERY "KEY_NAME"/v "название_значения"/s

например: REG QUERY " HKEY_CURRENT_USER \ Software \ Microsoft \ Command Processor "/ v" EnableExtensions "/ s

/v: Запросы для определенных значений ключа реестра.

/s: Запрашивает все подразделы и значения рекурсивно (например, реж/с)

-1
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"