标题: [其他] 标签下启用延迟竟导致其中变量不被批处理识别? [打印本页]
作者: youxi01 时间: 2007-11-15 13:57 标题: 标签下启用延迟竟导致其中变量不被批处理识别?
写了一个关于获取字符串长度和字节数的函数。需要开启延迟变量。为了方便,把变量延迟的开启放到了标签下...
详见代码:
- @echo off
- set "str=haoren就是"
- call :GetStrLenAndStrB %str% strlen bytes
- echo %strlen% %bytes%
- pause>nul
- :GetStrLenAndStrB Str strlen bytes
- Rem '///////////////日期截取函数///////////////////////////////
- Rem 'code by youxi01@bbs.bathome.net 适用于Winxp;
- Rem '===============使用方法===================================
- Rem '1、要调用本段函数,先将标签下:GetStrLenAndStrB所有内容拷贝
- Rem '到对应批处理的pause段下。
- Rem '2、参数解析:Str为要获取字节数的字符串,strlen用来保存字符串
- Rem '长度,bytes用来保存字节
- Rem '3、用法示例::GetStrLenAndStrB "hao人" strlen bytes
- Rem '则,strlen的结果就为:4,bytes中的结果即为:5
- Rem '4、注意:本函数不能识别全角半角;
- Rem '==========================================================
- set "var=%~1"
- for /l %%i in (0 1 200) do (
- setlocal enabledelayedexpansion
- set "var_=!var:~%%i,1!"
- if "!var_!"=="" endlocal &goto :eof
- if !var_! gtr Z set /a %3+=2 else set /a %3+=1
- set /a %2+=1
- )
复制代码
以上代码看起来没错,但是运行的时候,竟然显示的strlen 、bytes没有被定义过,后来经错误排查,找出是延迟变量的问题,后来把代码改为:
- @echo off
- set "str=haoren就是"
- call :GetStrLenAndStrB %str% strlen bytes
- echo %strlen% %bytes%
- pause>nul
- :GetStrLenAndStrB Str strlen bytes
- Rem '///////////////日期截取函数///////////////////////////////
- Rem 'code by youxi01@bbs.bathome.net 适用于Winxp;
- Rem '===============使用方法===================================
- Rem '1、要调用本段函数,先将标签下:GetStrLenAndStrB所有内容拷贝
- Rem '到对应批处理的pause段下。
- Rem '2、参数解析:Str为要获取字节数的字符串,strlen用来保存字符串
- Rem '长度,bytes用来保存字节
- Rem '3、用法示例::GetStrLenAndStrB "hao人" strlen bytes
- Rem '则,strlen的结果就为:4,bytes中的结果即为:5
- Rem '4、注意:本函数不能识别全角半角;
- Rem '==========================================================
- set "var=%~1"
- for /l %%i in (0 1 200) do (
- setlocal enabledelayedexpansion
- set "var_=!var:~%%i,1!"
- if "!var_!"=="" goto :eof
- if !var_! gtr Z (endlocal & set /a %3+=2) else endlocal & set /a %3+=1
- set /a %2+=1
- )
复制代码
问题解决。
但是其中的道理却还是没有弄明白,希各方朋友不吝赐教啊!
作者: 随风 时间: 2007-11-15 18:11
:
你的第一个代码:
问题出在这一句if "!var_!"=="" endlocal &goto :eof
当 if 条件成立时,endlocal 结束了所有本地变量,也就是说把你的%2和%3的值都清空了。
:
你的第二个代码:
代码本身没有问题,但作为 函数调用,就有不足之处,
因为在你的代码中把var和var_ 都被定了义,回到call处时,var和var_没有被清空,
这样别人在调用你的函数之前,如果把var赋了别的值,那么你的函数,就把他原来的值改变了。
建议将set var=%~1也放在延迟变量里去,
:
测试代码如下:
::- @echo off
- set "str=haoren就是"
- set var=12345
- set var_=aaaaaa
-
- call :GetStrLenAndStrB %str% strlen bytes
- echo %strlen% %bytes%
- echo %var%
- echo %var_%
- pause>nul
- :GetStrLenAndStrB Str strlen bytes
- for /l %%i in (0 1 200) do (
- setlocal enabledelayedexpansion
- set var=%~1
- set "var_=!var:~%%i,1!"
- if "!var_!"=="" goto :eof
- if !var_! gtr Z (endlocal & set /a %3+=2) else endlocal & set /a %3+=1
- set /a %2+=1
- )
复制代码
[ 本帖最后由 随风 于 2007-11-15 21:21 编辑 ]
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |