是否有任何方法可以获得带后缀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
要了解批次代码,打开命令提示窗口中,执行下面的命令,读帮助输出为每个命令。
for /?
if /?
reg query /?
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
版本,分析他们在这里记录它,这将是对我来说绝对是有帮助的,希望也为他人在未来之间的输出差异。
感谢@Mofi,当我尝试打印变量出局部为什么不解决? 如果ABC的值是IP,我如何在两个IP之间使用新行命令,即'\ n'。在单变量方法中,它解析为1.1.1.1; 2.2.2.2 – Lastwish 2015-03-20 09:20:35
请参阅例如[多行文本文件,如何放入环境变量](http://stackoverflow.com/questions/10607739/)您可以在哪里请参阅如何使用换行符将环境变量定义为字符串值,该字符串值可以引用而不是分号将IP地址获取到由行结尾分隔的变量中。 – Mofi 2015-03-20 11:18:01
''setlocal'通常用于批处理文件的开头,批处理文件结尾处的'endlocal'如果根本不省略的话。这样可以避免将由'setlocal'创建的新环境变量列表中的局部变量的值传递给'endlocal'上恢复的以前的环境变量列表。 – Mofi 2015-03-20 11:38:47