如何用批处理脚本获取含空格的完整注册表值名称?
解决批处理读取注册表带空格值名称的问题
你的脚本问题出在for /f的tokens=1,3参数——当值名称包含空格时,它会按空格将名称拆分成多个token,导致无法获取完整的名称。要解决这个问题,需要先读取reg query输出的整行内容,再通过注册表类型字段(如REG_SZ、REG_DWORD等,均以REG_开头)作为分隔点,拆分出完整的名称和对应的数据。
以下是修正后的脚本:
@echo off set "key=path to reg key" rem 跳过reg query输出的前两行(标题行和空行),读取后续每一行 for /f "skip=2 tokens=*" %%l in ('reg query "%key%" /v "*.exe"') do ( rem 跳过空行 if not "%%l"=="" ( set "line=%%l" rem 启用延迟扩展,处理循环内的变量修改与读取 setlocal enabledelayedexpansion rem 提取类型字段(输出行的第二个连续空格分隔块) for /f "tokens=2" %%t in ("!line!") do ( set "type=%%t" rem 截取类型字段之前的内容作为值名称,修剪末尾空格 set "name=!line:*!type!=!" set "name=!name:~0,-1!" rem 截取类型字段之后的内容作为值数据,修剪开头空格 set "data=!line:*!type! =!" ) echo Value Name: !name! echo Value Data: !data! endlocal ) ) pause
脚本说明:
skip=2:跳过reg query输出的前两行(第一行是表头,第二行是空行),只处理实际的键值数据行。tokens=*:读取整行内容,避免被空格拆分,确保能获取包含空格的完整值名称。- 延迟扩展:启用
enabledelayedexpansion后,才能在for循环内部正确读取和修改变量(用!变量名!替代%变量名%)。 - 按类型字段分割:利用注册表类型字段(如
REG_SZ)作为固定分隔点,分别提取值名称和值数据,再修剪多余空格。
如果你的注册表值类型不固定(比如同时存在REG_SZ、REG_DWORD等),这个脚本依然能正常工作,因为它会自动提取当前行的类型字段作为分割依据。
内容的提问来源于stack exchange,提问作者Abhishek Rana
相关产品推荐
相关产品推荐

