批处理大小写字母转换问题

@echo off&setlocal enabledelayedexpansion
set str=aA bB cC dD eE fF gG hH iI jJ kK lL mM nN oO pP qQ rR sS tT uU vV wW xX yY zZ
for %%i in (%str%) do set "var=%%i" & set !var:~0,1!=%%i

set "TS="
set /P TS=请输入测试字符:
for /l %%i in (0 1 100) do (
set "T3=!TS:~%%i,1!"
if "!T3!"=="" goto :Res
if defined !T3! (
call set T2=%%!T3!:~0,1%%
if "!T3!"=="!T2!" call set T2=%%!T3!:~1,1%%) else set "T2=!T3!"
set Res=!Res!!T2!
)
:Res
echo.&echo 转换前:!TS!
echo 转换后:!Res!
pause>nul

请问空行上半部分与下半部分的联系,下半部分的原理,特别是Call命令在其中的作用?
我试了去掉CALL命令,输入特殊字符时输出为空格,兄弟能否详解一下CALL的用法。为什么当!T3!为特殊字符时if defined !T3! 会返回False值,而为数字时,则输出为空格符了?特殊字符和数字不能做变量定义?

第1个回答  2010-04-02
定义变量要用字符或者下划线开头,后面可以跟数字,
call 就是调用并执行外部文件或则内部的代码
这里的call的作用其实是变量二度值的替换,自己去看下延迟变量里面解析器处理变量的过程

call后面的语句其实执行了两个过程,
call set T2=%%!T3!:~0,1%% 假如 T3=aaaa
第一个过程是把set T2=%%!T3!:~0,1%%处理后传给call执行,处理后是set T2=%aaaa:~0,1%
第二个过程 执行这条语句 set T2=%aaaa:~0,1%
其实这是变量转换的过程,

上部分for %%i in (%str%) do set "var=%%i" & set !var:~0,1!=%%i
是把!var:~0,1!处理后的内容当成变量重新赋值为%%i,
开始%%i值是aA,var=%%i 把aA赋值给变量var,!var:~0,1!=%%i 是先把,!var:~0,1!处理后的内容为 a 当成变量名并赋值为aA。

if defined !T3! 是检查!T3!的值作为变量来检查该值有没有变量的定义,就是说内存中有没有该变量
第2个回答  2010-03-30
做这个的人想了不少心思,是可以省去call的 利用变量截取达到大小写转换

你认为我会没看懂?一定要用call?我不能换种写法?别把你想的跟什么似的.

不用call 这段代码就不能正常运行就这么简单 亮点就在if语句那本回答被提问者采纳
第3个回答  2010-04-02
@echo off
setlocal enabledelayedexpansion
set str=A=a B=b C=c D=d E=e F=f G=g H=h I=i J=j K=k L=l M=m N=n O=o P=p Q=q R=r S=s

T=t U=u V=v W=w X=x Y=y Z=z
set /p le=请输入:
FOR /f %%I IN ("!str!") do (
set le=!le:%%I!
)
echo !le!
pause
相似回答