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

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

写了一个关于获取字符串长度和字节数的函数。需要开启延迟变量。为了方便,把变量延迟的开启放到了标签下...
详见代码:
  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. )
复制代码

问题解决。
但是其中的道理却还是没有弄明白,希各方朋友不吝赐教啊!

返回列表