测试如下代码。复制内容到剪贴板代码:- @echo off
- set a=0b0c00a000s&echo %a%
- pause
复制代码 保存为bat。运行,你会发现a的值并不是你所想的那样,而是显示echo处于关闭状态。
这是因为CMD命令解释器在读到set a=0b0c00a000s&echo %a%这一条完整的语句时,发现a用%%闭合,是个变量,会把它替换成之前所赋给它的字符串常量,并把它打印出来。而在这条完整的语句之前并没有给a赋值,即是空值。所以才会显示echo处于关闭状态。请理解“一条完整的语句”的意思。
set a=0b0c00a00s&echo %a% 这才是一条完整的语句。
同样的,for语句中给a赋值,然后又在for中引用%a%,在这之前,CMD早就把它替换为空值了,所以你的代码会出错。
如何避免这种出错呢,要用到变量延迟了。
setlocal enabledelayedexpansion 这条语句的意思即是开启变量延迟。它的作用就是要告诉CMD,在读到一条完整的语句时,不要急匆匆地扩展变量。而是在执行复合语句(for语句或if语句中其后用一对圆括号闭合的所有语句称为复合语句,用&或&&连接的也是复合语句。)中的某单条语句之后,再执行变量的扩展,也就是说,这个变量扩展的行为被延后了。在开启延迟之后,在for中给变量a赋值,又在for中引用a,此时,就不应用%%将其闭合了,而是用!!。
你的代码应该是这样。复制内容到剪贴板代码:- @echo off&setlocal enabledelayedexpansion
- echo %time%&ping 127.1 /n 5 >nul&echo !time!
- pause
复制代码 还要记得,如果在复合语句之外再次引用变量,此时它的值是在复合语句之内最后得到的值。- @echo off&setlocal enabledelayedexpansion
- for /l %%a in (100 1 199) do set var=%%a&echo !var:~1!
- echo %var%
- pause
复制代码 关于变量延迟,搜索一下,多做测试很快就能明白了,我说的很粗糙。 |