标题: [特效代码] [已解决]批处理for中用变量延迟单个变量竟然可以存储变量值列表? [打印本页]
作者: Hello123World 时间: 2011-7-11 18:31 标题: [已解决]批处理for中用变量延迟单个变量竟然可以存储变量值列表?
原帖地址:http://bbs.bathome.net/viewthrea ... muid=30829#pid22348
目的是为了以一一对应的关系合并两个文本文件。- @echo off
- setlocal EnableDelayedExpansion
- for /f "tokens=1* delims=:" %%a in ('findstr /n .* 1.txt') do set _%%a=%%b
- for /f "tokens=1* delims=:" %%a in ('findstr /n .* 2.txt') do echo.!_%%a!%%b>>all.txt
- echo.&pause
复制代码
第一个for执行完毕,按我的理解变量_%%a应该获取的是1.txt最后一行的文本内容。
第二个for中的变量!_%%a!竟然存储了1.txt中所有的文本内容,而且还是逐条释放出来。
_%%a 这个变量名究竟有什么玄机,各位大神能解释一下吗?
1.txt- *\1-2\1-2
- *\2-3\2-3
- *\3-4\3-4
- *\1-2\1-2
- *\2-3\2-3
- *\3-4\3-4
- *\1-2\1-2
- *\2-3\2-3
- *\3-4\3-4
- *\1-2\1-2
- *\2-3\2-3
- *\3-4\3-4
- *\1-2\1-2
- *\2-3\2-3
- *\3-4\3-4
- *\2-3\2-3
- *\3-4\3-4
- *\1-2\1-2
- *\2-3\2-3
- *\3-4\3-4
- *\1-2\1-2
- *\2-3\2-3
- *\3-4\3-4
- *\1-2\1-2
复制代码
2.txt- hello
- good
- baby
- girl
- tree
- apple
- banana
复制代码
结果,all.txt- *\1-2\1-2 hello
- *\2-3\2-3 good
- *\3-4\3-4 baby
- *\1-2\1-2 girl
- *\2-3\2-3 tree
- *\3-4\3-4 apple
- *\1-2\1-2 banana
复制代码
作者: powerbat 时间: 2011-7-11 18:56
“按我的理解变量_%%a应该获取的是1.txt最后一行的文本内容”
你没看到%%a是for的变量吗?变量是要展开的。
你换一个不是for的变量(没在for后面出现且没被tokens扩展到)作为变量名,在本例中比如%%i,你这个理解就对了。
作者: Demon 时间: 2011-7-11 19:15
_%%a是一堆变量
作者: CrLf 时间: 2011-7-11 19:29
http://bbs.bathome.net/thread-1239-1-2.html
作者: Hello123World 时间: 2011-7-11 19:54
本帖最后由 Hello123World 于 2011-7-11 20:14 编辑
2# powerbat - @echo off
- setlocal EnableDelayedExpansion
- for /f "tokens=1* delims=:" %%a in ('findstr /n .* 1.txt') do set _%%i=%%b
- for /f "tokens=1* delims=:" %%a in ('findstr /n .* 2.txt') do echo.!_%%i!%%b>>all.txt
- echo.&pause
复制代码
是这样吗?
还是不能完全理解,不过_%%a确实是因为第一个for中的变量%%a才产生的效果。
作者: Hello123World 时间: 2011-7-11 19:56
3# Demon
_%%a是一堆变量
能稍微解释的详细点吗?
作者: Demon 时间: 2011-7-11 20:33
- @echo off
- for /l %%a in (1, 1, 10) do set /a _%%a = %%a * 2
- rem 一堆变量
- rem _1=2
- rem _2=4
- rem _3=6
- rem _4=8
- rem _5=10
- rem _6=12
- rem _7=14
- rem _8=16
- rem _9=18
- rem _10=20
复制代码
作者: ArdentMan 时间: 2011-7-12 08:12
本帖最后由 ArdentMan 于 2011-7-12 08:13 编辑
为什么这样都不能理解呢?
For /F "tokens=1* delims=:" %%a In ('Findstr /n .* 1.txt') Do Set "_%%a=%%b"
在这个For循环中%%a变量所取的值为1.txt各行的行数(1-LastLine),
而%%b变量所取的值则为1.txt各行的内容(包括空行),
_%%a之所以在前面加个_是为了不用纯数字做为变量名以避免被cmd识别为%0-%9的参数,
那么这个赋值过程就为:Set "_1=第一行内容",Set "_2=第二行内容"....Set "_n=最后一行内容",
很明显在这个For循环定义的是n个变量,而不是用一个变量来储存所有的文本行,
用一个变量来储存所有文本行如下:- @Echo Off&SetLocal EnableDelayedExpansion
- For /F "delims=" %%a In (1.txt) do Set "Str=!Str! @ %%a"
- Echo %Str%
- Pause>Nul
复制代码
作者: Hello123World 时间: 2011-7-12 16:12
主要是思维一定势就很难转过弯来,这回明白了,谢谢各位。
第一个for定义n个变量,而且第一个for的变量名必要跟第二个for的变量名对应。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |