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

[文本处理] 批处理命令for循环没有进行下去

[复制链接]
发表于 2014-11-3 16:26:28 | 显示全部楼层 |阅读模式
文件: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循环没有进行下去?请大神指点!多谢。
发表于 2014-11-3 20:19:15 | 显示全部楼层
本帖最后由 nnszuo 于 2014-11-3 20:24 编辑

应该是转跳的原因,把转跳去掉可以正常循环,至于为什么我也不懂,请大侠指点
如果你只是要截取后面的部分可以用这个
  1. @echo off
  2. for /f %%a in (1.txt) do (
  3.      echo %%~nxa
  4. )
  5. pause
复制代码
 楼主| 发表于 2014-11-3 20:36:26 | 显示全部楼层
回复 2# nnszuo
嗯,我知道是:lp的原因,但是不知道什么,谢谢你,坐等大神出现。
发表于 2014-11-3 21:23:10 | 显示全部楼层
不要尝试在for循环内部定义标签,应该把它拿到外面。
 楼主| 发表于 2014-11-3 21:41:15 | 显示全部楼层
回复 4# Batcher
请管理员应该怎么写呢?我用call写了之后还是有问题,请赐教。
发表于 2014-11-3 21:53:45 | 显示全部楼层
回复 5# wangx


    改过的代码发出来看看
 楼主| 发表于 2014-11-3 22:07:23 | 显示全部楼层
回复 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. )
复制代码
 楼主| 发表于 2014-11-3 22:09:41 | 显示全部楼层
大神,真正的需求是这样的。
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/

能否解答一下,万分感谢。
发表于 2014-11-3 22:39:45 | 显示全部楼层
回复 8# wangx


    为什么前两行是移动第一列,后两行是移动最后一列。
发表于 2014-11-3 23:59:35 | 显示全部楼层
本帖最后由 jian123ch 于 2014-11-4 00:14 编辑

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

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

谢谢解答,一楼的代码没有报错,是可以运行的,只是没有循环下去,不知道什么原因,需求在8楼,请问你有什么更好的方法么?
 楼主| 发表于 2014-11-4 11:19:04 | 显示全部楼层
有大神能解答么?
发表于 2014-11-4 12:49:19 | 显示全部楼层
回复 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. )
复制代码
 楼主| 发表于 2014-11-4 14:14:26 | 显示全部楼层
本帖最后由 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 . . .
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-20 19:52 , Processed in 0.034778 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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