批处理中如何解析含双百分号的变量值?
问题
从注册表中读取到的桌面路径数据为 %USERPROFILE%\Desktop。手动执行 cd %USERPROFILE%\Desktop 时,能正确定位到 C:\Users\Name\Desktop;但通过以下注册表读取代码赋值后:
for /f "tokens=2*" %%a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop') do set DESKTOP=%%b
得到的是 set DESKTOP=%%USERPROFILE%%\Desktop。此时执行 cd %DESKTOP%(实际等同于 cd %%USERPROFILE%%\Desktop),系统会尝试执行 cd %USERPROFILE%\Desktop 并报错:The system cannot find the path specified.。
请问如何解析/求值 %%USERPROFILE%%\Desktop,将其中的 %%USERPROFILE%% 转换为实际路径 C:\Users\Name?
解决方案
以下是几种可行的解析方法:
方法1:使用延迟环境变量扩展
通过开启延迟扩展,对变量进行二次解析:
@echo off setlocal enabledelayedexpansion for /f "tokens=2*" %%a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop') do set DESKTOP=%%b :: 去除变量中的%%符号,再触发延迟扩展解析 set "DESKTOP=!DESKTOP:%%=!" set "DESKTOP=!%DESKTOP%!" cd !DESKTOP! endlocal
方法2:使用call命令触发二次解析
利用call命令的特性,让变量被再次展开:
@echo off for /f "tokens=2*" %%a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop') do set DESKTOP=%%b :: 将%%替换为%,通过call命令触发二次解析 set "DESKTOP=%DESKTOP:%%=%" call set "DESKTOP=%%%DESKTOP%%%" cd %DESKTOP%
方法3:提取环境变量名后直接赋值
如果路径中仅包含单个环境变量,可以提取变量名后直接拼接实际路径:
@echo off setlocal enabledelayedexpansion for /f "tokens=2*" %%a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop') do set "DESKRAW=%%b" :: 从%%USERPROFILE%%中提取变量名USERPROFILE for /f "tokens=2 delims=%%" %%c in ("%DESKRAW%") do set "VARNAME=%%c" :: 拼接实际桌面路径 set "DESKTOP=!%VARNAME%!\Desktop" cd !DESKTOP! endlocal
内容的提问来源于stack exchange,提问作者Puddle
相关产品推荐
相关产品推荐

