bat中的enabledelayedexpansion

在使用bat批处理中,在if或for中给全局变量重新赋值的时候会遇到赋值不上的情况。如:

@echo off

set param=0
if not "%1x"=="x" (
    set param=%1
)

echo %param%

这段代码是判断启动批处理时,如果有命令行参数,将第一个参数传给param,如果命令行没有参数则用最初设定的0值,然后输出param。但是,有时你会发现,即使传了命令行参数,最终输出的param依然是空值。

为了确保参数能准确的赋上值,我们可以用enabledelayedexpansion来设置延迟环境变量扩展,这样就能稳稳的得到正确的赋值了。

@echo off

set param=0

setlocal EnableDelayedExpansion
if not "%1x"=="x" (
    set param=%1
)
endlocal & set param=%param%

echo %param%

稍微解析一下setlocal enabledelayedexpansion,就是设置本地为延迟扩展。其实也就是:延迟变量,全称”延迟环境变量扩展”, 在cmd执行命令前会对脚本进行预处理,其中有一个过程是变量识别过程,在这个过程中,如果有两个%括起来的如%value%类似这样的变量,就会对其进行识别,并且查找这个变量对应的值,再而将值替换掉这个变量,这个替换值的过程,就叫做变量扩展,然后再执行命令。

如果不设置这个,对变量再次赋值,由于机器性能或环境的关系,可能会导致再次赋值没有赋上的错误。

0%