Board logo

标题: [其他] 标签下启用延迟竟导致其中变量不被批处理识别? [打印本页]

作者: youxi01    时间: 2007-11-15 13:57     标题: 标签下启用延迟竟导致其中变量不被批处理识别?

写了一个关于获取字符串长度和字节数的函数。需要开启延迟变量。为了方便,把变量延迟的开启放到了标签下...
详见代码:
  1. @echo off
  2. set "str=haoren就是"
  3. call :GetStrLenAndStrB %str% strlen bytes
  4. echo %strlen% %bytes%
  5. pause>nul
  6. :GetStrLenAndStrB Str strlen bytes
  7. Rem '///////////////日期截取函数///////////////////////////////
  8. Rem 'code by youxi01@bbs.bathome.net 适用于Winxp;
  9. Rem '===============使用方法===================================
  10. Rem '1、要调用本段函数,先将标签下:GetStrLenAndStrB所有内容拷贝
  11. Rem '到对应批处理的pause段下。
  12. Rem '2、参数解析:Str为要获取字节数的字符串,strlen用来保存字符串
  13. Rem '长度,bytes用来保存字节
  14. Rem '3、用法示例::GetStrLenAndStrB "hao人" strlen bytes
  15. Rem '则,strlen的结果就为:4,bytes中的结果即为:5
  16. Rem '4、注意:本函数不能识别全角半角;
  17. Rem '==========================================================
  18. set "var=%~1"
  19. for /l %%i in (0 1 200) do (
  20.    setlocal enabledelayedexpansion
  21.    set "var_=!var:~%%i,1!"
  22.    if "!var_!"=="" endlocal &goto :eof
  23.    if !var_! gtr Z set /a %3+=2 else set /a %3+=1
  24.    set /a %2+=1
  25. )
复制代码

以上代码看起来没错,但是运行的时候,竟然显示的strlen 、bytes没有被定义过,后来经错误排查,找出是延迟变量的问题,后来把代码改为:
  1. @echo off
  2. set "str=haoren就是"
  3. call :GetStrLenAndStrB %str% strlen bytes
  4. echo %strlen% %bytes%
  5. pause>nul
  6. :GetStrLenAndStrB Str strlen bytes
  7. Rem '///////////////日期截取函数///////////////////////////////
  8. Rem 'code by youxi01@bbs.bathome.net 适用于Winxp;
  9. Rem '===============使用方法===================================
  10. Rem '1、要调用本段函数,先将标签下:GetStrLenAndStrB所有内容拷贝
  11. Rem '到对应批处理的pause段下。
  12. Rem '2、参数解析:Str为要获取字节数的字符串,strlen用来保存字符串
  13. Rem '长度,bytes用来保存字节
  14. Rem '3、用法示例::GetStrLenAndStrB "hao人" strlen bytes
  15. Rem '则,strlen的结果就为:4,bytes中的结果即为:5
  16. Rem '4、注意:本函数不能识别全角半角;
  17. Rem '==========================================================
  18. set "var=%~1"
  19. for /l %%i in (0 1 200) do (
  20.    setlocal enabledelayedexpansion
  21.    set "var_=!var:~%%i,1!"
  22.    if "!var_!"=="" goto :eof
  23.    if !var_! gtr Z (endlocal & set /a %3+=2) else endlocal & set /a %3+=1
  24.    set /a %2+=1
  25. )
复制代码

问题解决。
但是其中的道理却还是没有弄明白,希各方朋友不吝赐教啊!
作者: 随风    时间: 2007-11-15 18:11

:
你的第一个代码:
问题出在这一句if "!var_!"=="" endlocal &goto :eof
当 if  条件成立时,endlocal 结束了所有本地变量,也就是说把你的%2和%3的值都清空了。

你的第二个代码:
   代码本身没有问题,但作为 函数调用,就有不足之处,
   因为在你的代码中把var和var_ 都被定了义,回到call处时,var和var_没有被清空,
   这样别人在调用你的函数之前,如果把var赋了别的值,那么你的函数,就把他原来的值改变了。
建议将set var=%~1也放在延迟变量里去,

测试代码如下:
::
  1. @echo off
  2. set "str=haoren就是"
  3. set var=12345
  4. set var_=aaaaaa
  5. call :GetStrLenAndStrB %str% strlen bytes
  6. echo %strlen% %bytes%
  7. echo %var%
  8. echo %var_%
  9. pause>nul
  10. :GetStrLenAndStrB Str strlen bytes
  11. for /l %%i in (0 1 200) do (
  12.    setlocal enabledelayedexpansion
  13.    set var=%~1
  14.    set "var_=!var:~%%i,1!"
  15.    if "!var_!"=="" goto :eof
  16.    if !var_! gtr Z (endlocal & set /a %3+=2) else endlocal & set /a %3+=1
  17.    set /a %2+=1
  18. )
复制代码

[ 本帖最后由 随风 于 2007-11-15 21:21 编辑 ]




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