我怎样才能从批处理脚本中获得一个注册表项的值?

我需要使用REG查询命令来查看一个键的值,并设置其结果与此命令的变量:

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命令是这样的:

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

usebackq是必要的,因为该命令REG QUERY使用双引号。

skip=4忽略所有的输出,除了具有值的名称,类型和值,如果存在就行了。

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

当我运行上面给出的剧本,我得到这样的输出:

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

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

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

基于tryingToBeClever解决方案(我正好也绊倒在固定自己通过反复试验和错误发现它之前),我也建议通过的结果输出reg query通过find以过滤由于不需要线! REG.EXE VERSION xy ! REG.EXE VERSION xy不一致。 该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\CurrentVersionCurrentVersion但除去大部分的灵活性,因此只应在特定用例中使用。

这对我的工作有变,它包含在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

对于Windows 7(专业版,64位 - 不能代表其他人),我看到REG不再吐出来

! REG.EXE VERSION 3.0

因为它在XP。 因此上述需要被修改为使用

skip=2

而不是4 - 这使得事情乱七八糟的,如果你想你的脚本可移植。 虽然这是更重量级的,复杂的,一个WMIC基础的解决方案可能会更好。

出于某种原因帕特里克袖代码不会在我的系统(Windows 7)中可能是由于tryingToBeClever的评论工作。 修改它一点的伎俩:

@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>测试

C:\ Program Files文件(x86)的\ ACME软件公司\ 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.
)

我意识到这是一个老问题 - 但是这一个班轮几乎是一样的你原来的尝试与几个新增的。 它的工作原理与路径包括空格,工作在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

解决方案有很大的关卡。

我的小盐溶液中框@Patrick袖口没有发挥出来的粮食; 我有2个问题

  • 我使用的是Windows 7 =>更改为“跳过= 2”
  • 注册表值的价值有一个空间,它Value Value = C:\Program Files\...

下面是我找到了解决方法:取4令牌和设置ValueValue至%% C和%%Ð。 (感谢@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.
)

谢谢你,我只需要使用:

SETLOCAL EnableExtensions

并把一个:

2^>nul

进入REG QUERY称为FOR命令。 再有很多感谢! :)

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

你是如何处理的%%变量的空间? 这导致在C:\程序。 实际的路径为C:\ Program Files文件\赛门铁克\ 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。 与WMIC没有问题,在Win 7虽然。

分类:批处理文件 时间:2015-03-14 人气:0
本文关键词: 注册表,批处理文件
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.792 (s). 10 q(s)