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 ]