中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » for循环中如何对令牌使用变量???
作者:
标题: for循环中如何对令牌使用变量??? 上一主题 | 下一主题
bd123456789
中级用户





积分 360
发帖 216
注册 2007-5-29
状态 离线
『楼 主』:  for循环中如何对令牌使用变量???

注:循环赋予令牌变量2,3,4,5...100
rem 将变量放入令牌号,即依次提取第二个令牌,第三个令牌,,,...第100个令牌
for /l %%a in (2,1,100) do (
for /F "usebackq eol=; tokens='%%a' delims=$" %%i in (find.txt) do echo %%i)

pause

我的目的是想在find文件中分别取得以$分隔的第二个、第三个、第四个、—第一百个字符
但结果总是说我的代码是错误的,即→此时不应有 '%a' delims=$"。
究意该如何写呢?

[ Last edited by bd123456789 on 2007-7-5 at 10:58 AM ]

2007-7-5 09:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 2 楼』:  

测试了一下,发现for的tokens只能取到第31个字段,取第32个字段时,值为空。

可以试试下面这个:
@echo off&SetLocal ENABLEDELAYEDEXPANSION
for /f "delims=" %%a in (file.txt) do (
set ok=%%a
set ok=!ok:$= !
call :PK !ok!
)
echo the end
pause&exit/b

:PK
if "%1"=="" goto :eof
echo\%1
shift
goto :PK


2007-7-5 13:13
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
#four#
中级用户




积分 209
发帖 34
注册 2004-5-25
状态 离线
『第 3 楼』:  

我对楼主的这段代码也试了,CMD不能识别FOR嵌套中的变量,不知道我的结论对不对。只能换个方式解决了。

2007-7-5 15:03
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bd123456789
中级用户





积分 360
发帖 216
注册 2007-5-29
状态 离线
『第 4 楼』:  

@echo off&setlocal enabledelayedexpansion
for /l %%i in (2,1,100) do (
        set tk=%%i
        echo !tk!
        call :callfor !tk!
        )
pause

:callfor
for /F "delims=$ tokens=%1" %%a in (find.txt) do echo %%a

上述代码测试过了,能显示到第31个令牌!

非常奇怪????为什么不能读取第32个以后的....

另外,版主能讲一下你的代码详细说明吗?有点看不懂

[ Last edited by bd123456789 on 2007-7-5 at 04:15 PM ]

2007-7-5 15:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 5 楼』:  


@echo off
for /l %%a in (2,1,100) do call :token %%a
goto :eof

:token
for /F "tokens=%1 delims=$" %%i in (find.txt) do echo %%i
goto :eof
上面这个方法似乎是有效的,间接的实现了for的嵌套。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2007-7-5 15:27
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
bd123456789
中级用户





积分 360
发帖 216
注册 2007-5-29
状态 离线
『第 6 楼』:  

测试了一下,发现for的tokens只能取到第31个字段,取第32个字段时,值为空。

一种情况是→是不是%1...只能使用到31个
第二种情况是→或者提供的文本一行超过了一定的限额,如63566个!!

??想不通

好像是最大递归层出错的意思,有什么办法能纠正呢?

[ Last edited by bd123456789 on 2007-7-5 at 04:47 PM ]

2007-7-5 15:30
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 7 楼』:  

RE bd123456789:

  Quote:
非常奇怪????为什么不能读取第32个以后的....

具体原因我也不是很清楚了。

  Quote:
另外,版主能讲一下你的代码详细说明吗?有点看不懂

思路是将文件中的分隔符替换成空格,传递给PK标签,用shift命令实现参数的移动。

具体命令说明请看帮助。

2007-7-5 19:01
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 8 楼』:  

TO Climbing:

开始我也想到用这个方法,但是测试一下,发现取不到第32个字段,可能这也是for /F的一个局限性吧,所以换了一个方法。

2007-7-5 19:03
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bd123456789
中级用户





积分 360
发帖 216
注册 2007-5-29
状态 离线
『第 9 楼』:  



  Quote:
Originally posted by lxmxn at 2007-7-5 07:03 PM:
TO Climbing:

开始我也想到用这个方法,但是测试一下,发现取不到第32个字段,可能这也是for /F的一个局限性吧,所以换了一个方法。

多谢指导!
经过测试,使用此方法,如果文件中有一些特殊符号,就会失效,如 &
看来此方法实用性不强.

2007-7-5 21:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 10 楼』:  

RE bd123456789:
批处理用来处理文本中的特殊符号一直让人头痛,建议用sed或者awk来处理。

2007-7-6 01:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: