中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]set 的变量赋值在for里面怎么实现啊?
作者:
标题: [已结]set 的变量赋值在for里面怎么实现啊? 上一主题 | 下一主题
persiancat
初级用户





积分 28
发帖 8
注册 2006-4-30
状态 离线
『楼 主』:  [已结]set 的变量赋值在for里面怎么实现啊?

文本中有以下内容: 第一百零二回 北饮狂刀 [30] 第一百零一回 杀麟求路 [29] 我想取得 “第**回”到环境变量str再进行处理,可是每次都是运行完才取到最后一行的变量赋值 显示如下: kkkkkkr 第一百零二回 kkkkkkr 第一百零一回 第一百零一回 代码如下: set file=%1 set str=kkkkkkr for /f "tokens=1,2*" %%i in ('findstr "第" %file%') do ( set str=%%i echo %str% %%i ) echo %str% 请问我该怎么处理呢? [ Last edited by willsort on 2006-5-11 at 16:03 ]


2006-5-6 19:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Jneny
高级用户

中國DOS聯盟常任參議员


积分 686
发帖 318
注册 2005-11-4
状态 离线
『第 2 楼』:  

不是太明白




. 繽紛色彩閃出的美麗是因為它沒有分開每種色彩...>/ 我的百度空间: BEYOND超越 为什么用DOS
2006-5-6 19:15
查看资料  发送邮件  发短消息 网志  OICQ (290256061)  编辑帖子  回复  引用回复
persiancat
初级用户





积分 28
发帖 8
注册 2006-4-30
状态 离线
『第 3 楼』:  

就是每次在文本中取得一行中的前面几个字符串,并赋值给str(以后又别的用途,我没在这里说明),如先取文本第一行“第一百零二回 北饮狂刀 [30] ”的“第一百零二回”给str,再去文本第二行“第一百零一回 杀麟求路 [29] ”的“第一百零一回”给str 我上面的代码期望输出是: 第一百零二回 第一百零二回 第一百零一回 第一百零一回 第一百零一回 即我的期望是str和%%i 的值是相等的,但在for里面显示的str的值都是它的初始值kkkkkkr,只有在最后的时候才将str赋值为文本最后一行的前面几个字符 我该怎么该才能实现for中的str变量赋值呢?


2006-5-7 00:51
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Wengier
系统支持

“新DOS时代”站长


积分 27736
发帖 10521
注册 2002-10-9
状态 离线
『第 4 楼』:  

对于批处理问题,不妨发到论坛的批处理版块中,那里有不少批处理高手。




Wengier - 新DOS时代 欢迎大家来到我的“新DOS时代”网站,里面有各类DOS软件和资料,地址: wendos.mycool.net/ E-Mail & MSN: wengierwu AT hotmail.com (最近比较忙,有事请联系DOSroot和雨露,谢谢!)
2006-5-7 05:52
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (29206679)  编辑帖子  回复  引用回复
persiancat
初级用户





积分 28
发帖 8
注册 2006-4-30
状态 离线
『第 5 楼』:  求助:set 的变量赋值在for里面怎么实现阿?

文本中有以下两行内容: 第一百零二回 北饮狂刀 [30] 第一百零一回 杀麟求路 [29] 写了以下代码: set file=%1 set str=kkkkkkr for /f "tokens=1,2*" %%i in ('findstr "第" %file%') do ( set str=%%i echo %str% %%i ) echo %str% 我想取得 “第**回”到环境变量str再进行处理,可是每次都是运行完才取到最后一行的变量赋值 显示如下: kkkkkkr 第一百零二回 kkkkkkr 第一百零一回 第一百零一回 我上面的代码期望输出是: 第一百零二回 第一百零二回 第一百零一回 第一百零一回 第一百零一回 即我的期望是str和%%i 的值是相等的,但在for里面显示的str的值都是它的初始值kkkkkkr,只有在最后的时候才将str赋值为文本最后一行的前面几个字符 我该怎么该才能实现for中的str变量赋值呢?


2006-5-7 08:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
persiancat
初级用户





积分 28
发帖 8
注册 2006-4-30
状态 离线
『第 6 楼』:  

在 [已结]百思不解,关于for……一贴找到了 willsort 版主 Batchinger 积分 3317 发帖 1163 注册 2002-10-18 状态 离线 『第 3 楼』: Re arding: 完成你所需要的功能需要使用新的变量定界符 ! ,要使用这个定界符,需要启动延缓变量扩展,通过 cmd /v:on 或者 setlocal EnableDelayedExpansion 来实现。这些内容,过去的主题中也有不少讨论,可以全文搜索一下。或者直接查看 cmd / setlocal / for 的命令行帮助,下面是你的程序修改后的代码。 CODE: [Copy to clipboard] -------------------------------------------------------------------------------- @echo off & setlocal EnableDelayedExpansion set var1=00000000000000000 for /f %%i in (fl.txt) do set var1=%%i && echo !var1! echo %var1% pause :P我将原代码改了也行了: setlocal EnableDelayedExpansion set file=%1 set str=kkkkkkr for /f "tokens=1,2*" %%i in ('findstr "第" %file%') do ( set str=%%i echo !str! %%i ) echo %str% endlocal 但不懂为什么要这样做呢?变量定界符 !有什么作用的? !~!和%~%有什么区别 [ Last edited by persiancat on 2006-5-7 at 10:00 ]


2006-5-7 09:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 7 楼』:  

个人观点: 批处理(不妨叫它cmd1)中的for命令,应该是在cmd的另外一个实例(不妨叫它cmd2)中被解释运行(或者理解为新开了个cmd.exe来解释运行for命令,而且这个程序是在后台运行的),由于不同的实例之间的变量是不能互相访问的,所以在cmd1中调用cmd2中的变量是行不通的,这就相当于在cmd.exe中运行某个程序,你可以调用它的参数,而不能调用它的变量。但是在实际应用中有时候cmd1又需要调用cmd2的变量,windows为这种情况准备一个命令就是setlocal EnableDelayedExpansion了。 至于!与%的区别,可以这么理解: !表示按地址访问 %表示按参数访问 从小到大语文老师都不漂亮,唉....


2006-5-7 12:46
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
chineselgs
高级用户

论坛灌水专业户


积分 613
发帖 266
注册 2006-4-19
来自 河南省
状态 离线
『第 8 楼』:  去批处理坛里发一下,那里高手多啊~~





饮马恒河畔,剑指天山西,碎叶城揽月,库叶岛赏雪,黑海之滨垂钓,贝尔加湖面张弓;中南半岛访古,东京废墟祭祖!
2006-5-7 20:32
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (342210799)  编辑帖子  回复  引用回复
无奈何
荣誉版主





积分 1338
发帖 356
注册 2005-7-15
状态 离线
『第 9 楼』:  

对于你的问题,一种方法是启用延迟环境变量,SETLOCAL ENABLEDELAYEDEXPANSION,需要将变量引用符“%” 替换为“!”具体参见 set /?;另一种方法是从 for 中调用函数。 例1:
  1. @echo off
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. set file=%1
  4. set str=kkkkkkr
  5. for /f "tokens=1,2*" %%i in ('findstr "第" %file%') do (
  6. set str=%%i
  7. echo.!str! %%j
  8. rem 可以对 str 进行处理。
  9. set str=!str!$
  10. echo.!str!
  11. )
-=代码着色 BY:无奈何=-
例2:
  1. @echo off
  2. set file=%1
  3. set str=kkkkkkr
  4. for /f "tokens=1,2*" %%i in ('findstr "第" %file%') do (
  5. call :fun %%i %%j
  6. )
  7. goto :EOF
  8. :fun
  9. set str=%1
  10. rem 可以对 str 进行处理。
  11. set str=%str%$
  12. echo.%str% %2
  13. goto :EOF
-=代码着色 BY:无奈何=-




  ☆开始\运行 (WIN+R)☆ %ComSpec% /cset,=何奈无── 。何奈可无是原,事奈无做人奈无&for,/l,%i,in,(22,-1,0)do,@call,set/p= %,:~%i,1%<nul&ping/n 1 127.1>nul
2006-5-8 00:24
查看资料  发送邮件  发短消息 网志  OICQ (105400208)  编辑帖子  回复  引用回复
doscc
中级用户




积分 256
发帖 93
注册 2006-3-26
来自 广东
状态 离线
『第 10 楼』:  

学习中....


2006-5-8 12:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 11 楼』:  

───────────────── 版务记录 ───────────────── 执行:Will Sort 操作:合并主题 {20503}求助:set 的变量赋值在for里面怎么实现阿? -> 5,6,7 楼 说明:重复主题存在不重复的回复 处罚:因属论坛新人,不予积分处罚 提示:请访问 {7326}论坛新手必读,所有人的基本行为准则[转帖] ───────────────── 版务记录 ───────────────── Re All: 关于环境变量延迟扩展,我的个人理解如下: [1] 什么情况下该使用变量延迟? www.cn-dos.net/forum ...




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-22 09:13
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: