Board logo

标题: [文本处理] 批处理命令for循环没有进行下去 [打印本页]

作者: wangx    时间: 2014-11-3 16:26     标题: 批处理命令for循环没有进行下去

文件:3.txt
内容:
02\nclps\boco\src\jetsrc.std\N010099_jet.pc
01\N000490aN8626.mdf

代码:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f %%a in (1.txt) do (
  3. for /f %%b in ("%%a") do (
  4. set str=%%b
  5. :lp
  6. if "!str:*\=!" neq "!str!" (
  7. set str=!str:*\=!
  8. goto :lp
  9. )
  10. echo !str!
  11. )
  12. )
  13. pause>nul
复制代码
结果:
02\nclps\boco\src\jetsrc.std\N010099_jet.pc
N010099_jet.pc

按道理应该是:
02\nclps\boco\src\jetsrc.std\N010099_jet.pc
N010099_jet.pc
01model\N000490aN8626.mdf
N000490aN8626.mdf

怎么只有第一个呢?为什么for循环没有进行下去?请大神指点!多谢。
作者: nnszuo    时间: 2014-11-3 20:19

本帖最后由 nnszuo 于 2014-11-3 20:24 编辑

应该是转跳的原因,把转跳去掉可以正常循环,至于为什么我也不懂,请大侠指点
如果你只是要截取后面的部分可以用这个
  1. @echo off
  2. for /f %%a in (1.txt) do (
  3.      echo %%~nxa
  4. )
  5. pause
复制代码

作者: wangx    时间: 2014-11-3 20:36

回复 2# nnszuo
嗯,我知道是:lp的原因,但是不知道什么,谢谢你,坐等大神出现。
作者: Batcher    时间: 2014-11-3 21:23

不要尝试在for循环内部定义标签,应该把它拿到外面。
作者: wangx    时间: 2014-11-3 21:41

回复 4# Batcher
请管理员应该怎么写呢?我用call写了之后还是有问题,请赐教。
作者: Batcher    时间: 2014-11-3 21:53

回复 5# wangx


    改过的代码发出来看看
作者: wangx    时间: 2014-11-3 22:07

回复 6# Batcher
不知道:pl里面怎么再递归下去,不知道怎么写了,
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f %%a in (3.txt) do (
  3. for /f %%b in ("%%a") do (
  4. set str=%%b
  5. echo %%b
  6. call :pl !str:*/=!
  7. echo !str!
  8. )
  9. )
  10. pause&goto :eof
  11. :pl
  12. set "str1=%1"
  13. if "!str1!" neq "!str!" (
  14. set str=!str:*/=!
  15. goto :lp
  16. )
复制代码

作者: wangx    时间: 2014-11-3 22:09

大神,真正的需求是这样的。
D\1.txt 里有下面的内容。
01模板\N000490aN8626.mdf
02程序\nclps\boco\src\jetsrc.std\N010099_jet.pc
ui/iReport/NCLtemplate/ApprovWorkCountList.jasper
java/src/com/sinosoft/lis/iReport/EdorApprovWorkCountListBean.java
我想把上面的文件内容自动变成下面这样。
\N000490aN8626.mdf    01模板
\nclps\boco\src\jetsrc.std\N010099_jet.pc    02程序
ApprovWorkCountList.jasper    ui/iReport/NCLtemplate/
EdorApprovWorkCountListBean.java    java/src/com/sinosoft/lis/iReport/

能否解答一下,万分感谢。
作者: Batcher    时间: 2014-11-3 22:39

回复 8# wangx


    为什么前两行是移动第一列,后两行是移动最后一列。
作者: jian123ch    时间: 2014-11-3 23:59

本帖最后由 jian123ch 于 2014-11-4 00:14 编辑

有点晕,不过批处理中的条件命令"if"的用法中,应该是不支持运算的。也就是if后面不能直接为!str:*\=!这个运算的。必须先将!str:*\=!运算后重新赋值一个新变量如strTMP,然后再用strTMP用if命令去比较才可以,否则会出错的!
再一个,前面的那们说的对,不要在循环里设标识符,也不要用for循环中套跳转循环;这些是在编程中最忌会的,这样的代码可读性会很差,不易排错,更不易交流!
另外很不喜欢类似set /a %str+=1%这种类型的代码,宁愿写成set /a str=%str%+1,因为这样易排错,同时代码的可读性也会增加。当然单纯表现自个的代码的水平又是另外一回事了!
作者: wangx    时间: 2014-11-4 08:03

回复 9# Batcher

路径的方式不一样,一个是电脑里的文件路径形式(以\来分割的),一种是java工程文件里的文件路径形式(以/来分割的),我的想法是分别用两种方式来取,可以是两个for,或是是用findstr来做,首先需要分割出来,取出最后一列,所以我上面的写法是模拟了递归,来判断字符串中是否还有分割符,如果有就继续分割,没有就返回。现在就是不知道为什么for循环里的:lp怎么阻止了循环,而且我也不太清楚怎么把:lp放到外面,用call来调用,请大神帮忙看一下,谢谢。
作者: wangx    时间: 2014-11-4 08:06

回复 10# jian123ch

谢谢解答,一楼的代码没有报错,是可以运行的,只是没有循环下去,不知道什么原因,需求在8楼,请问你有什么更好的方法么?
作者: wangx    时间: 2014-11-4 11:19

有大神能解答么?
作者: apang    时间: 2014-11-4 12:49

回复 11# wangx


    如果只是取最后一列,2楼的方法就可以呀
一定要用call,可以这样:
  1. @echo off
  2. for /f "delims=" %%a in (a.txt) do (
  3.         call :Lp "%%a"
  4. )
  5. pause & exit/b
  6. :Lp
  7. for /f "tokens=1* delims=\/" %%a in ("%~1") do (
  8.         if "%%b" NEQ "" (call :Lp "%%b") else echo,%%a
  9. )
复制代码

作者: wangx    时间: 2014-11-4 14:14

本帖最后由 wangx 于 2014-11-4 14:19 编辑

回复 14# apang

谢谢apang的回答,帮我解决了很重要的一块问题,现在代码如下,现在的问题是截取字符串,获得了最后一项的长度后进行截取,但是在字符截取中使用!str:~0,-!len!!报错,这个写法怎么修改呢?
  1. @echo off&setlocal enabledelayedexpansion
  2. set "_strlen=set $=^!#1^!#&set ##=&(for %%a in (2048 1024 512 256 128 64 32 16)do if ^!$:~%%a^!. NEQ . set/a##+=%%a&set $=^!$:~%%a^!)&set
  3. $=^!$^!fedcba9876543210&set/a##+=0x^!$:~16,1^!"
  4. for /f "delims=" %%a in (1.txt) do (
  5.         set "str=%%a"
  6. if "!str:*/=!" NEQ "!str!" (
  7. call :Lp "%%a"
  8. ) else (
  9. for /f "tokens=1* delims=\" %%a in ("!str!") do (
  10.          echo \%%b %%a
  11. )
  12. )
  13. )
  14. pause & exit/b
  15. :Lp
  16. for /f "tokens=1* delims=/" %%a in ("%~1") do (
  17.         if "%%b" NEQ "" (
  18. call :Lp "%%b"
  19. ) else (
  20. set #1=%%a   
  21.          (%_strlen%)    ----------这里获得最后一项字符串的长度,利用此长度截取出前面的内容
  22. echo !str! !str:~0,-!##!!
  23. )
  24. )
复制代码
显示结果如下
\N000490aN8626.mdf      01
\nclps\boco\src\jetsrc.std\N010099_jet.pc       02
ui/iReport/NCLtemplate/ApprovWorkCountList.jasper             str:~0,-26
java/src/com/sinosoft/lis/iReport/EdorApprovWorkCountListBean.java               str:~0,-32
Press any key to continue . . .
作者: apang    时间: 2014-11-4 16:44

本帖最后由 apang 于 2014-11-4 19:14 编辑

回复 15# wangx
  1. @echo off&setlocal enabledelayedexpansion
  2. set "_strlen=set ##=&(for %%a in (2048 1024 512 256 128 64 32 16)do if ^!$:~%%a^!. NEQ . set/a##+=%%a&set $=^!$:~%%a^!)&set $=^!$^!fedcba9876543210&set/a##+=0x^!$:~16,1^!"
  3. for /f "delims=" %%a in (1.txt) do (
  4.         set "str=%%a"
  5.         if "!str:/=!" NEQ "!str!" (
  6.                 call :Lp "%%a"
  7.         ) else (
  8.                 for /f "tokens=1* delims=\" %%a in ("!str!") do (
  9.                         echo \%%b        %%a
  10.                 )
  11.         )
  12. )
  13. pause & exit/b
  14. :Lp
  15. for /f "tokens=1* delims=/" %%a in ("%~1") do (
  16.         if "%%b" NEQ "" (
  17.                 call :Lp "%%b"
  18.         ) else (
  19.                 set "$=%%a#"
  20.                 (%_strlen%)
  21.                 for %%a in (!##!) do echo !str!   !str:~0,-%%a!
  22.         )
  23. )
复制代码

作者: wangx    时间: 2014-11-5 08:55

回复 16# apang

非常感谢apang的解答,问题解决了。但是请问一下,set "$=%%a#"是什么意思呢?
之前你贴上去的代码中
if "!str:/=!" NEQ "!str!" (
                set "$=%%~nxa#"
                %_strlen%
                for %%b in (!##!) do echo,%%~nxa        !str:~,-%%b!

这是什么意思啊,菜鸟一个,希望劳烦解答,谢谢!
作者: apang    时间: 2014-11-5 19:06

set "$=%%a#" 给变量$赋值,没有别的意思。

之前的代码没有用call,但你非要用call,所以不解释




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