call,行标,注释,和 环境变量
以一个冒号开头的英文字,表示这是一个行标。如:
- :labelSomewhere
两个冒号开头的英文字,表示一个注释掉的行。
- ::comment content
注意,这种方式注释,不可以放在括号引起的多行语句之间。
将一个文件名的排列,以空格分隔,放在一个环境变量内;以该环境变量作为循环遍历的列表内容。减少命令脚本内容修改的必要。
- set fileList=fileA fileB fileC
或者将所有文件名,作为脚本文件执行的参数,如下写法
- script.cmd fileA.txt fileB.txt
文件script.cmd 内容:
- for %%i in (%*) do echo %%i
书写成%*,额外的写法,将要遍历的字符内容分行放在一个或多个文件内,这个列表文件作为执行参数,循环时候遍历文件内容,读出每一行到循环变量。
- for /f "usebackq" %%i in (%1) do echo %%i
如果文件的行含有空格,输出的是第一个字。这是,可以书写修改成下例:
for /f "usebackq tokens=*" %%i in (%1) do echo %%i
执行s.cmd fileList.txt
效果相当于列出文件内容,但是一次读取文件一行,较节省系统资源。
上述tokens的值是一个逗号分隔的列表,数值指定要索取记号的序号,星号指定余下所有标记。
更多帮助参见for /?
注意:脚本文件内循环变量命名,写成%%i;命令行方式下,写成%i:
- for %%i ...
- for %i...
call,调用其他程序,常调用同样的批命令脚本文件;或者调用某行标,配合"goto :labelAtLastLine" 的方式实现类似子程序调用功能。
- call notepad
- call :subroutine
- .
- .
- .
- :subrountine
- ...
调用行标时,脚本执行点位置保存,调到行标位置行,按照逻辑执行到脚本结尾后,返回到调用点的下一行,继续解释和执行脚本。
如果足够无聊,可以试一下:
script.cmd内容写成
- call script.cmd
然后就可以看到无穷无尽的递归调用,或者:
script.cmd文件内容写成
- start script.cmd
点击执行后,可以看到无穷尽的弹出窗口。终结的方式是在任务管理器下结束命令行程序的进程树
将这个脚本内容复制到两行,你就可以体会一下进程数量呈指数级增长的感觉。
- start script.cmd
- start script.cmd
- exit
最后,觉得这些视窗脚本命令的用处其实不大。除了可以帮助写出在路径名内包含空格的独立游戏安装脚本。