Windows批处理单行设置变量时的赋值异常问题及实现方法问询
Windows批处理单行设置变量时的赋值异常问题及实现方法问询
嗨,我来帮你把这个批处理的变量赋值问题讲明白!
首先咱们先搞懂为什么单行写法会出问题:Windows批处理在执行每一行命令之前,会先对整行做预解析变量扩展——也就是把所有%变量名%的部分替换成变量当前的取值,然后才会执行整行里的命令。
看你的例子:
set var1=Demo& set var2=%var1%
在执行这行之前,%var1%还是之前的空值(或者之前的旧值),所以预解析后这行其实变成了set var1=Demo& set var2=(如果之前var1是空的话),最终var2拿到的不是刚设置的Demo,而是解析时的旧值或者原变量名字符串。
而分开两行写的时候:
set var1=Demo set var2=%var1%
第一行执行完,var1已经被更新为Demo,第二行执行前预解析%var1%时,就会拿到最新的Demo值,所以输出正常。
那要在单行里实现用var1的值给var2赋值,有两种常用方法:
方法1:启用延迟变量扩展
延迟扩展会把变量扩展的时机从“预解析整行”改成“执行单个命令时”,用!变量名!代替%变量名%。用法如下:
@echo off setlocal enabledelayedexpansion set var1=Demo& set var2=!var1! echo !var2! rem 输出:Demo
需要注意开头的setlocal enabledelayedexpansion是开启延迟扩展的关键,这样!var1!会在执行set var2=!var1!这个命令时才去读取var1的最新值。
方法2:用call命令强制二次解析
call命令会让批处理对后面的命令做两次解析,咱们可以用双层百分号来实现:
@echo off set var1=Demo& call set var2=%%var1%% echo %var2% rem 输出:Demo
第一次预解析时,%%var1%%会被替换成%var1%,然后call执行set var2=%var1%的时候,第二次解析%var1%就会拿到刚设置的Demo值,从而正确赋值给var2。
备注:内容来源于stack exchange,提问作者Mr.Key7
相关产品推荐
相关产品推荐

