标题: 你的批处理“变量延迟”练到第几层了? [打印本页]
作者: plp626 时间: 2012-3-6 00:26 标题: 你的批处理“变量延迟”练到第几层了?
不运行代码,猜猜下面代码输出什么?- @echo off
- setlocal enabledelayedexpansion
- (
- set "s=^!x^!"
- set x=2
- set ss=abc
- echo 1. !ss:~%x%,1!
- )
- echo 2. !ss:~%x%,1!
- for %%a in (!x!)do echo 3. !ss:~%%a!
- for %%a in (!s!)do echo 4. !ss:~%%a!
- for %%a in (!s!)do echo 5. !ss:~!%%a
- for %%a in (!s!)do echo 6. !ss:~%%a!-!ss:~!%%a
- for %%a in (!s!)do echo 7. !ss:~%%a!-!-!ss:~!%%a
- for %%a in (!s!)do echo 8. "!ss:~^%%a!"-!-^"!ss:~!^%%a
- for %%a in (^^!s!)do echo 9. !ss:~%%a!-!-!ss:~!%%a!
- for %%a in (!s^^!)do echo 0. !ss:~%%a!-!-!ss:~!%%a
- pause
复制代码
共10行,第一行回答正确则为第一层,类推;第10行猜“对”了,一切归零;
10行全回答正确;你的批处理内功应该是非常牛X了,变量延迟的掌握算得上精通了
作者: terse 时间: 2012-3-6 03:04
都是变义惹的祸
作者: applba 时间: 2012-3-6 17:45
echo 1. !ss:~0,1!
echo 2. !ss:~2,1!
echo 3. !ss:~!x!!
作者: QIAOXINGXING 时间: 2012-3-6 19:15
第一个我就不知道是怎么回事。。。。。。。。
作者: terse 时间: 2012-3-6 19:51
我知道 第一个 这时候的 %x% 应该是空的(因为在括号内) 所以解释为 !ss:~,1! 结果应该是a
第二个 这时候的 %x% (有效因为出了括号) 所以解释为 !ss:~2,1! 结果为 c
第三个 显然是 !ss:~2!
第四个 注意这里开始的干扰 这里的 !ss:~%%a! 我看作是 !ss:~!X!! 分离它 !ss:~! X !! 解释为 ABCX
第五 !ss:~!%%a 看作 我看作是 !ss:~! !X! 解释 ABC2
第六 !ss:~%%a!-!ss:~!%%a 我的分解是 !ss:~!x !!-! ss:~ ! !x! 合并成ABCXSS:~2
作者: yuanyannian 时间: 2012-3-6 20:58
我知道 第一个 这时候的 %x% 应该是空的(因为在括号内) 所以解释为 !ss:~,1! 结果应该是a
第二个 这时候 ...
terse 发表于 2012-3-6 19:51
这个,楼上太多“层”了,请教你是咋练的?
像顶楼的的这段代码,别说解释了,看看都头大。
我等要好好学呀!
作者: yuanyannian 时间: 2012-3-6 21:05
回复 6# yuanyannian
不过对我有所启发的,是 for %%a 是可以重复使用的(曾提到过这个幼稚的问题---我是真不知道),不知理解的对不对?
作者: find 时间: 2012-3-6 22:15
欲练神功,必先......你懂的
作者: applba 时间: 2012-3-7 19:15
实际使用时三层就够用了
作者: applba 时间: 2012-3-7 19:16
实际使用时三层就够用了
作者: cjiabing 时间: 2012-3-7 19:22
话说我无能为力,只能在写代码时边写边测试!~
如果记得这些常用的办法,确实是一眼就能知道运行结果的,省了许多测试的功夫,当然,这也需要练习来达成!~
楼主的代码,大家看懂了叹号、百分号等变量符号在变量延迟下的应用即可,具体讲解看教学区教程!~
作者: wc726842270 时间: 2012-3-7 20:04
个人认为二到三层就差不多,再多了也会影响效率。如果层数过多的话也许是自已的思路出现错误。
以上仅是个人想法,但并不代表可以不会
作者: qzwqzw 时间: 2012-3-7 20:10
惭愧
炼到第六层就走火入魔了
作者: msdlya 时间: 2012-5-12 11:17
看不懂啊。。。。。。。。。。。。。。。。。
作者: pinke8 时间: 2012-7-2 19:51
一般情况下四层就差不多了,不过偶还只在第二到三层的样子
作者: ht河豚 时间: 2012-8-18 13:03
一层都不懂
作者: 路过 时间: 2012-10-20 15:56
a
c
c
abcx
作者: hankerer 时间: 2013-1-18 20:29
楼主,能不能解释一下为什么啊.
作者: 523066680 时间: 2013-2-2 10:17
以前用到第三层,大概。
作者: batman 时间: 2013-2-2 11:44
个人认为这个测试真的说明不了什么,
代码中千变万化的情况可比解析这10行echo要复杂多了,
再说谁会在代码中这样嵌套变量(5-10)?
PS:本人也只解析到第五层。。。
作者: CrLf 时间: 2013-2-2 20:59
3...
作者: amwfjhh 时间: 2014-11-18 09:48
心算第三层,ECHO ON能懂到第六层,第七层后echo on都不明白了……后面还有个诡异的第“十”层,怎么消失的都不知道……
作者: ads350668398 时间: 2014-11-18 10:27
怎么回事层都不对 1层为什么是a 2为什么是C 晕
作者: amwfjhh 时间: 2014-11-18 11:04
后面有解释的。这就是标准语句块里面的变量延时问题。处于括号中的语句与&连接的语句一样是一个语句块,它们在“同一时刻”被运行,所以不管前后,赋值的结果都不会作用于语句块内的%%调用,除非使用开启了变量延时的!!调用才能取得实时值。
作者: apang 时间: 2014-11-18 13:26
只能到3层,惭愧
作者: yiwuyun 时间: 2014-11-24 14:11
昨天刚注册就看到了这个。有点感兴趣,无聊就试着分析了一下,得出了如下粗略的结论。有待验证。用这些结论试着分析了一下。
延迟变量中,从左到右依次执行
1.各种符号首先要配对,如果配对成功,则执行,执行之后不会再影响后面的符号,如果配对不成功,会产生副作用.
2.两个及两个以上!在一起视为一个!(当然必须先满足从左到右的原则)
3.双引号在遇到特殊符号!之前要求配对,否则影响!的作用。要求配对,如果不能配对,它会改变后面遇到的使用延迟变量的!的作用。
4.!要求配对,如果不能配对,也会改变后面遇到的特殊符号的作用。?
5.^会改变双引号配对的要求,如果它在双引号之前。因为它被转义了,所以双引号配对的要求被忽视。同样的,! 在前,双引号配对的要求
会被忽视。因此,谁优先,就先满足谁。
6.在括起的双引号中,一个^可以使!转义,但如果没有双引号括起,要两个^才能让!转义,一个不改变!的作用。但一个^会使双引号转义。
因此,一个^会让双引号的配对要求失效。
7.前面先有一个双引号,在双引号未配对之前,一个^就能使!转义。
8.^一旦出现,会取消前面的双引号的配对要求。
9.前无双引号,^要翻倍,才能起作用。4个^输出一个^.前有双引号,两个输出一个。
10.:会取消前面!配对的要求。如果!后的变量存在,则该变量及以后的:会保留,否则都会去掉。
六层之前都比较简单,无须多说。
第6层:%%a=!x! r因此扩展为:echo !ss:~!x!!-!ss:~!!x! 按上面的结论,很简单。abcxss:~2
第7层:!ss:~!x!!-!-!ss:~!!x! abcx-abc2
第8层:"!ss:~^!x!!"-!-^"!ss:~!^!x! 这一层比较复杂,因为引入了"和^ 但有上面的结论就不难了。
"ss:~!x-"abc2
第9层:^^!s!扩展为!s. 同时后面的扩展为:!ss:~!s!-!-!ss:~!!s! 结论。abcs-abc!x!
第10层。我很想了一会,最后才明白,当()里为空时,根本不执行后面的echo命令。被忽悠了。
作者: changedirectory 时间: 2014-12-3 22:33
回复 26# yiwuyun
能解释下第10层中()为什么是空的?不明白!
还有你写的那10条总结中有几条不明白,你能依照楼主的批处理给解释下吗?谢谢!
作者: yiwuyun 时间: 2014-12-12 20:54
重新总结了下,获得新10条,这10条相对准确一些,只供参考。
延迟变量中,从左到右依次执行
1.各种符号首先要配对,如果配对成功,则执行,执行之后不会再影响后面的符号,如果配对不成功,会产生副作用.
2.两个及两个以上!在一起视为一个!(当然必须先满足从左到右的原则)
3.!会影响整行。该行有一个!和有多个!对行的影响效果一样。但对两个!之间的^无影响。
4.在没有!的情况下,"影响它后面的所有^,^将不再转义.直到"配对。但不影响它之前的。%只转义%.^只转义!和^.
5.在有!作用的情况下,"后的^^输出^.直到"配对。以后^^^^输出一个^.
6.在有!作用的前提下,两个!之间的^按正常执行,!之外的^起作用要翻倍。但如果有"的作用。"会把这种翻倍作用抵消。
7.在无!作用的情况下,^正常 起作用,起转义的作用。因此两个^^输出一个^。如果此时有"作用,则^不再转义。
8."和!正如正负号相互抵消一样起作用。但这仅限于!之外,而非!之间。
9.:会取消前面!配对的要求。如果!后的变量存在,则该变量及以后的:会保留,否则都会去掉。!后跟:,:会保留(在异常时的执行)
10.解释程序首先扫描%和^(这两个哪个先执行还不清楚),然后才扫描!
作者: chencg 时间: 2016-4-27 10:14
回复 10# applba
你也就这点出息呵呵
作者: 小程936 时间: 2016-6-17 11:58
回复 7# yuanyannian
嵌套时不可以,一般时可以
让你理解一下
set a=22
for %%a in (33) do echo 33
echo %a%这里说明了for根本不会对实际变量造成干扰
for %%1 in (33) do (
for %%2 in (44) do echo 33
)
echo 嵌套时如果使用相同的变量名肯定出错
作者: impk 时间: 2019-8-29 15:49
本帖最后由 impk 于 2019-8-29 20:55 编辑
- @echo off
- setlocal enabledelayedexpansion
- (
- set "s=^!x^!"
- set x=2
- set ss=abc
- echo 01 %s%
- echo 02 !s!
- echo 03 %x%
- echo 04 !x!
- echo 05 %ss%
- echo 06 !ss!
- )
- echo 07 %s%
- echo 08 !s!
- echo 09 %x%
- echo 10 !x!
- echo 11 %ss%
- echo 12 !ss!
复制代码
用这个代码查一下
01=空 02=!x! 03=空 04=2 05=空 06=abc
07=2 08=!x! 09=2 10=2 11=abc 12=abc
然后看懂前三层不成问题
作者: dy59524527 时间: 2021-2-7 17:27
都是人才啊,能整点有用的我们学习下么
作者: msdmck 时间: 2021-9-15 16:17
本帖最后由 msdmck 于 2021-9-23 16:04 编辑
好厲害,新手要理解這個得花不少時間...
在香港買樓(俗稱上車)的其中一個重要環節就是樓宇按揭(簡稱樓按),然而按揭相關的的資訊複雜繁瑣,更有分為幾類,例如一按、二按 、加按、轉按等等,要了解置業關鍵,那就得先梳理清楚物業按揭的知識和概念,例如按揭成數、樓宇按揭壓力測試等,再進行樓宇按揭比較,來看看你對樓宇按揭意思認知夠不夠充分吧!低息按揭
電子商務成爲近年熱潮,那麽電子商務是什麽呢?電子商務崛起對於商界來説既是挑戰也是機會,而當中的跨境電子商務(簡稱跨境電商)是指在交易雙方通過平台來完成國際商業交易,一般電子商務公司除了注重產品的質素之外,還要留意顧客服務。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |