bat中几个要搞清楚的东西(一)

文章目录

    • 1. EnableDelayedExpansion 什么作用
    • 2. 字符串截取
    • 3. goto 和 call 有什么不同
    • 4. ERRORLEVEL 和 %ERRORLEVEL% 有何不同

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脚本自上而下的执行顺序,将程序的运行跳转到冒号指定的标签处,并从此处往下运行。
callqoto比较类似,也是改变脚本的运行顺序,将程序跳转到指定标签。但是,如果使用的是call,则再跳转后遇到exiteof时,脚本的运行将回到call的调用处,即执行call的下边那条指令。
另外,call·还可以传递参数,在跳转到的标签中,%1`即传递的第一个参数。

4. ERRORLEVEL 和 %ERRORLEVEL% 有何不同

  1. 退出码
    ERRORLEVEL为上一个运行程序的退出码(exit code).如果运行的是一个不存在的程序或命令,则这个退出码会被设置为9009.
    exit code的检测与编写高级语言的习惯可能有点儿不一样,比如下边的语句,
    IF ERRORLEVEL 1 ECHO exit code 1?
    exit code 1?被打印出来,并不意味着ERRORLEVEL等于1,而是说明此时ERRORLEVEL>=1

  2. 那么我们怎么能像高级编程语言那样直接进行相等性判断呢?答案如下,
    IF ERRORLEVEL N IF NOT ERRORLEVEL N+1 COMMAND

  3. 我们可以自己定义一个变量叫ERRORLEVEL么?答案是可以,此时会发生类似c语言中局部变量和全局变量的事情(但不完全一样),比如我们创建了一个变量ERRORLEVEL,

set ERRORLEVEL=1
if ERRORLEVEL 1 echo hello ^_^

我们将看不到hello ^_^的输出,因为我们设置的是ERRORLEVEL这个变量的值是1,而这个变量并不是退出码,退出码保存的仍然是上一个程序的exit code!!

  1. 如果我们判断使用的是%ERRORLEVEL%而不是ERRORLEVEL呢?
    那么,脚本会先查找有没有ERRORLEVEL这个变量,若找到这个变量了,就用这个变量,找不到就用退出码。

你可能感兴趣的:(bat中几个要搞清楚的东西(一))