批处理中如何正确将reg query的注册表路径结果设为变量?
问题原因分析
你的for /f命令会遍历reg query输出的所有非空行,包括最后一行的End of search: 1 match(es) found.。由于你在每次循环中都直接将%%i赋值给reg变量,最后一次循环处理的是末尾的提示行,%%i对应的值就是End,因此最终变量被覆盖为End。
解决方案
核心思路是只处理包含注册表路径的行,以下两种方式都可以实现:
方案1:用findstr过滤目标行
在reg query的输出管道中加入findstr,只保留以HKEY_开头的行(注册表路径的固定前缀),再提取整行内容:
for /f "delims=" %%i in ('reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\InboxApplications\ /s /f Microsoft.Windows.SecHealthUI_10 ^| findstr /i "^HKEY_"') do (set "reg=%%i")
delims=:确保整行内容被完整赋值,避免路径被空格分割(如果存在的话)^|:批处理中需要用^转义管道符|,让它在for的子命令中生效findstr /i "^HKEY_":匹配以HKEY_开头的行,忽略大小写
方案2:在循环内判断行内容
通过判断当前行的第一个token是否为注册表根键(HKEY_LOCAL_MACHINE),仅在匹配时赋值:
for /f "tokens=1,*" %%i in ('reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\InboxApplications\ /s /f Microsoft.Windows.SecHealthUI_10') do ( if "%%i"=="HKEY_LOCAL_MACHINE" set "reg=%%i %%j" )
tokens=1,*:将行内容分为两部分,%%i是第一个部分(HKEY_LOCAL_MACHINE),%%j是剩余所有内容if判断:只对注册表路径行进行赋值,跳过末尾的提示行
验证效果
执行完上述任意一种命令后,用echo %reg%即可输出完整的注册表路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\InboxApplications\Microsoft.Windows.SecHealthUI_10.0.19041.1023_neutral__cw5n1h2txyewy
内容的提问来源于stack exchange,提问作者TsekLee
相关产品推荐
相关产品推荐

