返回列表 发新帖

[分享] set 的变量赋值在for里面怎么实现

[复制链接]
发表在  2013-8-6 20:00:11  | 显示全部楼层 | 阅读模式
[已结]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聯盟常任參議员


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

不是太明白



. 繽紛色彩閃出的美麗是因為它沒有分開每種色彩...>/

    我的百度空间: BEYOND超越        为什么用DOS  
2006-5-6 19:15
              
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时代”站长


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

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



Wengier - 新DOS时代

欢迎大家来到我的“新DOS时代”网站,里面有各类DOS软件和资料,地址:
http://wendos.mycool.net/

E-Mail & MSN: wengierwu AT hotmail.com (最近比较忙,有事请联系DOSroot和雨露,谢谢!)

2006-5-7 05:52
                
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 /vn 或者 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







我将原代码改了也行了:
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
                
无奈何
荣誉版主





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

对于你的问题,一种方法是启用延迟环境变量,SETLOCAL ENABLEDELAYEDEXPANSION,需要将变量引用符“%” 替换为“!”具体参见 set /?;另一种方法是从 for 中调用函数。
例1:

  Quote:

    [li]@echo   off
    [/li][li]SETLOCAL ENABLEDELAYEDEXPANSION
    [/li][li]set file=%1
    [/li][li]set str=kkkkkkr
    [/li][li]
    [/li][li]for /f "tokens=1,2*" %%i in ('findstr "第" %file%') do (
    [/li][li]     set str=%%i
    [/li][li]     echo.!str! %%j
    [/li][li]     rem 可以对 str 进行处理。
    [/li][li]     set str=!str!$
    [/li][li]     echo.!str!
    [/li][li])
      [/li]
            -=代码着色  BY:无奈何=-

    例2:

      Quote:

      [li]@echo   off
      [/li][li]set file=%1
      [/li][li]set str=kkkkkkr
      [/li][li]
      [/li][li]for /f "tokens=1,2*" %%i in ('findstr "第" %file%') do (
      [/li][li]     call :fun %%i %%j
      [/li][li])
      [/li][li]goto :EOF
      [/li][li]
      [/li][li]:fun
      [/li][li]set str=%1
      [/li][li]rem 可以对 str 进行处理。
      [/li][li]set str=%str%$
      [/li][li]echo.%str% %2
      [/li][li]goto :EOF
      [/li][li]
        [/li]
              -=代码着色  BY:无奈何=

      发表回复

      您需要登录后才可以回帖 登录 | 马上加入

      本版积分规则