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

批处理上下行处理与变量延迟练习

[复制链接]
发表于 2010-11-11 13:38:38 | 显示全部楼层 |阅读模式
因在这个问题上吃过好多次亏,特地挑来给新手练习。
题目:
有一文本 1.txt ,内容是五行数字:
  1. 50
  2. 50
  3. 1242
  4. 9979900
  5. 7
复制代码
要求:
1、求这五行数字的总和;
2、一次显示相邻的上下两行数字;
3、比较上下行异同,提取重复部分,或过滤掉重复的内容。
其中,第三题其它地方有,可以选做,没做过的建议做做。
提示

  1. 1、在一个FOR的循环中,FOR解析文本的时候,通常一次只显示一行内容,无法同时显示两行或两行以上的内容。
  2. 2、在FOR中设置变量,除了环境变量等系统设定好的变量外,一般的变量会被抛弃,除非将变量的百分号改成感叹号。此时的变量在遇到endlocal之前可以全局通用,甚至在FOR的循环中通用。
  3. 3、开启变量延迟后,利用FOR循环前后时间点来设置变量,可同时得到这两个时间点上的变量,一个是新设的变量(现在——本次——当前行),一个是延迟下来的变量(过去——上次——上一行),它们代表的正是文本中的上下行。
复制代码


[ 本帖最后由 cjiabing 于 2010-11-11 13:46 编辑 ]
 楼主| 发表于 2010-11-12 21:10:46 | 显示全部楼层
  1. @echo off & setlocal enableextensions enabledelayedexpansion
  2. ::求总和
  3. set str=
  4. for /f %%a in (1.txt) do (
  5. set mum=!str!
  6. set str=%%a
  7. set /a var=!mum!+%%a
  8. set str=!var!
  9. )
  10. echo !var!
  11. pause

  12. @echo off & setlocal enableextensions enabledelayedexpansion
  13. ::同时显示上下行
  14. for /f %%a in (1.txt) do (
  15. echo !ddr! %%a
  16. set ddr=%%a
  17. )
  18. pause

  19. @echo off & setlocal enableextensions enabledelayedexpansion
  20. ::提取上下行相同部分
  21. for /f %%a in (1.txt) do (
  22. if !bar!==%%a echo %%a
  23. set bar=%%a
  24. )
  25. pause
  26. @echo off & setlocal enableextensions enabledelayedexpansion
  27. ::过滤上下行重复(相同)部分
  28. for /f %%a in (1.txt) do (
  29. if not !jar! == %%a echo %%a
  30. set jar=%%a
  31. )
  32. pause
复制代码


[ 本帖最后由 cjiabing 于 2010-11-12 21:16 编辑 ]
发表于 2010-12-23 00:51:09 | 显示全部楼层
  1. @echo off
  2. set /a a=0
  3. for /f %%i in (1.txt) do (
  4. set /a a=a+%%i
  5. )
  6. echo %a%
  7. pause
复制代码
发表于 2010-12-23 01:00:27 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a a=0
  4. for /f %%i in (1.txt) do (
  5. set /a a+=1
  6. if !a! gtr 1 echo !b! %%i
  7. set b=%%i
  8. )
  9. endlocal
  10. pause
复制代码
发表于 2010-12-23 09:53:01 | 显示全部楼层
什么意思这是…
发表于 2010-12-23 11:14:53 | 显示全部楼层

  1. ::不是比较上下两行,而是比较全部内容
  2. @echo off
  3. setlocal enabledelayedexpansion
  4. for /f %%i in (1.txt) do (
  5. set /a b=0
  6. for /f %%j in (1.txt) do (
  7. if %%i == %%j (set /a b+=1)
  8. )
  9. if !b! gtr 1 echo %%i 重复!b!次
  10. if !b! == 1 echo 单一的数字为:%%i
  11. )
  12. endlocal
  13. pause
复制代码
发表于 2010-12-23 23:28:54 | 显示全部楼层
今天下午看到的这个题目,有点意思。23点俺家霖霖终于睡着了。简单思考了一下,实现了前两步;第三步貌似麻烦,以后再说吧。睡了,明天还得早起呢。
  1. ::问题出处:http://www.bathome.net/thread-9936-1-1.html
  2. ::批处理上下行处理与变量延迟练习。XP SP3 CMD测试通过。
  3. ::有一文本 1.txt ,内容是五行数字:
  4. ::        50
  5. ::        50
  6. ::        1242
  7. ::        9979900
  8. ::        7
  9. ::要求:1、求这五行数字的总和;2、一次显示相邻的上下两行数字;
  10. ::3、比较上下行异同,提取重复部分,或过滤掉重复的内容。其中,
  11. ::第三题其它地方有,可以选做,没做过的建议做做。
  12. @echo off
  13. setlocal enableextensions
  14. setlocal enabledelayedexpansion

  15. set /a sum=0
  16. set "str0="
  17. set "str="
  18. for /f %%a in (1.txt) do (
  19.         set /a sum+=%%a
  20.         set "str0=!str!"
  21.         set "str=%%a"
  22.         echo.
  23.         echo 上一行:!str0!
  24.         echo 当前行:!str!
  25. )
  26. echo.
  27. echo 总和:%sum%
  28. echo.
复制代码
发表于 2011-1-15 14:45:18 | 显示全部楼层

  1. @echo off
  2. set /a sum=0
  3. for /f %%i in (1.txt) do ( set /a sum+=%%i )
  4. echo %sum%
  5. pause
复制代码
发表于 2011-7-19 17:58:12 | 显示全部楼层
  1. @echo off & setlocal enableextensions enabledelayedexpansion

  2. ::同时显示上下行

  3. for /f %%a in (1.txt) do (

  4. echo !ddr! %%a

  5. set ddr=%%a

  6. )

  7. pause

复制代码
这个同时显示上下两行的代码让我实在无语,第一行只显示了第一行……
还有就是楼主自己的算法太多余,这种加法用的着变量延迟吗?
  1. @echo off
  2. for /f %%i in (1.txt) do Set /a a=a+%%i
  3. echo %a%
  4. pause

复制代码
 楼主| 发表于 2011-7-19 18:13:28 | 显示全部楼层
本帖最后由 cjiabing 于 2011-7-19 18:39 编辑

9# Hello123World 呵呵,以前不懂写的,然后复制粘贴,复制粘贴……
上下行数据关系:
  1. @echo off & setlocal enableextensions enabledelayedexpansion
  2. for /f %%i in (1.txt) do (
  3. Set /a a=a+%%i
  4. if not "!b!"=="" echo 显示上行:!b!;下行:%%i
  5. if /i %%i==!b! echo 显示相同行:!b!
  6. set b=%%i
  7. )
  8. echo 显示累加总和:!a!

  9. pause
复制代码
发表于 2015-8-10 18:02:24 | 显示全部楼层

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (1.txt) do set /a num=!num!+%%a
  3. echo;!num!
  4. pause
复制代码

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (1.txt) do (
  3. echo;%%a
  4. echo;!num!
  5. set num=%%a
  6. )
  7. pause
复制代码
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (1.txt) do (
  3. findstr "%%a" 2.txt>nul 2>nul||echo;%%a>>2.txt
  4. )
  5. pause
复制代码
前面好像出过类型的
发表于 2015-8-10 18:02:43 | 显示全部楼层

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (1.txt) do set /a num=!num!+%%a
  3. echo;!num!
  4. pause
复制代码

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (1.txt) do (
  3. echo;%%a
  4. echo;!num!
  5. set num=%%a
  6. )
  7. pause
复制代码
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (1.txt) do (
  3. findstr "%%a" 2.txt>nul 2>nul||echo;%%a>>2.txt
  4. )
  5. pause
复制代码
前面好像出过类型的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-16 23:22 , Processed in 0.023919 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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