标题: [文本处理] [已解决]求解释:批处理中的 call set 语句 [打印本页]
作者: garyv 时间: 2013-5-19 15:05 标题: [已解决]求解释:批处理中的 call set 语句
本帖最后由 garyv 于 2013-5-22 08:59 编辑
call set var2=%%!var1!:~0,1%%
为什么这条set语句可以被call?是什么含义,会进入什么地方定义的function呢?
作者: 林小七 时间: 2013-5-19 16:29
call...???set被call???你去看看变量延迟吧....- @echo off
- set a=10&&@echo a=%a%
- @echo a=%a%
- set b=20&&call echo b=%%b%%
复制代码
看看结果??懂了没??
作者: 林小七 时间: 2013-5-19 16:33
- @echo off
- setlocal EnableDelayedExpansion
- set d=100&&echo d=%d%
- set c=100&&echo c=!c!
复制代码
这个和call的效果一样.....开启setlocal EnableDelayedExpansion
.
作者: garyv 时间: 2013-5-19 23:11
回复 3# 林小七
看了几个关于 setlocal enabledelayedexpansion 的链接,但是都没有讲解"call set xxx"例子,还是不明白 call set。。。
这位高手能否提供一个合适的链接或文档?
作者: CrLf 时间: 2013-5-19 23:29
http://bbs.bathome.net/viewthread.php?tid=3231
作者: 林小七 时间: 2013-5-20 16:14
回复 4# garyv
楼上给了哦...如果你系统的看bathome的教程会有这个 的..不要心急哦
作者: garyv 时间: 2013-5-20 23:51
回复 6# 林小七
你的例子我是看明白了,但是下面从网上找到的大小写转换的代码没弄明白:- 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!
复制代码
疑问:
1)如果没有"setlocal enabledelayedexpansion"语句下面的set...和for...那2行,运行结果是不对的,有这2行就是正确的!
2)这2行语句中"!var:~0,1!=%%i",不知什么含义,难道是:取出var中的第一个字符然后被%%i赋值?一个常量怎么被赋值呢?
作者: garyv 时间: 2013-5-21 09:00
请高手帮我看看
作者: Python 时间: 2013-5-21 09:07
回复 7# garyv
难道是:取出var中的第一个字符然后被%%i赋值?一个常量怎么被赋值呢?
它就是一个普通的字母而已,为什么说它是常量呢?
作者: Python 时间: 2013-5-21 09:31
回复 7# garyv
如果没有"setlocal enabledelayedexpansion"语句下面的set...和for...那2行,运行结果是不对的,有这2行就是正确的!
就是变量延迟的两种不同方法而已- @echo off
- REM Method 1
- set str=aA
- for %%i in (%str%) do (
- set "var=%%i"
- call set %%var:~0,1%%=%%i
- call echo %%a%%
- )
-
- REM Method 2
- setlocal enabledelayedexpansion
- set str=aA
- for %%i in (%str%) do (
- set "var=%%i"
- set !var:~0,1!=%%i
- echo !a!
- )
复制代码
作者: garyv 时间: 2013-5-21 09:32
回复 9# Python
从C的角度分析,左边取出的字符没有显式地保存到一个变量中,这种左值是不能被赋值的,难道是替换?
作者: Python 时间: 2013-5-21 09:41
回复 11# garyv
这是BAT,不能从C的角度去分析。
作者: garyv 时间: 2013-5-21 10:10
回复 10# Python
这2种方法打印出来都是 aA,没有进行大小写转换,还有那条echo后面的变量%a%是从哪里来的呢?
顺便解释一下我贴上去的大小写转换代码,谢谢。
作者: Python 时间: 2013-5-21 17:08
回复 13# garyv
10楼的代码是给你演示两种不同的变量延迟扩展,不是为了大小写转换。
你希望解释代码里面的哪个部分?
作者: 林小七 时间: 2013-5-21 17:22
请问具体哪里不明白呢???
作者: garyv 时间: 2013-5-21 18:01
set !var:~0,1!=%%i
这条语句的运行结果?意图是什么?
比如:var=12345,%%i=ABC,则运行后var=?
作者: apang 时间: 2013-5-21 19:21
- @echo off
- setlocal enabledelayedexpansion
- Rem 开启变量延迟
-
- 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
- Rem 给变量str赋值
-
- for %%i in (%str%) do set "var=%%i" & set !var:~0,1!=%%i
- Rem 将aA赋值给变量a,bB赋值给变量b,cC赋值给变量c,。。。zZ赋值给变量z
-
- set "TS="
- Rem 初始化变量TS
-
- set /P TS=请输入测试字符:
- Rem 提示输入,假设输入字串为aBc
-
- for /l %%i in (0 1 100) do (
- Rem 从0到100循环101次
-
- set "T3=!TS:~%%i,1!"
- Rem 循环第1次,变量T3赋值为a;循环第2次,T3赋值为B;循环第3次,T3赋值为c
-
- if "!T3!"=="" goto :Res
- Rem 循环第4次时,T3的值为空,就跳转到标签Res
-
- if defined !T3! (
- Rem 循环第1~3次时,T3的值不为空,条件为真,执行下面的语句
-
- call set T2=%%!T3!:~0,1%%
- Rem 循环第1次时,T3的值为a,而变量a的值为aA,取第1位a,变量T2被赋值为a;
- Rem 循环第2次时,T3的值为B,而变量B的值为bB,取第1位b,变量T2赋值为b;以此类推。
-
- if "!T3!"=="!T2!" call set T2=%%!T3!:~1,1%%
- Rem 循环第1次,T3的值a与T2的值a相等,那么截取aA的第2位A,变量T2被赋值为A;
- Rem 循环第2次,T3的值B与T2的值b不相等,那么T2不重新赋值,即T2的值是b;以此类推
-
- ) else set "T2=!T3!"
- Rem 到循环第4次时,因为T3的值为空,所以将空值赋给T2,就是初始化变量T2
-
- set Res=!Res!!T2!
- Rem 将每次循环得到的变量T2的值串接起来
-
- )
- :Res
- echo.&echo 转换前:!TS!
- echo 转换后:!Res!
-
- pause
复制代码
作者: garyv 时间: 2013-5-21 22:00
回复 17# apang
谢谢提供的详细注释。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |