找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 28539|回复: 8

[特效代码] [已解决]批处理for中用变量延迟单个变量竟然可以存储变量值列表?

[复制链接]
发表于 2011-7-11 18:31:30 | 显示全部楼层 |阅读模式
原帖地址:http://bbs.bathome.net/viewthrea ... muid=30829#pid22348
目的是为了以一一对应的关系合并两个文本文件。
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. for /f "tokens=1* delims=:" %%a in ('findstr /n .* 1.txt') do set  _%%a=%%b
  4. for /f "tokens=1* delims=:" %%a in ('findstr /n .* 2.txt') do echo.!_%%a!%%b>>all.txt
  5. echo.&pause
复制代码
第一个for执行完毕,按我的理解变量_%%a应该获取的是1.txt最后一行的文本内容。
第二个for中的变量!_%%a!竟然存储了1.txt中所有的文本内容,而且还是逐条释放出来。
_%%a 这个变量名究竟有什么玄机,各位大神能解释一下吗?

1.txt
  1. *\1-2\1-2
  2. *\2-3\2-3
  3. *\3-4\3-4
  4. *\1-2\1-2
  5. *\2-3\2-3
  6. *\3-4\3-4
  7. *\1-2\1-2
  8. *\2-3\2-3
  9. *\3-4\3-4
  10. *\1-2\1-2
  11. *\2-3\2-3
  12. *\3-4\3-4
  13. *\1-2\1-2
  14. *\2-3\2-3
  15. *\3-4\3-4
  16. *\2-3\2-3
  17. *\3-4\3-4
  18. *\1-2\1-2
  19. *\2-3\2-3
  20. *\3-4\3-4
  21. *\1-2\1-2
  22. *\2-3\2-3
  23. *\3-4\3-4
  24. *\1-2\1-2
复制代码
2.txt
  1. hello
  2. good
  3. baby
  4. girl
  5. tree
  6. apple
  7. banana
复制代码
结果,all.txt
  1. *\1-2\1-2 hello
  2. *\2-3\2-3 good
  3. *\3-4\3-4 baby
  4. *\1-2\1-2 girl
  5. *\2-3\2-3 tree
  6. *\3-4\3-4 apple
  7. *\1-2\1-2 banana
复制代码

评分

参与人数 1PB +2 收起 理由
batman + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2011-7-11 18:56:24 | 显示全部楼层
“按我的理解变量_%%a应该获取的是1.txt最后一行的文本内容”
你没看到%%a是for的变量吗?变量是要展开的。
你换一个不是for的变量(没在for后面出现且没被tokens扩展到)作为变量名,在本例中比如%%i,你这个理解就对了。

评分

参与人数 1技术 +1 收起 理由
Hello123World + 1 乐于助人

查看全部评分

发表于 2011-7-11 19:15:50 | 显示全部楼层
_%%a是一堆变量
发表于 2011-7-11 19:29:54 | 显示全部楼层
 楼主| 发表于 2011-7-11 19:54:39 | 显示全部楼层
本帖最后由 Hello123World 于 2011-7-11 20:14 编辑

2# powerbat
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. for /f "tokens=1* delims=:" %%a in ('findstr /n .* 1.txt') do set _%%i=%%b
  4. for /f "tokens=1* delims=:" %%a in ('findstr /n .* 2.txt') do echo.!_%%i!%%b>>all.txt
  5. echo.&pause
复制代码
是这样吗?
还是不能完全理解,不过_%%a确实是因为第一个for中的变量%%a才产生的效果。
 楼主| 发表于 2011-7-11 19:56:05 | 显示全部楼层
3# Demon
_%%a是一堆变量

能稍微解释的详细点吗?
发表于 2011-7-11 20:33:35 | 显示全部楼层

  1. @echo off
  2. for /l %%a in (1, 1, 10) do set /a _%%a = %%a * 2
  3. rem 一堆变量
  4. rem _1=2
  5. rem _2=4
  6. rem _3=6
  7. rem _4=8
  8. rem _5=10
  9. rem _6=12
  10. rem _7=14
  11. rem _8=16
  12. rem _9=18
  13. rem _10=20
复制代码

评分

参与人数 1技术 +1 收起 理由
Hello123World + 1 乐于助人

查看全部评分

发表于 2011-7-12 08:12:20 | 显示全部楼层
本帖最后由 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个变量,而不是用一个变量来储存所有的文本行,

用一个变量来储存所有文本行如下:

  1. @Echo Off&SetLocal EnableDelayedExpansion
  2. For /F "delims=" %%a In (1.txt) do Set "Str=!Str! @ %%a"
  3. Echo %Str%
  4. Pause>Nul
复制代码

评分

参与人数 1技术 +1 收起 理由
Hello123World + 1 乐于助人

查看全部评分

 楼主| 发表于 2011-7-12 16:12:05 | 显示全部楼层
主要是思维一定势就很难转过弯来,这回明白了,谢谢各位。
第一个for定义n个变量,而且第一个for的变量名必要跟第二个for的变量名对应。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 18:20 , Processed in 0.019920 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表