批处理脚本中从注册表获取的环境变量无法展开求解
批处理脚本中注册表获取的环境变量无法展开的解决方案
问题原因
你从注册表读取的Desktop路径值本身是包含环境变量占位符的字符串(例如%USERPROFILE%\Desktop),而批处理默认的%变量%展开是在脚本预解析阶段完成的——此时从注册表动态读取的变量内容还未被处理,自然不会自动展开其中的占位符。而%USERPROFILE%是系统预定义的环境变量,属于脚本预解析阶段就能识别的内容,所以能正常展开。
解决方案
你已经开启了ENABLEDELAYEDEXPANSION,直接利用延迟变量扩展即可实现二次解析,或者使用call命令强制触发二次解析,两种方案任选其一:
方案1:使用延迟变量扩展(推荐)
将所有需要展开动态变量的地方,把%变量名%替换为!变量名!——延迟扩展是在脚本执行阶段处理变量,能识别动态获取的内容里的环境变量占位符:
ECHO ON SETLOCAL ENABLEDELAYEDEXPANSION CLS FOR /F "tokens=2*" %%a IN ('REG QUERY "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Desktop" 2^>^&1^|find "REG_"') DO @SET SHORTCUTDESTINATION=%%b ECHO !SHORTCUTDESTINATION! PAUSE SET VALUEFROMREGISTRY=!SHORTCUTDESTINATION! ECHO !VALUEFROMREGISTRY! PAUSE ECHO %USERPROFILE% PAUSE
方案2:使用call命令强制二次解析
通过CALL ECHO %%变量名%%的格式,让批处理对变量内容进行二次解析:
ECHO ON SETLOCAL ENABLEDELAYEDEXPANSION CLS FOR /F "tokens=2*" %%a IN ('REG QUERY "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v "Desktop" 2^>^&1^|find "REG_"') DO @SET SHORTCUTDESTINATION=%%b CALL ECHO %%SHORTCUTDESTINATION%% PAUSE SET VALUEFROMREGISTRY=%SHORTCUTDESTINATION% CALL ECHO %%VALUEFROMREGISTRY%% PAUSE ECHO %USERPROFILE% PAUSE
补充说明
- 延迟变量扩展需要提前通过
SETLOCAL ENABLEDELAYEDEXPANSION开启,使用!包裹变量名; call命令的双重百分号会在预解析阶段转换为单百分号,执行call时会再次解析变量内容里的占位符。
内容的提问来源于stack exchange,提问作者Daniel Santos
相关产品推荐
相关产品推荐

