中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 启用延迟变量的一些问题,请大家帮忙解答一下!
作者:
标题: 启用延迟变量的一些问题,请大家帮忙解答一下! 上一主题 | 下一主题
shtcool
初级用户





积分 49
发帖 20
注册 2007-10-23
状态 离线
『楼 主』:  启用延迟变量的一些问题,请大家帮忙解答一下!

大家都知道如果在脚本行首启用延迟变量(setlocal EnableDelayedExpansion)那么会把文本中所有的感叹号抛弃,解决办法用call也不尽人意!
例如1:
set num=0
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('findstr /n .* a.txt') do (
    set /a num+=1
    set "str=%%i"
    echo 第 !num! 行: !str:*:=!
)
pause
文本内容为:
;;;ef &
;:;
::;;

&
^
!<
!
%
"
""
'
""
""
""
""
""
!

但看了以前namejma版主的一段代码,如下2:
set num=0
for /f "delims=" %%i in ('findstr /n .* a.txt') do (
    set /a num+=1
    set "str=%%i"
    setlocal enabledelayedexpansion
    echo 第 !num! 行: !str:*:=!
    endlocal
)
pause
这段是在for语句内部调用延迟变量能完全兼容感叹号、连接符号、重定向符号、行首分号、行首冒号.
问题就是:为什么在FOR语句内调用延迟变量,延迟变量不会抛弃"!"号?难道是跟延迟变量预处理环境的位置有关?在例1中先执行的延迟变量环境所以会抛弃所有"!"号,在例2中变量str赋值后在执行延迟变量为什么就不抛弃"!"号?何解?请大家告知其中原因,谢谢!

2007-12-26 16:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




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



  Quote:
set num=0
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('findstr /n .* a.txt') do (
    set /a num+=1
    set "str=%%i"
    echo 第 !num! 行: !str:*:=!
)
pause

第一个例子中,SetLocal语句写在了for语句的外面,变量延迟作用的范围是这条语句下面所有的语句(这里是for语句),而第二个例子中,SetLocal 命令作用的范围只是上面红色部分的语句,即对另外的两条set语句并没有作用,也就是说,文本中包含“!”字符的话,不会被Setlocal 的作用而影响(也可以理解为扩展),所以第二个例子中,本文的“!”符号不会被Setlocal语句外面的set命令所影响。

这里也涉及到了cmd对命令的预处理机制,简单的说,就是对于没有条批处理语句,cmd在解释运行它之前,都会对它里面变量及参数做必要的扩展动作,比如“echo %str%”,会先把其中的%str%扩展为str变量所对应的值,再来执行这条echo命令,即执行的是“echo <str变量的值>”。

详细的分析可以搜索一下前版主willsort以前写的分析贴。

[ Last edited by lxmxn on 2007-12-26 at 04:23 PM ]

2007-12-26 16:21
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
shtcool
初级用户





积分 49
发帖 20
注册 2007-10-23
状态 离线
『第 3 楼』:  

感谢版主的解答,以前没有好好的体会,现在真的要好好体会一下了,非常感谢!

2007-12-26 16:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
nhhulie
新手上路





积分 6
发帖 3
注册 2007-12-4
状态 离线
『第 4 楼』:  

这个有点难哦。。

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

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


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



论坛跳转: