批处理变量中包含其他变量的处理方法

     最近在写一个批处理小程序,需要引用的变量中又含有其他变量,经过数天研究终于解决,现总结出来和大家一起分享,下面举个例子来和大家探讨探讨。


@echo off
set IP1=192.168.1.1
set IP2=192.168.1.2
set IP3=192.168.1.3
:begin
cls
echo [1] 192.168.1.1
echo [2] 192.168.1.2
echo [3] 192.168.1.3
set Choice=
set /p Choice=请选择一个IP地址[1-3]:
if "%Choice%"=="" goto begin
echo.
echo 您选择的IP地址是:%IP%Choice%%
echo.
echo 哈哈!请按任意键继续选择...
pause >nul
goto begin


      按照一般的思路我们采用%号来处理这些变量,然而得出的结果却是“您选择的IP地址是:Choice%”,显然命令解释器把前面的%IP%作为一个变量来优先处理,无法得出我们想要的结果。这时就需要使用延缓环境变量扩展名来处理,也就是setlocal命令,一般我们使用SetLocal EnableDelayedExpansion命令来启用它,停用它则使用SetLocal DisableDelayedExpansion命令。在setlocal环境下可用!或%号来获取变量,那我们是不是可以用不同的符号来区别不同的变量,以便让命令解释器安照我们的要求来获取变量呢?

下面让我们把上面的例子修改一下:


@echo off
set IP1=192.168.1.1
set IP2=192.168.1.2
set IP3=192.168.1.3
:begin
SetLocal EnableDelayedExpansion
cls
echo [1] 192.168.1.1
echo [2] 192.168.1.2
echo [3] 192.168.1.3
set Choice=
set /p Choice=请选择一个IP地址[1-3]:
if "%Choice%"=="" goto begin
echo.
echo 您选择的IP地址是:%IP!Choice!%
echo.
echo 哈哈!请按任意键继续选择...
pause >nul
goto begin


     运行后我们发现变量获取的结果为空,是不是%IP!Choice!%变量名有问题,我们把它改成!IP%Choice%!来试试:


@echo off
set IP1=192.168.1.1
set IP2=192.168.1.2
set IP3=192.168.1.3
:begin
SetLocal EnableDelayedExpansion
cls
echo [1] 192.168.1.1
echo [2] 192.168.1.2
echo [3] 192.168.1.3
set Choice=
set /p Choice=请选择一个IP地址[1-3]:
if "%Choice%"=="" goto begin
echo.
echo 您选择的IP地址是:!IP%Choice%!
echo.
echo 哈哈!请按任意键继续选择...
pause >nul
goto begin


     运行后我们惊喜地发现,变量值能正确获取了,耶!

     然而细心的朋友会发现,“哈哈!”中的!号没有显示出来,这是因为在setlocal环境中感叹号被作为变量符合来处理了,所以无法显示出来,因此我们可用在此之前加入一个停用延缓环境变量扩展名的命令,新的代码如下:


@echo off
set IP1=192.168.1.1
set IP2=192.168.1.2
set IP3=192.168.1.3
:begin
SetLocal EnableDelayedExpansion
cls
echo [1] 192.168.1.1
echo [2] 192.168.1.2
echo [3] 192.168.1.3
set Choice=
set /p Choice=请选择一个IP地址[1-3]:
if "%Choice%"=="" goto begin
echo.
echo 您选择的IP地址是:!IP%Choice%!
echo.
SetLocal DisableDelayedExpansion
echo 哈哈!请按任意键继续选择...
pause >nul
goto begin


     运行后我们发现感叹号!又显示出来了,先别高兴,当程序执行十多次之后我们就会发现变量名获取出错了,显示为!IP1!、!IP2!或!IP3!,并提示“已经达到最大的 setlocal 递归层”,如下图:

     经过分析我们发现,出错的原因是延缓环境变量扩展名被多次启用和停用,也许这是setlocal环境本身的问题,但为了解决此问题,我们可以把SetLocal DisableDelayedExpansion命令换成endlocal命令,也就是完全退出setlocal环境,修改后代码如下:


@echo off
set IP1=192.168.1.1
set IP2=192.168.1.2
set IP3=192.168.1.3
:begin
SetLocal EnableDelayedExpansion
cls
echo [1] 192.168.1.1
echo [2] 192.168.1.2
echo [3] 192.168.1.3
set Choice=
set /p Choice=请选择一个IP地址[1-3]:
if "%Choice%"=="" goto begin
echo.
echo 您选择的IP地址是:!IP%Choice%!
echo.
endlocal
echo 哈哈!请按任意键继续选择...
pause >nul
goto begin


当然,如果您不需要处理感叹号这类特殊字符也可以把启用延缓环境变量扩展名的命令放在begin标签之前,这样就不必要频繁地启用和停用setlocal了,代码如下所示:

@echo off
set IP1=192.168.1.1
set IP2=192.168.1.2
set IP3=192.168.1.3
SetLocal EnableDelayedExpansion
:begin
cls
echo [1] 192.168.1.1
echo [2] 192.168.1.2
echo [3] 192.168.1.3
set Choice=
set /p Choice=请选择一个IP地址[1-3]:
if "%Choice%"=="" goto begin
echo.
echo 您选择的IP地址是:!IP%Choice%!
echo.
echo 请按任意键继续选择...
pause >nul
goto begin

你可能感兴趣的:(setlocal,延缓环境变量扩展名)