![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-01 19:03 |
共 48,037 主题排行 / 350,122 发帖 / 今日 2 篇 / 48,249 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [已结]set 的变量赋值在for里面怎么实现啊? |
| 可打印版本 1,748 / 10 |
| 第1楼 persiancat | 发表于 2006-05-06 19:09 |
| 初级用户 发帖 8 积分 28 | |
|
[已结]set 的变量赋值在for里面怎么实现啊? 文本中有以下内容:
第一百零二回 北饮狂刀 第一百零一回 杀麟求路 我想取得 “第**回”到环境变量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 ] |
|
| 第2楼 Jneny | 发表于 2006-05-06 19:15 |
| 高级用户 发帖 318 积分 686 | |
|
不是太明白
|
|
| 第3楼 persiancat | 发表于 2006-05-07 00:51 |
| 初级用户 发帖 8 积分 28 | |
|
就是每次在文本中取得一行中的前面几个字符串,并赋值给str(以后又别的用途,我没在这里说明),如先取文本第一行“第一百零二回 北饮狂刀 [30] ”的“第一百零二回”给str,再去文本第二行“第一百零一回 杀麟求路 [29] ”的“第一百零一回”给str
我上面的代码期望输出是: 第一百零二回 第一百零二回 第一百零一回 第一百零一回 第一百零一回 即我的期望是str和%%i 的值是相等的,但在for里面显示的str的值都是它的初始值kkkkkkr,只有在最后的时候才将str赋值为文本最后一行的前面几个字符 我该怎么该才能实现for中的str变量赋值呢? |
|
| 第4楼 Wengier | 发表于 2006-05-07 05:52 |
| 系统支持 发帖 10,521 积分 27,736 | |
|
对于批处理问题,不妨发到论坛的批处理版块中,那里有不少批处理高手。
|
|
| 第5楼 persiancat | 发表于 2006-05-07 08:28 |
| 初级用户 发帖 8 积分 28 | |
|
求助: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变量赋值呢? |
|
| 第6楼 persiancat | 发表于 2006-05-07 09:58 |
| 初级用户 发帖 8 积分 28 | |
|
在 百思不解,关于for……一贴找到了
willsort 版主 Batchinger 积分 3317 发帖 1163 注册 2002-10-18 状态 离线 『第 3 楼』: Re arding: 完成你所需要的功能需要使用新的变量定界符 ! ,要使用这个定界符,需要启动延缓变量扩展,通过 cmd /v:on 或者 setlocal EnableDelayedExpansion 来实现。这些内容,过去的主题中也有不少讨论,可以全文搜索一下。或者直接查看 cmd / setlocal / for 的命令行帮助,下面是你的程序修改后的代码。 CODE: -------------------------------------------------------------------------------- @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 ] |
|
| 第7楼 3742668 | 发表于 2006-05-07 12:46 |
| 荣誉版主 发帖 718 积分 2,013 | |
|
个人观点:
批处理(不妨叫它cmd1)中的for命令,应该是在cmd的另外一个实例(不妨叫它cmd2)中被解释运行(或者理解为新开了个cmd.exe来解释运行for命令,而且这个程序是在后台运行的),由于不同的实例之间的变量是不能互相访问的,所以在cmd1中调用cmd2中的变量是行不通的,这就相当于在cmd.exe中运行某个程序,你可以调用它的参数,而不能调用它的变量。但是在实际应用中有时候cmd1又需要调用cmd2的变量,windows为这种情况准备一个命令就是setlocal EnableDelayedExpansion了。 至于!与%的区别,可以这么理解: !表示按地址访问 %表示按参数访问 从小到大语文老师都不漂亮,唉.... |
|
| 第8楼 chineselgs | 发表于 2006-05-07 20:32 |
| 高级用户 发帖 266 积分 613 来自 河南省 | |
|
去批处理坛里发一下,那里高手多啊~~ |
|
| 第9楼 无奈何 | 发表于 2006-05-08 00:24 |
| 荣誉版主 发帖 356 积分 1,338 | |
|
对于你的问题,一种方法是启用延迟环境变量,SETLOCAL ENABLEDELAYEDEXPANSION,需要将变量引用符“%” 替换为“!”具体参见 set /?;另一种方法是从 for 中调用函数。
例1:
例2:
|
|
| 第10楼 doscc | 发表于 2006-05-08 12:59 |
| 中级用户 发帖 93 积分 256 来自 广东 | |
|
学习中....
|
|
| 第11楼 willsort | 发表于 2006-06-22 09:13 |
| 元老会员 发帖 1,512 积分 4,432 | |
|
───────────────── 版务记录 ───────────────── 执行:Will Sort 操作:合并主题 {20503}求助:set 的变量赋值在for里面怎么实现阿? -> 5,6,7 楼 说明:重复主题存在不重复的回复 处罚:因属论坛新人,不予积分处罚 提示:请访问 {7326}论坛新手必读,所有人的基本行为准则 ───────────────── 版务记录 ───────────────── Re All: 关于环境变量延迟扩展,我的个人理解如下: 什么情况下该使用变量延迟? http://www.cn-dos.net/forum/viewthread.php?tid=20733 |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |