2-----call在for中的实例
for %%i in (0 1 2) do (
set t=%%i
echo %t%
)
由于bat是解释执行的,最后就只显示---->2 (代码是否写错,正确的显示结果为空。)
再看:
call :a
goto:eof
:a
set t=123
for %%i in (0 1 2) do (
set t=%%i
echo %t%
)
回显--->123 123 123,这是因为cmd执行的是解释程序。
改一改
call:a %t%
goto:eof
:a
set t=123
for %%i in (0 1 2) do (
set t=%%i
echo %1
)
这时call 调用子程序的参数,,回显---->2 2 2 (代码是否写错,正确的显示结果为空。“调用子程序的参数”如何理解?)
上一句call调用的是for执行前的结果,这句调用的是for执行后的结果
由此,的结论:要调用for执行后的结果,应该调用子程序的参数。(不知所云)
再改一改上一句
@echo off
set t=123
for %%i in (0 1 2) do (
set t=%%i
call:a
:a
echo %t%
)
此时显示---->0 123 1 123 2 123这句说明了call可以让数据指针在for语句执行中,跟着for一起舞动,但是for执行完之后,它又回复到了
初始状态。call的这个功能相当于延迟环境变量的功能。
这句话没法控制不把t=123推入堆栈,无论你把goto:eof加到那里都不行。这是因为call这个支点会把前面的数据推入堆栈,这里call认为它前面的数据是t=123 ,call后就会自动
@echo off
set t=123
for %%i in (0 1 2) do (
set t=%%i
call echo %%t%%
)
此时回显----->0 1 2
原因如下:因为call执行的原理是把它前面的结果先推入堆栈,然后进入分支点,把分支点的内容执行完后,就从堆栈里面弹出保存的数据,然后回到call的下一个支点,继续