Board logo

标题: [文本处理] 【已解决】批处理for命令之后的变量该怎么写? [打印本页]

作者: nnszuo    时间: 2014-11-11 14:29     标题: 【已解决】批处理for命令之后的变量该怎么写?

本帖最后由 nnszuo 于 2014-11-12 18:06 编辑

下面这个批处理最后一个echo的结果应该是5  5555555,是哪里出错了,该怎么写
  1. @echo off
  2. (   
  3.     echo 1111111
  4.     echo 2222222
  5.     echo 3333333
  6.     echo 4444444
  7.     echo 5555555
  8. )>6.txt
  9. setlocal enabledelayedexpansion
  10. set t=0
  11. for /f "delims=" %%c in ('findstr /v "kk" 6.txt') do (
  12.     set /a t+=1
  13.     set %t%=%%c
  14.     echo !t! !%t%!
  15. )
  16. echo !t! !%t%!
  17. pause
复制代码
这个批处理的全部代码是这样的
  1. @echo off
  2. (   
  3.     echo 1111111
  4.     echo 2222222
  5.     echo 3333333
  6.     echo 4444444
  7.     echo 5555555
  8. )>6.txt
  9. (   
  10.     echo 6666666
  11.     echo 7777777
  12.     echo 8888888
  13.     echo 9999999
  14.     echo 0000000
  15. )>7.txt
  16. setlocal enabledelayedexpansion
  17. set t=0
  18. set y=100
  19. for /f "delims=" %%c in ('findstr /v "kk" 6.txt') do (
  20.     set /a t+=1
  21.     set %t%=%%c
  22.     echo !t! !%t%!
  23. )
  24. for /f "delims=" %%i in ('findstr /v "kk" 7.txt') do (
  25.     set /a y+=1
  26.     set %y%=%%i
  27.     echo !y! !%y%!
  28. )
  29. cd.>8.txt
  30. if not "!t!"=="0" (
  31.     echo !%t%! !%y%! >>8.txt
  32.     set /a t-=1
  33.     set /a y-=1
  34. )
  35. pause
复制代码
用数字作为变量是方便后续调用,以前写了个批量拖拽重命名批处理,其中部分代码是下面内容,没想到用了for命令后变量无法正常调用了,amwfjhh提供的call 可以解决这个问题,不知道有没有其他思路
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. if "%~f1"=="" exit
  4. cd /d "%~dp1"
  5. set s=1
  6. set %s%=%~f1
  7. :a
  8. if not exist "%~f1" (goto s)
  9. set/a s+=1
  10. set %s%=%~f1
  11. shift /1&goto :a
  12. :s
  13. if not "%s%"=="0" (
  14.     echo !%s%!
  15.     set/a s-=1
  16.     goto :s
  17. )
  18. pause
复制代码

作者: amwfjhh    时间: 2014-11-11 18:00

  1. @echo off
  2. (   
  3.     echo 1111111
  4.     echo 2222222
  5.     echo 3333333
  6.     echo 4444444
  7.     echo 5555555
  8. )>6.txt
  9. setlocal enabledelayedexpansion
  10. set t=0
  11. for /f "delims=" %%c in ('findstr /v "kk" 6.txt') do (
  12.     set /a t+=1
  13.     set line!t!=%%c
  14.     call echo line!t! %%line!t!%%
  15. )
  16. call echo line!t! %%line!t!%%
  17. pause
复制代码

作者: apang    时间: 2014-11-11 21:28

也可以用 for
  1. for %%a in (line!t!) do echo !t! !%%a!
复制代码
不建议用纯数字作为变量名
作者: rogue_1983    时间: 2014-11-11 21:52

本帖最后由 rogue_1983 于 2014-11-11 22:20 编辑
  1. @echo off
  2. (   
  3.     echo 1111111
  4.     echo 2222222
  5.     echo 3333333
  6.     echo 4444444
  7.     echo 5555555
  8. )>6.txt
  9. setlocal enabledelayedexpansion
  10. set t=0
  11. for /f "delims=" %%c in ('findstr /v "kk" 6.txt') do (
  12.     set /a t+=1
  13.     set %t%=%%c
  14.     echo !t! !%t%!
  15. set var=!%t%!
  16. )
  17. echo !t! %var%
  18. pause
复制代码

作者: amwfjhh    时间: 2014-11-12 00:02

照楼主的写法,最后一句因该写为:
  1. echo !t! !0!
复制代码
就可以得到正确的结果了。因为FOR循环里面一直是在set 0=%%c
作者: nnszuo    时间: 2014-11-12 10:03

本帖最后由 nnszuo 于 2014-11-12 10:29 编辑

回复 2# amwfjhh
变量5是解决了,我有新的问题就是变量5之前的变量该怎么写我后续还要调用的
详细请看上面更新内容

回复 3# apang
用数字作为变量是因可以累加和方便后续调用
详细请看上面更新内容


回复 4# rogue_1983
变量5是解决了,我有新的问题就是变量5之前的变量该怎么写我后续还要调用的
详细请看上面更新内容
作者: DAIC    时间: 2014-11-12 10:40

回复 6# nnszuo


    把你的完整代码和完整需求全部说出来,不要等到别人给你解决一个问题然后你又冒出一个新的问题。
作者: nnszuo    时间: 2014-11-12 11:36

本帖最后由 nnszuo 于 2014-11-12 12:54 编辑

回复 7# DAIC
好的,感谢提醒

amwfjhh提供的call 可以解决这个问题,不知道有没有其他思路
  1. @echo off
  2. (   
  3.     echo 1111111
  4.     echo 2222222
  5.     echo 3333333
  6.     echo 4444444
  7.     echo 5555555
  8. )>6.txt
  9. (   
  10.     echo 6666666
  11.     echo 7777777
  12.     echo 8888888
  13.     echo 9999999
  14.     echo 0000000
  15. )>7.txt
  16. setlocal enabledelayedexpansion
  17. set t=0
  18. for /f "delims=" %%c in ('findstr /v "kk" 6.txt') do (
  19.     set /a t+=1
  20.     set !t!=%%c
  21. )
  22. set y=100
  23. for /f "delims=" %%g in ('findstr /v "kk" 7.txt') do (
  24.     set /a y+=1
  25.     set !y!=%%g
  26. )
  27. :k
  28. if not "!t!"=="0" (
  29.     call echo !%t%! !%y%!
  30.     set /a y-=1
  31.     set /a t-=1
  32. goto :k
  33. )
  34. pause
复制代码
apang提供的for可以解决变量的文件,如果如果两个变量就会出错不知道是什么原因
  1. @echo off
  2. (   
  3.     echo 1111111
  4.     echo 2222222
  5.     echo 3333333
  6.     echo 4444444
  7.     echo 5555555
  8. )>6.txt
  9. (   
  10.     echo 6666666
  11.     echo 7777777
  12.     echo 8888888
  13.     echo 9999999
  14.     echo 0000000
  15. )>7.txt
  16. setlocal enabledelayedexpansion
  17. set t=0
  18. for /f "delims=" %%c in ('findstr /v "kk" 6.txt') do (
  19.     set /a t+=1
  20.     set !t!=%%c
  21. )
  22. set y=100
  23. for /f "delims=" %%g in ('findstr /v "kk" 7.txt') do (
  24.     set /a y+=1
  25.     set !y!=%%g
  26. )
  27. :k
  28. if not "!y!"=="100" (
  29. for %%z in (!y!) do echo !%%z!
  30.     set /a y-=1
  31. goto :k
  32. )
  33. :u
  34. if not "!t!"=="0" (
  35. for %%z in (!t!) do echo !%%z!
  36.     set /a t-=1
  37. goto :u
  38. )
  39. pause
复制代码
  1. :k
  2. if not "!y!"=="100" (
  3. for %%z in (!y!!t!) do echo !%%z!
  4.     set /a y-=1
  5. goto :k
  6. )
复制代码

作者: xxpinqz    时间: 2014-11-12 12:14

结果要求什么,看不太懂,!y!!z!之间要用空格分开:
  1. :k
  2. if not "!y!"=="100" (
  3.     for %%z in (!y! !t!) do echo %%z !%%z!
  4.     set /a y-=1,t-=1
  5.     goto :k
  6. )
复制代码

作者: nnszuo    时间: 2014-11-12 12:49

本帖最后由 nnszuo 于 2014-11-12 12:51 编辑

结果就像这个一样并排显示,用空格隔开的话还是单排显示的
  1. @echo off
  2. (   
  3.     echo 1111111
  4.     echo 2222222
  5.     echo 3333333
  6.     echo 4444444
  7.     echo 5555555
  8. )>6.txt
  9. (   
  10.     echo 6666666
  11.     echo 7777777
  12.     echo 8888888
  13.     echo 9999999
  14.     echo 0000000
  15. )>7.txt
  16. setlocal enabledelayedexpansion
  17. set t=0
  18. for /f "delims=" %%c in ('findstr /v "kk" 6.txt') do (
  19.     set /a t+=1
  20.     set !t!=%%c
  21. )
  22. set y=100
  23. for /f "delims=" %%g in ('findstr /v "kk" 7.txt') do (
  24.     set /a y+=1
  25.     set !y!=%%g
  26. )
  27. :k
  28. if not "!t!"=="0" (
  29.     call echo !%t%! !%y%!
  30.     set /a y-=1
  31.     set /a t-=1
  32. goto :k
  33. )
  34. pause
复制代码

作者: apang    时间: 2014-11-12 16:39

回复 10# nnszuo


    这样?
  1. @echo off
  2. (   
  3.     echo 1111111
  4.     echo 2222222
  5.     echo 3333333
  6.     echo 4444444
  7.     echo 5555555
  8. )>6.txt
  9. (   
  10.     echo 6666666
  11.     echo 7777777
  12.     echo 8888888
  13.     echo 9999999
  14.     echo 0000000
  15. )>7.txt
  16. setlocal enabledelayedexpansion
  17. set t=0
  18. for /f "delims=" %%c in ('findstr /v "kk" 6.txt') do (
  19.     set /a t+=1
  20.     set "_!t!=%%c"
  21. )
  22. set y=0
  23. for /f "delims=" %%g in ('findstr /v "kk" 7.txt') do (
  24.     set /a y+=1
  25.     set "#!y!=%%g"
  26. )
  27. set "MaxLine=!t!"
  28. Rem if !y! gtr !t! (set MaxLine=!y!)
  29. for /l %%a in (!MaxLine! -1 1) do echo,!_%%a! !#%%a!
  30. pause
复制代码

作者: nnszuo    时间: 2014-11-12 18:06

就是这种了,非常感谢!
谢谢各位了




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2