标题: [文本处理] 批处理命令for循环没有进行下去 [打印本页]
作者: wangx 时间: 2014-11-3 16:26 标题: 批处理命令for循环没有进行下去
文件:3.txt
内容:
02\nclps\boco\src\jetsrc.std\N010099_jet.pc
01\N000490aN8626.mdf
代码:- @echo off&setlocal enabledelayedexpansion
- for /f %%a in (1.txt) do (
- for /f %%b in ("%%a") do (
- set str=%%b
- :lp
- if "!str:*\=!" neq "!str!" (
- set str=!str:*\=!
- goto :lp
- )
- echo !str!
- )
- )
- 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 编辑
应该是转跳的原因,把转跳去掉可以正常循环,至于为什么我也不懂,请大侠指点
如果你只是要截取后面的部分可以用这个- @echo off
- for /f %%a in (1.txt) do (
- echo %%~nxa
- )
- 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里面怎么再递归下去,不知道怎么写了,- @echo off&setlocal enabledelayedexpansion
- for /f %%a in (3.txt) do (
- for /f %%b in ("%%a") do (
- set str=%%b
- echo %%b
- call :pl !str:*/=!
- echo !str!
- )
- )
- pause&goto :eof
-
- :pl
- set "str1=%1"
- if "!str1!" neq "!str!" (
- set str=!str:*/=!
- goto :lp
- )
复制代码
作者: 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,可以这样:- @echo off
- for /f "delims=" %%a in (a.txt) do (
- call :Lp "%%a"
- )
- pause & exit/b
-
- :Lp
- for /f "tokens=1* delims=\/" %%a in ("%~1") do (
- if "%%b" NEQ "" (call :Lp "%%b") else echo,%%a
- )
复制代码
作者: wangx 时间: 2014-11-4 14:14
本帖最后由 wangx 于 2014-11-4 14:19 编辑
回复 14# apang
谢谢apang的回答,帮我解决了很重要的一块问题,现在代码如下,现在的问题是截取字符串,获得了最后一项的长度后进行截取,但是在字符截取中使用!str:~0,-!len!!报错,这个写法怎么修改呢?- @echo off&setlocal enabledelayedexpansion
-
- 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
- $=^!$^!fedcba9876543210&set/a##+=0x^!$:~16,1^!"
-
- for /f "delims=" %%a in (1.txt) do (
- set "str=%%a"
- if "!str:*/=!" NEQ "!str!" (
- call :Lp "%%a"
- ) else (
- for /f "tokens=1* delims=\" %%a in ("!str!") do (
- echo \%%b %%a
- )
- )
- )
- pause & exit/b
-
- :Lp
- for /f "tokens=1* delims=/" %%a in ("%~1") do (
- if "%%b" NEQ "" (
- call :Lp "%%b"
- ) else (
- set #1=%%a
- (%_strlen%) ----------这里获得最后一项字符串的长度,利用此长度截取出前面的内容
- echo !str! !str:~0,-!##!!
- )
- )
复制代码
显示结果如下
\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 - @echo off&setlocal enabledelayedexpansion
-
- 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^!"
-
- for /f "delims=" %%a in (1.txt) do (
- set "str=%%a"
- if "!str:/=!" NEQ "!str!" (
- call :Lp "%%a"
- ) else (
- for /f "tokens=1* delims=\" %%a in ("!str!") do (
- echo \%%b %%a
- )
- )
- )
- pause & exit/b
-
- :Lp
- for /f "tokens=1* delims=/" %%a in ("%~1") do (
- if "%%b" NEQ "" (
- call :Lp "%%b"
- ) else (
- set "$=%%a#"
- (%_strlen%)
- for %%a in (!##!) do echo !str! !str:~0,-%%a!
- )
- )
复制代码
作者: 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://www.bathome.net/) |
Powered by Discuz! 7.2 |