如何在批处理脚本中读取注册表默认键值并排除键值类型?
解决批处理读取注册表默认值时获取到REG_SZ的问题
你的问题出在FOR /F的tokens参数设置上,还可能涉及系统位数的兼容问题:
原因分析
执行reg query /ve命令后,默认值的输出格式大致为:
(默认) REG_SZ C:\实际路径\excel.exe
原脚本用tokens=2,*会把第二个字段(也就是REG_SZ)之后的内容赋值给%%B,但如果系统输出的分隔符(空格/制表符)处理不当,或者你的批处理在64位系统上以32位模式运行(会读取WOW6432Node下的注册表项,该节点下的路径可能为空),就会出现只拿到REG_SZ的情况。
修正后的脚本
基础版本(适配对应位数系统)
@echo off :: 跳过前两行输出,提取第3个字段之后的所有内容(即路径) FOR /F "skip=2 tokens=3,*" %%A IN ('reg.exe query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\excel.exe" /ve') DO set "EXCEL_PATH=%%B" echo %EXCEL_PATH%
兼容64位/32位系统的版本
如果是在64位系统上运行,建议加上/reg:64参数,确保读取64位注册表项(避免读取32位兼容节点的空值):
@echo off FOR /F "skip=2 tokens=3,*" %%A IN ('reg.exe query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\excel.exe" /ve /reg:64') DO set "EXCEL_PATH=%%B" echo %EXCEL_PATH%
更可靠的过滤版本
用findstr筛选包含REG_SZ的行,再精准提取路径:
@echo off :: 用制表符和空格作为分隔符,提取REG_SZ之后的内容 FOR /F "tokens=2,* delims= " %%A IN ('reg.exe query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\excel.exe" /ve /reg:64 ^| findstr /i "REG_SZ"') DO set "EXCEL_PATH=%%B" echo %EXCEL_PATH%
内容的提问来源于stack exchange,提问作者Zedude
相关产品推荐
相关产品推荐

