Board logo

标题: [原创] 批处理命令 call 的详细用法 [打印本页]

作者: 悬崖之树    时间: 2014-7-23 21:54     标题: 批处理命令 call 的详细用法

先看代码:
  1. @echo off
  2. set str=!abc!
  3. set !abc!=ok
  4. echo %str%
  5. set abc=sss
  6. setlocal enabledelayedexpansion
  7. call echo %%!str!%%
  8. endlocal
  9. pause
复制代码
运行结果为:
  1. !abc!
  2. ok
  3. 请按任意键继续. . .
复制代码
下面是解释:
第二句  因为没有开启变量延迟,所以变量str的值为字符串!abc!
第三句  设置变量!abc!的值为字符串ok  ,注意这个变量包含感叹号!
第四句  显示变量str的值,因为没有开启变量延迟,所以输出!abc!
第五i句  无需解释
第六句  开启变量延迟
第七句  关键句,下面是详细解释:
       cmd在预处理 call %%!str!%%时,第一步是替换%var%类型的变量,这里没有这种变量,所以不做任何处理。第二步,由于变量延迟扩展的特性,在执行到 call echo %%!str!%% 时,才替换!str!为!abc!,这是这句代码就变成了call echo %%!abc!%%,这时,第三步开始了,是处理call命令,这时代码变成了echo %!abc!%,第四步,显示变量!abc!的值,就输出ok了,注意这里只会处理%var%之类的变量,而不处理!var!之类的变量。
再看下面的代码:
  1. @echo off
  2. set str=!abc!
  3. set !abc!=ok
  4. set abc=sss
  5. setlocal enabledelayedexpansion
  6. call :t
  7. endlocal
  8. pause
  9. :t
  10. echo %%!str!%%
  11. goto :eof
复制代码
运行结果为:
  1. %!abc!%
  2. 请按任意键继续. . .
复制代码
下面是解释:
因为有些代码前面已经解释过了,这里不再解释。
执行到call :t 这句时,cmd将读取 echo %%!str!%% ,然后进行预处理,第一步,替换%var%之类的变量,这里没有,就跳过。第二步,替换!var!之类的变量,代码就变成 echo %%!abc!%%,然后就输出 %!abc!%了。


总结:
开启变量延迟后,对于
  1. call echo %%!str!%%
复制代码
预处理一般是先替换%var%之类的变量,然后等执行到有!var!的代码时,替换!var!,之后,处理call命令,将%%变成%,最后,再替换%var%之类的变量,然后直接输出,而不会去处理!var!之类的字符串。对于
  1. setlocal enabledelayedexpansion
  2. call :t
  3. endlocal
  4. pause
  5. :t
  6. echo %%!str!%%
  7. goto :eof
复制代码
将%%变成%不是call的原因,这里的call其实和goto的作用是一样的,只不过是用call时,执行完所调用的程序代码后还可以回来,而goto不行。这样cmd处理echo %%!str!%%就很简单了,替换!str!同时把%%变成%后直接输出。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2