call,行标,注释,和 环境变量

以一个冒号开头的英文字,表示这是一个行标。如:

  1. :labelSomewhere 

两个冒号开头的英文字,表示一个注释掉的行。

  1. ::comment content 

注意,这种方式注释,不可以放在括号引起的多行语句之间。

将一个文件名的排列,以空格分隔,放在一个环境变量内;以该环境变量作为循环遍历的列表内容。减少命令脚本内容修改的必要。

  1. set fileList=fileA fileB fileC 

 

或者将所有文件名,作为脚本文件执行的参数,如下写法

  1. script.cmd fileA.txt fileB.txt 

文件script.cmd 内容:

  1. for %%i in (%*) do echo %%i 

书写成%*,额外的写法,将要遍历的字符内容分行放在一个或多个文件内,这个列表文件作为执行参数,循环时候遍历文件内容,读出每一行到循环变量。

  1. 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:

  1. for %%i ... 

 

  1. for %i... 

 

call,调用其他程序,常调用同样的批命令脚本文件;或者调用某行标,配合"goto :labelAtLastLine" 的方式实现类似子程序调用功能。

 

  1. call notepad 

 

 

  1. call :subroutine  
  2.  
  3.  
  4.  
  5.  
  6. :subrountine 
  7.  
  8. ... 

 


 

调用行标时,脚本执行点位置保存,调到行标位置行,按照逻辑执行到脚本结尾后,返回到调用点的下一行,继续解释和执行脚本。

如果足够无聊,可以试一下:

script.cmd内容写成

 

  1. call script.cmd 

然后就可以看到无穷无尽的递归调用,或者:

script.cmd文件内容写成

 

  1. start script.cmd 

点击执行后,可以看到无穷尽的弹出窗口。终结的方式是在任务管理器下结束命令行程序的进程树

将这个脚本内容复制到两行,你就可以体会一下进程数量呈指数级增长的感觉。

 

  1. start script.cmd 
  2. start script.cmd 
  3. exit 

最后,觉得这些视窗脚本命令的用处其实不大。除了可以帮助写出在路径名内包含空格的独立游戏安装脚本。