如何从批处理脚本中获取registry项的值?

我需要使用REG QUERY命令来查看一个键的值,并使用此命令将结果设置为一个variables:

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

这适用于我:

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

因为REG QUERY命令使用双引号,所以需要usebackq

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

2^>nul防止出现错误文本。 ^是转义字符,可让您将for >置于for命令中。

当我运行上面的脚本给定,我得到这个输出:

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

如果我将VALUE_NAME的值更改为BogusValue那么我会得到:

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

这个工作对我来说,在Windows 7上包含空格的variables:

 FOR /F "usebackq tokens=3*" %%A IN (`REG QUERY "HKEY_LOCAL_MACHINE\Software\SomeAPP" /v ValueName`) DO ( set appdir=%%A %%B ) ECHO %appdir% 

variablesA包含第一个空格之前的所有数据, B – ValueName的剩余部分(包括更多空格),所以appdir = ValueName

基于tryToBeClever解决scheme(我碰巧也发现了它之前,我试图通过反复试验来修复),我还build议通过查找来传递reg query的结果输出,以便过滤由于! REG.EXE VERSION xy ! REG.EXE VERSION xy不一致。 find过滤和tokens调整也允许select我们想要的(典型值)。 还添加引号以避免包含空格的键/值名称出现意外的结果。

最后的结果build议,当我们只是在提取价值感兴趣:

 @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设置的错误级别现在被混淆,所以人们只应该使用这种方法来获知已经存在的和/或之前的validation之后的密钥。

如果键名也包含值名(如HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion的情况那样,则可以进行一个小小的附加优化(添加skip=1以避免处理第一行输出) CurrentVersion ),但删除了最大的灵活性,所以只能在特定的用例中使用。

对于Windows 7(专业,64位 – 不能为其他人说话),我看到REG不再吐出

 ! REG.EXE VERSION 3.0 

就像它在XP中一样。 所以上面需要修改才能使用

 skip=2 

而不是4 – 如果你希望你的脚本是可移植的,这会让事情变得混乱。 尽pipe它更重量级更复杂,但基于WMIC的解决scheme可能会更好。

出于某种原因,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. ) 
 @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>testing

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

如果该值包含一个空格,这将工作:

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

这里的解决scheme水平很高。

我的一小粒盐作为@Patrick Cuff的解决scheme, 我有两个问题

  • 我使用Windows 7 =>更改为“skip = 2”
  • registry值的值有一个空格Value Value = C:\Program Files\...

这是我find的解决scheme:获取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. ) 

我意识到这是一个古老的问题 – 但是这一行与您原来的尝试几乎是一样的。 它适用于包括空格在内的path,即使未find密钥(并隐藏错误),也可以在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 

谢谢,我只需要使用:

 SETLOCAL EnableExtensions 

并把一个:

 2^>nul 

进入FOR命令中调用的REG QUERY。 再次感谢! 🙂

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

你如何处理%% Avariables中的空格? 这导致C:\ Program。 实际的path是C:\ Program Files \ Symantec \ pcAnywhere。

 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结尾处

在使用WMIC时(例如,由于计算机上的文件损坏),我在Windows XP计算机上遇到过很多错误。 因此,最好不要在代码中使用WMIC的Win XP。 虽然在Win 7上没有WMIC的问题。

您可以按如下所示获取registry项

 @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 

那些想知道如何添加注册码的人,这里是一个方法。

 REGEDIT4 ; @ECHO OFF ; CLS ; REGEDIT.EXE /S "%~f0" ; EXIT [HKEY_CURRENT_USER\Software\Test] "TestVal"="Succeeded" 

要获取registry值的特定答案,可以使用以下查询:

REG QUERY“Key_Name”/ v“Value_Name”/ s

例如:REG QUERY“HKEY_CURRENT_USER \ Software \ Microsoft \ Command Processor”/ v“EnableExtensions”/ s

here / v:查询特定的registry键值。

/ s:recursion查询所有子键和值(如dir / s)

 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"