2015-03-19 71 views
0

说存在于注册表中的位置:基于密钥的数目动态地获取注册表键值

HKEY_CURRENT_USER\Software\ABC\XYZ\ 

在该位置有多个值目前,还没有固定数量。但值名称具有相同前缀像ABC0ABC1ABC2,...

一般我会用这个查询获取每个单独的值:

FOR /F "usebackq tokens=3*" %%A IN (`REG QUERY "HKEY_CURRENT_USER\Software\ABC\XYZ\" /v ABC0`) DO (
    SET Value=%%A 
) 

这将设置ABC0的值到变量的值

但我不知道可能存在的值的数量。

是否有任何方法获得所有的后缀ABC(在上述位置)的值,并将它们存储到一个变量或将它们存储在多个变量中?

是这样的:

值1 = Value_of_ABC0
值2 = Value_of_ABC1
等。

+0

感谢@Mofi,当我尝试打印变量出局部为什么不解决? 如果ABC的值是IP,我如何在两个IP之间使用新行命令,即'\ n'。在单变量方法中,它解析为1.1.1.1; 2.2.2.2 – Lastwish 2015-03-20 09:20:35

+0

请参阅例如[多行文本文件,如何放入环境变量](http://stackoverflow.com/questions/10607739/)您可以在哪里请参阅如何使用换行符将环境变量定义为字符串值,该字符串值可以引用而不是分号将IP地址获取到由行结尾分隔的变量中。 – Mofi 2015-03-20 11:18:01

+0

''setlocal'通常用于批处理文件的开头,批处理文件结尾处的'endlocal'如果根本不省略的话。这样可以避免将由'setlocal'创建的新环境变量列表中的局部变量的值传递给'endlocal'上恢复的以前的环境变量列表。 – Mofi 2015-03-20 11:38:47

回答

1

是否有任何方法可以获得带后缀ABC(在上述位置)的所有值并将它们存储到变量中或将它们存储在多个变量中?

这个问题可以回答:

是的,有一种方式来获得所有的值,并将其存储在一个或多个变量。

但是您很可能对此任务的代码感兴趣。

批处理文件将每个值存储在单独的环境变量中。

@echo off 
setlocal EnableDelayedExpansion 
set "Count=1" 
for /F "skip=2 tokens=1,2*" %%A in ('%SystemRoot%\System32\reg.exe query "HKCU\Software\ABC\XYZ"') do (
    set "ValueName=%%A" 
    if /I "!ValueName:~0,3!"=="ABC" (
     set "Value!Count!=%%C" 
     set /A Count+=1 
    ) 
) 
endlocal 

批处理文件的所有值存储在一个环境变量:

@echo off 
setlocal EnableDelayedExpansion 
set "Value=" 
for /F "skip=2 tokens=1,2*" %%A in ('%SystemRoot%\System32\reg.exe query "HKCU\Software\ABC\XYZ"') do (
    set "ValueName=%%A" 
    if /I "!ValueName:~0,3!"=="ABC" (
     if not "!Value!"=="" set "Value=!Value!;" 
     set "Value=!Value!%%C" 
    ) 
) 
endlocal 

要了解批次代码,打开命令提示窗口中,执行下面的命令,读帮助输出为每个命令。

  1. for /?
  2. if /?
  3. reg query /?
  4. set /?

加成在参考由Rafael发表评论。

reg.exe Windows 2000和Windows XP不支持变量名称的通配符。自Windows Vista以来,变量名称中的通配符仅受reg.exe支持。

reg.exe的输出取决于版本和使用的命令。在Windows XP

输出使用命令

%SystemRoot%\System32\reg.exe query "HKCU\Software\ABC\XYZ" 

  
! REG.EXE VERSION 3.0 

HKEY_CURRENT_USER\Software\ABC\XYZ 
    ABC0  REG_SZ Hello! 
    ABC1  REG_SZ Okay. Let's go. 
    ABC2  REG_SZ Finished. 

输出一个空白行开始。下一行是版本信息。第三行再次是空白行。第四行是注册表项。然后,带有值的行随后有4个空格作为缩进值和值名称,值类型和值字符串之间的选项卡。在Windows 7

输出使用命令

%SystemRoot%\System32\reg.exe query "HKCU\Software\ABC\XYZ" 

  
HKEY_CURRENT_USER\Software\ABC\XYZ 
    ABC0 REG_SZ Hello! 
    ABC1 REG_SZ Okay. Let's go. 
    ABC2 REG_SZ Finished. 

第一行再次是一个空行。没有版本信息。因此,第二行已经包含注册表项,当然这些注册表项还可以包含一个或多个空格。然后,带有值的行随后以4个空格作为缩进,并且值名称,值类型和值字符串之间也有4个空格。在Windows 7

输出使用命令

%SystemRoot%\System32\reg.exe query "HKCU\Software\ABC\XYZ" /v ABC* 

  
HKEY_CURRENT_USER\Software\ABC\XYZ 
    ABC0 REG_SZ Hello! 
    ABC1 REG_SZ Okay. Let's go. 
    ABC2 REG_SZ Finished. 

End of search: 3 match(es) found. 

相较于先前的输出现在还有一个空行,并且也包含几个空格的摘要信息。

结论:

像现在在更新的代码做是安全的,跳过前两行的reg.exe输出。

但是在Windows Vista,Windows 7,Windows 8或Windows 8.1上无法使用下面的简化代码,因为搜索摘要行。

@echo off 
setlocal EnableDelayedExpansion 
set "Value=" 
for /F "skip=2 tokens=2*" %%A in ('%SystemRoot%\System32\reg.exe query "HKCU\Software\ABC\XYZ" /v ABC* ') do (
    if not "!Value!"=="" set "Value=!Value!;" 
    set "Value=!Value!%%B" 
) 
endlocal 

然而,由于Rafael但他的评论让我看好的reg.exe版本,分析他们在这里记录它,这将是对我来说绝对是有帮助的,希望也为他人在未来之间的输出差异。

+0

很好的答案,但实际上您不需要验证值名称的第一个字符。在命令结尾添加'/ v ABC *'将仅过滤* ABC *起始名称。像这样:'... in('reg query“HKCU \ Software \ ABC \ XYZ”'/ v ABC *)'。但是你必须跳过显示搜索结果的最后一行。 – Rafael 2015-03-19 07:01:27

+0

当我在CMD中直接使用CM *的reg *查询时,它可以工作,但是当我尝试使用FOR命令通过脚本将值存储在一个变量中时,我只是得到'Search:' – Lastwish 2015-03-19 07:15:35