如何从含set命令的Batch文件中提取变量?
解决Batch读取带
set的存档文件变量问题 这个问题我之前也碰到过,核心原因是批处理的变量即时替换机制在搞鬼,加上你没启用延迟扩展,导致循环里设置的变量没法在后续的echo里被读取到。下面给你两种不用修改原存档文件的解决方案:
方案1:启用延迟扩展(推荐)
通过启用延迟扩展,让变量在执行时才解析,同时去掉每行开头的set 前缀来设置变量:
@echo off rem 启用延迟扩展,允许用!变量!来实时读取变量值 setlocal enabledelayedexpansion rem 遍历存档文件的每一行 for /f "eol=- delims=" %%a in (file.bat) do ( rem 把当前行内容赋值给临时变量line set "line=%%a" rem 去掉line开头的"set "字符串,得到"Health=100"这样的格式 set "line=!line:set =!" rem 执行设置变量的操作 set "!line!" ) rem 用!变量!代替%变量%,读取实时的变量值 echo Your health is !Health! echo Your sword is made of !Sword! rem 结束局部环境,避免影响其他脚本 endlocal
原理说明:
- 批处理默认会在加载整个代码块时,把所有
%变量%替换成当前的值(此时变量还没被循环设置,所以是空)。启用enabledelayedexpansion后,!变量!会在执行到该行时才解析,就能获取到循环里刚设置的变量。 - 通过字符串替换
!line:set =!,我们保留了原文件里的变量名和值,同时去掉了开头的set,完全不用修改原存档文件。
方案2:用call强制重新解析变量
如果你不想启用延迟扩展,也可以用call命令让批处理重新解析变量:
@echo off for /f "eol=- delims=" %%a in (file.bat) do ( set "line=%%a" rem 用call来执行set操作,确保变量被正确设置 call set "%%line:set =%%" ) rem 用call加上双重%%,让echo在执行时重新解析变量 call echo Your health is %%Health%% call echo Your sword is made of %%Sword%%
原理说明:
call set会让批处理重新解析后面的字符串,确保%%line:set =%%被正确替换成变量赋值语句。call echo %%Health%%则是让echo在执行时才把%%Health%%解析成%Health%,此时变量已经被循环设置,就能输出正确的值。
这两种方法都完全不需要修改原游戏的file.bat存档文件,不会导致存档损坏,你可以根据自己的习惯选择使用。
内容的提问来源于stack exchange,提问作者Sheep1Man
相关产品推荐
相关产品推荐

