[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理命令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:24 编辑

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

TOP

回复 2# nnszuo
嗯,我知道是:lp的原因,但是不知道什么,谢谢你,坐等大神出现。

TOP

不要尝试在for循环内部定义标签,应该把它拿到外面。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 4# Batcher
请管理员应该怎么写呢?我用call写了之后还是有问题,请赐教。

TOP

回复 5# wangx


    改过的代码发出来看看
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 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. )
复制代码

TOP

大神,真正的需求是这样的。
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/

能否解答一下,万分感谢。

TOP

回复 8# wangx


    为什么前两行是移动第一列,后两行是移动最后一列。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

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

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

TOP

回复 9# Batcher

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

TOP

回复 10# jian123ch

谢谢解答,一楼的代码没有报错,是可以运行的,只是没有循环下去,不知道什么原因,需求在8楼,请问你有什么更好的方法么?

TOP

有大神能解答么?

TOP

回复 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. )
复制代码

TOP

本帖最后由 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 . . .

TOP

返回列表