[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程批处理在线视频分享
返回列表 发帖

[系统相关] Setlocal enabledelayedexpansion放在哪个位置最好?

记得之前在论坛中看过一篇文章,说把Setlocal enabledelayedexpansion和 endlocal放在复合语句内部最正确,但是按这种方式操作,却接连出现问题。十分迷茫。
现在主要想弄清楚两个问题:
Setlocal enabledelayedexpansion和 endlocal,放在哪个位置得到的结果,“准确”且“效率高”?
(1)复合语句括号之外
(2)复合语句括号之内
-------------------------------
已知文件%tmp1%内容如下:
  1. HKEY_CURRENT_USER\Temp Num\Temp1
  2. String 1
  3. String 2
  4. String 3
  5. String 4
  6. Stringabcdefghigklmnopqrstuvwsyz 1
  7. Stringabcdefghigklmnopqrstuvwsyz 2
  8. Stringabcdefghigklmnopqrstuvwsyz 3
  9. Stringabcdefghigklmnopqrstuvwsyz 4
  10. String abcdefghigklmnopqrstuvwsyz str1
  11. String abcdefghigklmnopqrstuvwsyz str2
  12. String abcdefghigklmnopqrstuvwsyz str3
  13. String abcdefghigklmnopqrstuvwsyz str4
  14. HKEY_CURRENT_USER\Temp Num\Temp2
  15. String 1
  16. String 2
  17. String 3
  18. String 4
  19. Stringabcdefghigklmnopqrstuvwsyz 1
  20. Stringabcdefghigklmnopqrstuvwsyz 2
  21. Stringabcdefghigklmnopqrstuvwsyz 3
  22. Stringabcdefghigklmnopqrstuvwsyz 4
  23. ……(后面类似,省略不写)……
复制代码
1、把Setlocal enabledelayedexpansion和 endlocal放在复合语句内部,代码和结果如下:
  1. ===========代码:========
  2. set "tmp1=%temp%\t1.txt"
  3. for /f "delims=" %%a in ('type %tmp1%') do (
  4. Setlocal enabledelayedexpansion
  5. set "str=%%a"
  6. if /i "!str:~,5!"=="HKEY_" (set "sKey=%%a") else (set "sval=%%a")
  7. if defined sval (echo,!sKey!---!sval! &set "sval=")
  8. endlocal
  9. )
  10. pause&exit
  11. ======结果==========
  12. ---String 1
  13. ---String 2
  14. ---String 3
  15. ---String 4
  16. ---Stringabcdefghigklmnopqrstuvwsyz 1
  17. ---Stringabcdefghigklmnopqrstuvwsyz 2
  18. ---Stringabcdefghigklmnopqrstuvwsyz 3
  19. ---Stringabcdefghigklmnopqrstuvwsyz 4
  20. ---String abcdefghigklmnopqrstuvwsyz str1
  21. ---String abcdefghigklmnopqrstuvwsyz str2
  22. ---String abcdefghigklmnopqrstuvwsyz str3
  23. ---String abcdefghigklmnopqrstuvwsyz str4
  24. ---String 1
  25. ---String 2
  26. ====结论=====
  27. 部分变量并未得到延迟,结果为空
复制代码
2、把Setlocal enabledelayedexpansion和 endlocal放在复合语句外部,代码和结果如下:
  1. ===========代码:========
  2. set "tmp1=%temp%\t1.txt"
  3. Setlocal enabledelayedexpansion
  4. for /f "delims=" %%a in ('type %tmp1%') do (
  5. set "str=%%a"
  6. if /i "!str:~,5!"=="HKEY_" (set "sKey=%%a") else (set "sval=%%a")
  7. if defined sval (echo,!sKey!---!sval! &set "sval=")
  8. )
  9. endlocal
  10. pause&exit
  11. ======结果==========
  12. HKEY_CURRENT_USER\Temp Num\Temp1---String 1
  13. HKEY_CURRENT_USER\Temp Num\Temp1---String 2
  14. HKEY_CURRENT_USER\Temp Num\Temp1---String 3
  15. HKEY_CURRENT_USER\Temp Num\Temp1---String 4
  16. HKEY_CURRENT_USER\Temp Num\Temp1---Stringabcdefghigklmnopqrstuvwsyz 1
  17. HKEY_CURRENT_USER\Temp Num\Temp1---Stringabcdefghigklmnopqrstuvwsyz 2
  18. HKEY_CURRENT_USER\Temp Num\Temp1---Stringabcdefghigklmnopqrstuvwsyz 3
  19. HKEY_CURRENT_USER\Temp Num\Temp1---Stringabcdefghigklmnopqrstuvwsyz 4
  20. HKEY_CURRENT_USER\Temp Num\Temp1---String abcdefghigklmnopqrstuvwsyz str1
  21. HKEY_CURRENT_USER\Temp Num\Temp1---String abcdefghigklmnopqrstuvwsyz str2
  22. HKEY_CURRENT_USER\Temp Num\Temp1---String abcdefghigklmnopqrstuvwsyz str3
  23. HKEY_CURRENT_USER\Temp Num\Temp1---String abcdefghigklmnopqrstuvwsyz str4
  24. HKEY_CURRENT_USER\Temp Num\Temp2---String 1
  25. HKEY_CURRENT_USER\Temp Num\Temp2---String 2
  26. HKEY_CURRENT_USER\Temp Num\Temp2---String 3
  27. HKEY_CURRENT_USER\Temp Num\Temp2---String 4
  28. ====结论=====
  29. 变量得到延迟,结果正确
复制代码
补充疑问:
如果把在复合语句内部再开启变量延迟开关是正确的,那么在for循环中,每执行一句就要开关一次,岂不是更消耗资源吗?

那么在for循环中,每执行一句就要开关一次,岂不是更消耗资源吗?

你循环执行1万次,看看到底慢多少?
【扫描二维码捐助论坛的朋友请留言注明论坛账号】http://bbs.bathome.net/thread-10403-1-1.html
【批处理在线视频分享】http://bbs.bathome.net/thread-31727-1-1.html
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html

TOP

回复 2# Batcher
关键是放在内部无法得到执行结果啊

TOP

回复 3# 踏沙行


    一个连基本功能都无法实现的代码,何谈好或不好呢。
【扫描二维码捐助论坛的朋友请留言注明论坛账号】http://bbs.bathome.net/thread-10403-1-1.html
【批处理在线视频分享】http://bbs.bathome.net/thread-31727-1-1.html
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html

TOP

回复 4# Batcher
我是怀疑,我把变量延迟开关放在内部的写法,是不是哪里出错了?
也许,放在内部是最好的,但我没有写对。

另外,有时候放在内部结果正确,有时候结果出错。
不知道是哪里的问题?

TOP

论坛写的不一定都是正确的,所谓 "尽信书不如无书";实践是检验真理的唯一标准.
做实验最好把@echo on 打开,看看cmd的指令到底是执行的啥玩意!!!
每个for语句其实是一行指令,别看分行写,其实是一个指令;在执行该指令前,若没有开启变量延迟,那么cmd会对指令中的每个变量进行预赋值;若开启了变量延迟,cmd不会对变量进行预赋值;
你的第一个例子setlocal放在