如何从批处理脚本中获取注册表项的值?

57 registry batch-file

我需要使用REG QUERY命令来查看键的值,并使用以下命令将结果设置为变量:

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

但是如果密钥不存在,我会在控制台中显示错误.我需要隐藏这个错误!我尝试在命令之后输入2> nul来停止stderr,但是如果我只调用命令,这会有效:

REG QUERY "KeyName" /v ValueName 2>nul
Run Code Online (Sandbox Code Playgroud)

如果我将它放入FOR命令中,如下所示:

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

显示错误.那么有谁知道如何隐藏错误?或者也许另一个命令也看是否存在密钥?

谢谢

PS:我正在使用Windows XP

Pat*_*uff 58

这对我有用:

@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.
)
Run Code Online (Sandbox Code Playgroud)

usebackq因为命令REG QUERY使用双引号需要.

skip=4 忽略除具有值名称,类型和值的行(如果存在)之外的所有输出.

2^>nul防止出现错误文本.^是转义字符,可以让你把>for命令.

当我按照给定的方式运行上面的脚本时,我得到了这个输出:

Value Name = DefaultColor
Value Type = REG_DWORD
Value Value = 0x0
Run Code Online (Sandbox Code Playgroud)

如果我改变的值VALUE_NAMEBogusValue然后我得到这样的:

"HKEY_CURRENT_USER\Software\Microsoft\Command Processor"\BogusValue not found.
Run Code Online (Sandbox Code Playgroud)

  • 在Windows 7中,我需要使用`skip = 2` (22认同)
  • 这很有效,除了我发现我需要将"skip = 4"更改为"skip = 2".Windows 7 x64 (8认同)
  • 当Value包含空格时,当前解决方案存在问题 - 为了解决此问题,请使用通配符作为最后一个标记:`FOR/F"usebackq skip = 2 tokens = 1-2*` (6认同)
  • “ HKLM \ Software”具有** 32/64位**版本。使用`/ reg:64`和`/ reg:32`访问适当的树。 (2认同)
  • 如何使用`for /f "usebackq tokens=1-2*" %%a IN ('^(reg query %KEY_NAME% /v %VALUE_NAME% ^| find "%VALUE_NAME%"^) 2^>nul') `?除非 KEY_NAME 以这种方式包含 VALUE_NAME,否则无需担心 reg.exe 在值之前打印多少行。 (2认同)

小智 30

对于我来说,这个工作包含在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%
Run Code Online (Sandbox Code Playgroud)

变量A包含第一个空格之前的所有数据,B- ValueName的其余部分(包括更多空格),所以appdir = ValueName

  • 实际上,执行“tokens=2*”和“SET appdir=%%B”会更安全,因为路径中的第一个空格可能与其他空格相邻(例如,“C:\这是一个奇怪的路径”)。 (2认同)

Hel*_*ães 7

基于TryToBeClever解决方案(我碰巧在发现它之前偶然发现并通过反复试验来修复自己),我还建议传递reg querythrough 的结果输出,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
)
Run Code Online (Sandbox Code Playgroud)

使用的一个潜在警告find是,reg错误发生时设置的错误级别现在被混淆,因此应该只对已知的密钥和/或之前的验证使用此方法.

skip=1在密钥名称还包含值名称的情况下,可以进行一些微小的附加优化(添加以避免处理第一行输出)(如同HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion和的情况CurrentVersion),但是除去了大部分灵活性,因此只应在特定用途中使用-cases.


nie*_*els 5

由于某种原因,Patrick Cuff 的代码在我的系统(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.
)
Run Code Online (Sandbox Code Playgroud)


小智 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%
Run Code Online (Sandbox Code Playgroud)

这在Win7中适用于我,其中键具有空格并且值也具有空格.因此,将上述内容保存在c:\ temp中作为test.bat,打开一个cmd窗口并运行它.

C:\ TEMP>测试

C:\ Program Files(x86)\ acme Software Inc\APP\


小智 5

我意识到这是一个古老的问题 - 但是这个单行程与你原来的尝试几乎相同,只有几个附加功能.它适用于包含空格的路径,即使找不到密钥也会在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
Run Code Online (Sandbox Code Playgroud)