[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] [已解决]批处理SetLocal 的一些疑问与讨论

最近写了些代码,有时需开启变量延迟,但为了避免处理有!号路径或文件时出错,又不能全开,只能选择性的开了又关,关了再开...于是就发现了SetLocal的一些问题...这里讨论一下
  1. @echo off
  2. set a=ABC
  3. SetLocal EnableDelayedExpansion
  4. set a=IJK
  5. SetLocal DisableDelayedExpansion
  6. echo %a%
  7. pause
复制代码
结果为 IJK
  1. @echo off
  2. set a=ABC
  3. SetLocal EnableDelayedExpansion
  4. set a=IJK
  5. SetLocal DisableDelayedExpansion
  6. echo %a%
  7. pause
  8. SetLocal EnableDelayedExpansion
  9. set a=OPQ
  10. SetLocal DisableDelayedExpansion
  11. echo %a%
  12. pause
复制代码
结果是 OPQ

但是,
  1. @echo off
  2. set a=ABC
  3. SetLocal EnableDelayedExpansion
  4. set a=IJK
  5. SetLocal DisableDelayedExpansion
  6. echo %a%
  7. pause
  8. call :A
  9. echo %a%
  10. pause
  11. goto :eof
  12. :A
  13. SetLocal EnableDelayedExpansion
  14. set a=OPQ
  15. SetLocal DisableDelayedExpansion
复制代码
结果是 IJK

  1. @echo off
  2. set a=ABC
  3. SetLocal EnableDelayedExpansion
  4. set a=IJK
  5. SetLocal DisableDelayedExpansion
  6. echo %a%
  7. pause
  8. call :A
  9. echo %a%
  10. pause
  11. goto :eof
  12. :A
  13. ::SetLocal EnableDelayedExpansion
  14. set a=OPQ
  15. ::SetLocal DisableDelayedExpansion
复制代码
结果却是 OPQ

而下面
  1. @echo off
  2. set a=ABC
  3. SetLocal EnableDelayedExpansion
  4. set a=IJK
  5. SetLocal DisableDelayedExpansion
  6. echo %a%
  7. pause
  8. goto :A
  9. :A
  10. SetLocal EnableDelayedExpansion
  11. set a=OPQ
  12. SetLocal DisableDelayedExpansion
  13. echo %a%
  14. pause
复制代码
结果还是 OPQ

所以大概的结论是,call 会让 SetLocal EnableDelayedExpansion 开辟新的变量空间,此时对环境变量来说,相当于SetLocal...而SetLocal DisableDelayedExpansion则相当于endlocal
1

评分人数

返回列表