我需要使用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_NAME
来BogusValue
然后我得到这样的:
"HKEY_CURRENT_USER\Software\Microsoft\Command Processor"\BogusValue not found.
Run Code Online (Sandbox Code Playgroud)
小智 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
基于TryToBeClever解决方案(我碰巧在发现它之前偶然发现并通过反复试验来修复自己),我还建议传递reg query
through 的结果输出,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.
由于某种原因,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)
归档时间: |
|
查看次数: |
225447 次 |
最近记录: |