`
weixing
  • 浏览: 81761 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

延迟环境变量扩展

 
阅读更多

延迟变量全称"延迟环境变量扩展",要理解这个东西,我们还得先理解一下什么叫扩展!

CMD在解释我们的命令的时候,首先会读取命令行一条完整的命令,然后对其进行一些命令格式的匹配操作,看你所输入的命令格式是不是符合他的要求.

如果我们要在我们的命令中引用一些变量,那么我们如何让CMD在解释我们的命令时,能识别出这个变量呢?这时我们就可以在变量名字两边加一个%,%name%.CMD在对读取我们的整行命令进行格式匹配的时候,就会发现name这个字符两边加了%,就不会把他当作普通字符处理,而是会把他当作一个变量处理,变量名叫name!然后CMD就会找到变量名对应的值,用变量名的值替换掉这个变量名字(name),(如果变量名不存在值,就返回空值).再将这个替换好并且匹配的命令执行!这个替换值的过程,就叫做变量扩展,说白了就是把变量的名字,用他的值给替换掉后执行!也就是批处理如何识别一个变量的过程.

(注意:这里只是变量的扩展的意思,不是延迟环境变量扩展,要理解延迟环境变量扩展,必须先理解什么是变量的扩展) 也就是批处理如何识别一个变量的过程. ~_~

例如这个一个BAT

set var=test
echo %var%

CMD在读取到echo %var%这句命令后,就会进行匹配操作,它马上就发现var字符两边有%,这时他就会把他当作一个变量处理,查看这个var变量名是不是有值,如果有就用他的值把变量名var给替换掉,这里我们的VAR在上一条命令set var=test,var赋值为test,所以他会用test%var%这个变量名替换掉,替换后的结果就为echo test.这些步骤都是CMD进行匹配操作的步骤,匹配完后,他再执行echo test这条语句,这时我们的CMD中就会echo出一个test.

什么是环境变量扩展知道了,那什么是延迟环境变量扩展?

在理解环境变量扩展时,我们知道CMD在解释命令时,首先会把一条完整的命令进行读取,然后进行匹配操作,匹配时他会把命令里的变量用变量的值个替换掉,然后执行这个替换好的命令.

问题就出在"一条完整的命令",BAT,IF FOR这样的命令都可以加括号,将一些命令嵌套在里面执行.这样的话对于一条可以加扩号嵌其他命令的命令,他的完整格式就是for %%i in (....)这样一个整体.此时,如果我们如果在括号里面嵌入一些设置变量值的命令,就会出现问题了!

看例子
@echo off
for /l %%i in (1,1,5) do (
    set var=%%i
    echo %var%
)

执行后会显示5个空行的错误提示!为什么?根据我们上面说的知识来理解

@echo off
set var=test
for /l %%i in (1,1,5) do (
    set var=%%i
    echo %var%
)

这个就会打印5test.

通过这两个例子,大家因该已经理解,如果只有环境变量扩展这个过程的话,如果我们在可以嵌套命令的命令中执行赋值操作时,会让我们的BAT出现给变量赋值的问题.那么这个时候"延迟环境变量扩展",这个概念就被提出来了。在批处理中,我们可以用setloacl ENABLEDELAYEDEXPANSION这个命令来启用"延迟环境变量扩展"

在我们启用了"延迟环境变量扩展",CMD在解释涵有嵌套格式的命令时,他会把嵌套的命令一条一条的先执行一次,然后再进行匹配操作,这样我们的赋值操作就会完成.并且再"延迟环境变量扩展"启用后,CMD会用!号来判断这是不是一个变量,如没启用来变量用%name%这样的格式判断,启用后就用!name!这样的格式判断了,这个符号我们需要注意!


例子:

@echo off
setlocal ENABLEDELAYEDEXPANSION
set var=test
for /l %%i in (1,1,5) do (
    set var=%%i
    echo !var!
)

这样大家因该明白什么是延迟环境变量扩展了吧.

再来一个例子

@echo off
set var=test & echo %test%
pause

这条命令放在一行,表示他是一条完整的命令,不启用"延迟环境变量扩展",就会出现上面的赋值错误!

改成这样
@echo off
setlocal ENABLEDELAYEDEXPANSION
set var=test & echo !var!
pause

很容易理解了吧!

 

 

分享到:
评论

相关推荐

    dos 环境变量延迟扩展enabledelayedexpansion详解

    【延迟环境变量扩展详解】 在DOS或CMD命令行环境中,环境变量的使用是常见的,但有时我们需要在命令的执行过程中动态地改变变量值并立即使用这个新的值,这就涉及到了“延迟环境变量扩展”。简单来说,延迟环境变量...

    bat脚本批量删除日志文件

    设置本地为延迟扩展(延迟变量),全称”延迟环境变量扩展”, 变量%%用!!代替,来获取变量实时的值。 3、实现原理: 这里由于日志文件命名是有规律的,都是日志名+时间(年月日).log,通过截取当中的日期与当前时间的...

    bat中for循环,实现变量自增的2种方式

    在某些情况下,你可能需要在for循环内部改变变量的值,这就需要启用延迟环境变量扩展。以下是使用这种方法的例子: ```batch @echo off setlocal enabledelayedexpansion set /a counter=1 for /L %%i in (1,1,10) ...

    bat批处理批量修改文件扩展名脚本

    `setlocal enabledelayedexpansion`启用延迟环境变量扩展,这样我们可以在for循环内部更改变量值。 `for %%i in (*) do (...)`这行代码遍历当前目录下的所有文件。`%%i`是一个通配符,代表每个文件。`%%~ni`获取...

    BAT批处理学习-数值计算-计算100以内数的和.zip

    这个脚本首先关闭了命令回显(`@echo off`),然后启用延迟环境变量扩展(`setlocal enabledelayedexpansion`),以便在循环中修改变量`sum`。接着,用`for /L`循环遍历从1到100的整数,每次迭代都将当前数值累加到`...

    windows下如何批量删除当前路径下指定扩展名的文件,看这个bat文件就明白了

    这段代码中,`@echo off`关闭了命令行窗口中的命令回显,`setlocal enabledelayedexpansion`启用延迟环境变量扩展,以便在for循环中使用变量。`for /R`命令用于递归地在当前目录及其所有子目录中查找匹配的文件。`if...

    dos批处理文件设计技巧

    6. **延迟环境变量扩展**:在某些情况下,批处理文件需要在命令执行时动态获取环境变量的值,这时需要开启延迟环境变量扩展(setlocal EnableDelayedExpansion)。 7. **命令行工具的使用**:批处理文件常与各种DOS...

    批处理教程(bat)

    `可以启用延迟环境变量扩展,使得变量在命令内部也能实时更新。 5)变量嵌套与命令嵌套:在批处理中,可以将变量嵌套在其他变量或命令中,同时命令也可以嵌套在条件语句或循环中,实现更复杂的逻辑。 三、批处理...

    批处理实现 一键配置 JDK 环境

    - `setlocal enabledelayedexpansion`:启用延迟环境变量扩展,以便在for循环或if条件语句中使用变量。 - `set JDK_PATH`:定义JDK的安装路径。 - `if not exist`:检查JDK_PATH是否有效。 - `setx`:设置系统环境...

    BAT批处理脚本-高级范例Loading.zip

    6. **延迟环境变量扩展**:在某些情况下,需要在命令执行时而不是脚本解析时计算变量值,这时可以启用延迟环境变量扩展(`setlocal EnableDelayedExpansion`),使得`!var!`能实时获取变量`var`的值。 7. **脚本...

    CMD命令行高级教程精选合编

    用于延迟环境变量扩展。 FOR命令是批处理中用于循环操作的强大工具,支持对目录、文件、数值范围以及文件内容进行迭代。变量的使用方式如%~I去除引号,%~fI获取完整路径,%~dI、%~pI、%~nI、%~xI分别获取驱动器、...

    BAT批处理脚本-文本操作-逃逸字符%的详细解释.zip

    1. **延迟环境变量扩展**:在某些情况下,我们可能需要在批处理脚本中动态改变变量的值,这时需要开启延迟环境变量扩展。可以通过在脚本开头使用`setlocal EnableDelayedExpansion`来实现。之后,可以使用`!变量名!`...

    代码.rar

    这段代码首先关闭了命令回显(@echo off),然后启用延迟环境变量扩展(setlocal enabledelayedexpansion),以便在循环中动态修改变量。接下来,定义了要替换的旧扩展名和新的扩展名。`for /R` 命令用于递归遍历...

    最全批处理教程

    `ENABLEDELAYEDEXPANSION` 用于启用延迟环境变量扩展,允许在命令执行时动态改变变量值。 17. `ATTRIB`: 显示或更改文件的属性,如只读、隐藏等。 二、特殊符号 1. `@`: 命令行回显屏蔽符。 2. `%`: 批处理变量...

    批处理使用技巧大全

    - `setlocal enabledelayedexpansion`启用延迟环境变量扩展,使得在循环中能动态修改变量。 8. **批处理高级技巧**: - 使用`for /f`循环处理命令输出,例如读取文本文件内容。 - `findstr`搜索字符串,常用于...

    目前为止最全的批处理教程

    **:在启用延迟环境变量扩展时,用于引用变量。 **FOR 命令** FOR 命令允许遍历文件、目录、字符串或其他数据集。其参数如/d、/R、/L、/F分别用于指定操作类型,如只处理目录、递归、迭代数值范围和文件解析。 **...

    BAT批处理脚本-文件相关操作-获取完整路径.zip

    在这个例子中,`@echo off`用于关闭命令行的回显,`setlocal enabledelayedexpansion`则是开启延迟环境变量扩展,以便在循环中使用环境变量。`for`循环遍历所有与"example.txt"匹配的文件,`%%i`是循环变量,`%%~fi`...

    Windows批处理教程及命令参考手册

    - `delayedexpansion`: 开启延迟环境变量扩展,使得在循环中可以修改环境变量。 - `errorlevel`: 获取上一个命令的错误级别,用于错误处理。 4. **命令参考大全**提供了所有内置的DOS命令详解,如: - `dir`: 列...

    70个批处理文件bat

    - `setlocal enabledelayedexpansion`:启用延迟环境变量扩展,允许在for循环中使用变量。 - `if errorlevel n`:检查上一个命令的退出状态码,进行错误处理。 通过学习这70个批处理文件的例子,你将深入理解...

Global site tag (gtag.js) - Google Analytics