如何从批处理脚本中获取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"