1. EnableDelayedExpansion 什么作用
bat中EnableDelayedExpansion
用来设置变量的延迟扩展,通过以下语句可以打开延迟扩展,
SETLOCAL EnableDelayedExpansion
这样设置后变量的扩展时间将发生在execution时而不是变量 parse时,可以通过下边的例子看出其作用。
@echo off
SETLOCAL
Set "_var=first"
Set "_var=second" & Echo %_var%
此例子不使用EnableDelayedExpansion
,输出为: first
,也就是说Set "_var=second"
像是没有发生作用一样。
@echo off
SETLOCAL EnableDelayedExpansion
Set "_var=first"
Set "_var=second" & Echo !_var!
这个例子中我们打开DelayedExpansion开关,则输出 second
, 这样更符合我们对脚本的输出预期。
2. 字符串截取
对字符串变量的截取操作,
前n个字符 | %str:~0,n% |
去掉最后n个字符后的字符串 | %str:~0,-n% |
第m个字符开始的n个字符 | %str:~m-1,n% |
倒数第n个字符为 | %str:~-n,1% |
倒数第n个及其之后的字符为 | %str:~-n% |
倒数第n个开始的m个字符为 | %str:~-n,m% |
3. goto 和 call 有什么不同
goto
改变了bat脚本自上而下的执行顺序,将程序的运行跳转到冒号指定的标签处,并从此处往下运行。
call
与qoto
比较类似,也是改变脚本的运行顺序,将程序跳转到指定标签。但是,如果使用的是call
,则再跳转后遇到exit
或eof
时,脚本的运行将回到call
的调用处,即执行call
的下边那条指令。
另外,call·还可以传递参数,在跳转到的标签中,
%1`即传递的第一个参数。
4. ERRORLEVEL 和 %ERRORLEVEL% 有何不同
-
退出码
ERRORLEVEL
为上一个运行程序的退出码(exit code).如果运行的是一个不存在的程序或命令,则这个退出码会被设置为9009.
exit code
的检测与编写高级语言的习惯可能有点儿不一样,比如下边的语句,
IF ERRORLEVEL 1 ECHO exit code 1?
exit code 1?
被打印出来,并不意味着ERRORLEVEL
等于1,而是说明此时ERRORLEVEL
>=1 -
那么我们怎么能像高级编程语言那样直接进行相等性判断呢?答案如下,
IF ERRORLEVEL N IF NOT ERRORLEVEL N+1 COMMAND
-
我们可以自己定义一个变量叫
ERRORLEVEL
么?答案是可以,此时会发生类似c语言中局部变量和全局变量的事情(但不完全一样),比如我们创建了一个变量ERRORLEVEL
,
set ERRORLEVEL=1
if ERRORLEVEL 1 echo hello ^_^
我们将看不到hello ^_^
的输出,因为我们设置的是ERRORLEVEL
这个变量的值是1,而这个变量并不是退出码,退出码保存的仍然是上一个程序的exit code!!
- 如果我们判断使用的是
%ERRORLEVEL%
而不是ERRORLEVEL
呢?
那么,脚本会先查找有没有ERRORLEVEL
这个变量,若找到这个变量了,就用这个变量,找不到就用退出码。