标题: [其他] 批处理skip的值不能由上一个FOR的结果传递过来? [打印本页]
作者: ieutk 时间: 2007-12-14 00:03 标题: 批处理skip的值不能由上一个FOR的结果传递过来?
如题:
这种结构的代码:
- @echo off
- for /f "tokens=1* delims=:" %%a in ('type list.txt^|findstr /n .*^|find /i "ie"') do (
- for /f "skip=%%a delims=" %%i in (list.txt) do @echo %%i
- )
- pause
复制代码
- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=1* delims=:" %%a in ('type list.txt^|findstr /n .*^|find /i "ie"') do (
- set num=%%a
- for /f "skip=!num! delims=" %%i in (list.txt) do @echo %%i
- )
- pause
复制代码
这两种方法都不行,除非两个for分开来才可以,这是什么原因呢?
作者: 随风 时间: 2007-12-14 00:14
确实是个经典的老问题,就如同for /r 后面的路径一样,不能直接在for勘套中使用变量,要先call跳出来处理.
原因解释不清,就当它是一种格式吧. 就象 %%a in 呵呵,照写就是了.
不止是sikp ,tokens ,等都不可以.
我的理解是 for 的延迟变量只对 do 后面的语句有效,前面的部分只能引用for 外面的变量
你在for前面给num赋值试试就知道了.
[ 本帖最后由 随风 于 2007-12-14 00:23 编辑 ]
作者: ieutk 时间: 2007-12-14 01:03
果然如此,在第一个for前面定义num的值后就可以正确执行!
作者: foxJL 时间: 2007-12-14 01:06
测试了一会,确实是没有方法,使用直接传递过来的变量,不过换了一总方法好像可行.
- @echo off
- for %%i in (4) do (
- call :a %%i
- :a
- for /f "skip=%1 tokens=%1" %%j in (2.txt) do (echo.%%j)
- )
- pause
- 下面是2.txt内容.
- 1 2 3 4 5 6 7
- 2 2 3 5 5 6 7
- 3 2 3 6 5 6 7
- 4 2 3 7 5 6 7
- 1 2 3 8 5 6 7
- 1 2 3 9 5 6 7
- 1 2 3 10 5 6 7
- 1 2 3 4 5 6 7
- 1 2 3 4 5 6 7
复制代码
作者: 随风 时间: 2007-12-14 01:09
亏你想的出来啊,在for内部使用标签,
似乎在哪见过,说最好不要在for内部使用标签,具体有什么不好,我也说不出.
这种方法应该等同跳出了第一个for吧.
[ 本帖最后由 随风 于 2007-12-14 01:11 编辑 ]
作者: foxJL 时间: 2007-12-14 01:11
呵呵..还真不知道..
这样CALL等同于跳出了一个FOR还有待商榷,
我以为 当标签处于FOR外面的时候才算是跳了出去吧.
[ 本帖最后由 泛滥棏慌° 于 2007-12-14 01:31 编辑 ]
作者: ieutk 时间: 2007-12-14 01:21
我也想知道在for内部使用标签具体有什么不好
我也偶尔在for内部使用标签
作者: 随风 时间: 2007-12-14 01:44
测试了下,也没发现什么不好,可能是我走入了误区了吧
现实中也很少看到这样的用法.
我总结的原因是:
通常用for作循环的时候,都是需要遍历整个文本的,若是在满足某条件后goto的话,那么标签也不用放在for内部了,因为若是 if ....goto .... 的话,当条件满足时,for虽仍会遍历整个文本,但是却不会再作任何处理了.也就是说for内部的标签应该是多余的.完全可以放在外面.
不知道对不对,只是个人的看法.
作者: novaa 时间: 2007-12-16 10:31
呵呵
这个问题没有遇到过,收获了
不过我遇到过一个类似的问题
for语句里面的()里面不能有表达式
大家自己测试下看对不对?
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |