@echo off
%1 (start /min cmd.exe /c %0 :&exit)
echo put your code below
pause
事实上,执行完第二行,由于&exit 存在,当前终端会退出,所以在当前的终端,是不会继续执行第三行以及后面的代码的。
第二行的作用:
- 当前终端,因为仅仅只调用了批处理文件,所以 %1 是空的,所以不影响。
-
start /min
重新打开一个终端,并最小化运行后面的命令 -
cmd.exe /c
调用cmd.exe
程序,并用/c 参数,执行完后,即退出终端,这样保持 运行批处理文件的方式,即运行结束之后,自动关闭终端。 -
%0 :
事实上,这是两个参数,%0
即当前批处理文件,即递归的调用自身文件,第二个参数:
,这里利用了一个批处理的语法特性,:
放在句首,仅作代码块标签命名使用,用于goto
语句的跳转,:
之后的语句并不会执行,但在剧中却并不会产生作用。类似的这里两个冒号::
,它在句首起注释作用,但是句中出现,不起作用。在这段中,冒号也会作为cmd.exe
的参数,被标记为%1,这就是它tricky的地方,在被调用的终端执行脚本中,第二行的句首%1
变成了:
,那么第二行就被标记不再被执行(如果是::
则被注释,效果类似),然后就继续执行。
原本以为这是我没遇到过的语法,不断实验之后,发现 %1
和 :
必须同时出现才能实现只递归调用一次的效果,猛然领悟,有点舒服。
Note: 需要注意的是,由于利用了引用参数的关系,所以,批处理脚本不能存在参数,否则,就蛋疼了。