Подтвердить что ты не робот

Как получить значение раздела реестра из пакета 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

4b9b3361

Ответ 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"