前言
做了一段时间的bat脚本开发,bat脚本中有各种各样的命令跟传统的编程逻辑完全不同,本专栏会讲解下各种各式的命令使用方法。
本篇文章讲解的是EnableDelayedExpansion的使用。
EnableDelayedExpansion简介
EnableDelayedExpansion是用于在批处理脚本中启用延迟变量扩展的命令。
在默认情况下,批处理脚本中使用百分号%来表示变量。但是,在一些情况下,特别是在循环或代码块内部,使用百分号%可能会导致变量展开不正确或无法正常工作。
为了解决这个问题,可以通过使用EnableDelayedExpansion来启用延迟变量扩展。启用延迟变量扩展后,批处理脚本中的变量可以使用感叹号!来表示,而不是百分号%。
延迟变量扩展具有以下优势和用途:
1、在循环中使用变量:
在批处理脚本中,使用百分号%来表示变量时,变量会在整个循环开始之前进行展开。这意味着在循环的每次迭代中,变量的值都是相同的。而通过启用延迟变量扩展,你可以在循环内部使用感叹号!来表示变量,以便正确地展开变量并获取每次迭代的不同值。
2、在代码块内部使用变量:
在批处理脚本中,如果有一个代码块,在代码块外部定义的变量在代码块内部进行修改后,其值不会在代码块外部得到更新。启用延迟变量扩展后,你可以在代码块内部使用感叹号!来表示变量,并在代码块内部正确地展开变量并获取到更新后的值。
3、避免特殊字符解释问题:
在批处理脚本中,如果变量中包含特殊字符,例如感叹号!,在使用百分号%表示变量时,批处理解释器会将感叹号解释为特殊字符,导致错误的结果。通过启用延迟变量扩展,你可以使用感叹号!来表示变量,并避免特殊字符解释问题。
使用教程
-
在批处理脚本的开头,添加
setlocal EnableDelayedExpansion
命令。这将启用延迟变量扩展,使你能够在代码中正确地使用感叹号!
来访问变量。 -
在需要使用延迟变量扩展的地方,使用双感叹号
!!
来包裹变量名。示例:
@echo off chcp 65001 setlocal EnableDelayedExpansion set var=Hello echo 通过百分号展开:%var% echo 通过感叹号展开:!var! pause
在上述示例中,使用感叹号
!
来展开变量var
,而不是使用百分号%
。这是因为我们已经启用了延迟变量扩展。 -
在循环内部使用延迟变量扩展。
示例:
@echo off chcp 65001 setlocal EnableDelayedExpansion set count=0 for %%i in (1 2 3) do ( set /A count+=1 echo 当前循环:%count% echo 延迟展开的循环变量:!count! ) pause
在上述示例中,利用延迟变量扩展,我们可以在循环内部正确地展开变量
count
。 -
使用
!var!
的注意事项:-
如果延迟变量扩展没有启用,使用双感叹号
!!
来包裹变量名将导致其被视为字符串文本,而不是变量。 -
在包含双感叹号
!!
的代码行里,批处理解释器通常会将感叹号解释为特殊字符。为了避免这种解释,可以使用^!
这样的转义符来告诉解释器忽略感叹号。
示例:
@echo off chcp 65001 setlocal EnableDelayedExpansion set var=Goodbye^^! REM 输出:Goodbye! echo !var! REM 输出:!var! echo ^^!var^^! pause
在上述示例中,我们使用
^^!
来转义感叹号,以便正确地展开变量var
。 -
-
在脚本结束后,使用
endlocal
命令来还原初始的环境设置并移除启用的延迟变量扩展。示例:
@echo off chcp 65001 setlocal EnableDelayedExpansion set var=Hello echo 延迟展开的变量:!var! endlocal pause
在上述示例中,使用
endlocal
命令来关闭当前的批处理块,还原初始的环境设置。