标题: [文本处理] 批处理for命令的delims跟tokens位置互换探讨 [打印本页]
作者: sgaizxt001 时间: 2010-1-25 01:33 标题: 批处理for命令的delims跟tokens位置互换探讨
我是做batman的题时遇到的,先来看两段代码:
代码1(from tab):- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=1,2,3 delims=- " %%i in (a.txt) do (
- for /f "tokens=1,2 delims= " %%a in (b.txt) do (
- set var=%%a0000
- set var=!var:~0,7!
- if !var! geq %%i if !var! leq %%j if %%b neq %%k echo %%a %%b >>c.txt
- )
- )
复制代码
代码2(me):- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=- tokens=1,2,3" %%i in (a.txt) do (
- for /f "tokens=1,2 delims= " %%a in (b.txt) do (
- set var=%%a0000
- set var=!var:~0,7!
- if !var! geq %%i if !var! leq %%j if %%b neq %%k echo %%a %%b >>c.txt
- )
- )
复制代码
观察发现,循环体没错,就第一个for循环处的delims跟tokens位置不一样,但是运行代码后就得出了两个不同的结果,代码1是正确的,代码2运行的结果却出错。
代码2结果:- 721 古岳峰
- 721 淦田
- 721 白关
- 721 雷打石
- 723 砖桥
- 723 古岳峰
- 7257 仙井
- 7257 淦田
- 7257 县城
- 72581 淦田
- 72581 砖桥
- 7276 砖桥
- 7276 朱亭
- 7276 雷打石
- 7276 县城
- 7276 砖桥
- 7276 朱亭
- 7276 雷打石
- 7276 县城
- 728 朱亭
- 728 白关
- 728 砖桥
- 7296 朱亭
- 7348 淦田
- 7348 砖桥
- 7348 朱亭
- 7348 仙井
- 7373 雷打石
- 7373 古岳峰
- 7373 县城
- 7373 白关
- 7375 古岳峰
- 7375 淦田
- 7456 雷打石
- 7456 白关
- 7456 古岳峰
- 7473 淦田
- 7473 白关
- 7473 仙井
- 748 白关
- 748 仙井
- 7496 仙井
- 7496 白关
- 7496 县城
- 7496 雷打石
- 761 仙井
- 761 县城
- 761 白关
- 761 朱亭
- 7672 县城
- 7672 仙井
- 7693 县城
- 7693 仙井
复制代码
[ 本帖最后由 sgaizxt001 于 2010-1-25 03:30 编辑 ]
作者: sgaizxt001 时间: 2010-1-25 01:43
在来看两个代码:
代码3:- @echo off
- setlocal enabledelayedexpansion
- echo 我想学批处理,遇到不懂我就发帖子,还请多多指教 >aa.txt
- for /f "tokens=1,2,3 delims=, " %%i in (aa.txt) do echo %%i %%j %%k
- pause
复制代码
代码4:- @echo off
- setlocal enabledelayedexpansion
- echo 我想学批处理,遇到不懂我就发帖子,还请多多指教 >aa.txt
- for /f "delims=, tokens=1,2,3" %%i in (aa.txt) do echo %%i %%j %%k
- pause
复制代码
但是在这里,两个代码的执行结果却完全相同
[ 本帖最后由 sgaizxt001 于 2010-1-25 01:52 编辑 ]
作者: sgaizxt001 时间: 2010-1-25 01:55
继续测试,这次只简单修改代码1跟代码2,把if语句改为echo !var! %%a %%b %%i %%j %%k,用来看它的显示,来查找为什么代码2会出现错误。验证后发现代码2完全不能正确的取得%%k的变量,但是为什么代码1却能正确的取得%%k变量呢?
再继续,修改aa.txt的内容,改为:我想学批处理-遇到不懂我就发帖子 还请多多指教。同样的,把代码3跟代码4修改一下分隔符。然后运行,结果正确。是不是因为每一个变量就一句话,实际没有循环,所以不会出错呢?又或者是变量I,J,K的内容有猫腻呢?
继续测试,代码5:
- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=- tokens=1,2,3" %%i in (a.txt) do echo %%i %%j %%k
- for /f "tokens=1,2 delims= " %%a in (b.txt) do echo %%a %%b
- pause
复制代码
经过测试,变量取值完全正确,那么问题出现在哪呢?代码2的循环操作跟代码1的完全一样,而且对于两个for语句来说,变量取得都没错啊,这到底为什么呢?
[ 本帖最后由 sgaizxt001 于 2010-1-25 03:27 编辑 ]
作者: a590687 时间: 2010-1-25 08:43 标题: 回复 2楼 的帖子
代码3和代码4 因为aa.txt内容没有空格 所以 "delims=, " 只有 " , " 起作用所以结果一样
把 tokens写在后面我也是跟batman学的, 至于为什么, 还不知道. 只管记住.
或者写成 "delims= ," 这样 把空格放前面 应该就没问题了.
作者: sgaizxt001 时间: 2010-1-25 09:05
但是参照代码1跟代码2,可以发现tokens写在前面能得到正确的结果,写在后面的反而错误
作者: zqz0012005 时间: 2010-1-25 10:18
FOR命令空格和跳格做分隔符的区别及delims位置选择
http://www.bathome.net/thread-3770-1-1.html
作者: sgaizxt001 时间: 2010-1-25 14:04
但是,我用代码5echo测试%%k变量否能获取正确的信息啊
作者: sysplay 时间: 2010-1-27 08:41
原帖由 sgaizxt001 于 2010-1-25 01:55 发表
经过测试,变量取值完全正确,那么问题出现在哪呢?代码2的循环操作跟代码1的完全一样,而且对于两个for语句来说,变量取得都没错啊,这到底为什么呢?
其实,变量取值已经出错了- for /f "delims=- tokens=1,2,3" %%i in (a.txt) do echo %%i %%j %%for /f "delims=- tokens=1,2,3" %%i in (a.txt) do echo %%i %%j
复制代码
两个for语句的结果完全一样,也就是说%%k根本就取不到值。
个人理解,delims最好放在最后面。如果delims之后还有其他语句,例如tokens和skip,一旦分隔符中有空格,for语句都会理解成delims与其他语句的间隔。- for /f "delims= - tokens=1,2,3" %%i in (a.txt) do echo %%i %%j %%k
复制代码
for语句会认为没有分隔符,但是- tokens=1,2,3这明显是for不能识别的,报错。- for /f "tokens=1,2,3 delims=- skip=4" %%i in (a.txt) do echo %%i %%j
复制代码
虽然有两个空格,但是for会认为这两个空格是delims与skip的间隔,所以分隔符只是-。
[ 本帖最后由 sysplay 于 2010-1-27 08:45 编辑 ]
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |