实例
一个ant编译的批处理
@echo off
echo.
echo JSch Build System
echo -----------------
set OLD_ANT_HOME=%ANT_HOME%
set ANT_HOME=tools
set OLD_CLASSPATH=%CLASSPATH%
%ANT_HOME%\bin\ant.bat -emacs %1 %2 %3 %4 %5 %6 %7 %8
goto cleanup
:cleanup
set ANT_HOME=%OLD_ANT_HOME%
set CLASSPATH=%OLD_CLASSPATH%
攻略
[
致谢] 本攻略摘自黄晓菲在cgsp论坛的一篇帖子
- pause命令使用pause命令,效果是输出"请按任意键继续. . ."或者"Press any key to continue..."然后等待敲入一个键
- 无声命令编写bat或者cmd时,在命令的前面加上"@"符号,命令行就不会回显在屏幕上,使用echo off也可以达到同样的效果,一般习惯上编写bat或者cmd时,第一行都是@echo off,这样悄无声息的关掉了接下来所有命令行的回显。最后一行echo on还原。echo可以查看现在的回显状态是开还是关。
- cmd文件和bat文件两者并没有什么不同,cmd并没有比bat强大一些。
- if命令一般的if命令用法:
if [not] exist 文件名 (command) [else command]
if [not] [/I] string compare string (command) [else command] ("/i"也行,表示忽略大小写,如果一边都是数字,那么另一边的字符也会被转换成数字)
if [not] errorlevel 数字 (command) [else command] (用于判断程序退出时的返回值)
if [not] defined 环境变量 (command) [else command]
if和else必须在一行之上,比较运算符有
大于 gtr
大于等于 geq
等于 equ或者==
小于等于 leq
小于 lss
else和if必须在一行之上,如果有else部分的话,else前面的command部分必须用()括起来。
- 一行多个命令一行多个命令之间用&符号相连,比如"dir etc & dir lib"
- call 和 start call用来调用执行另一个bat或者cmd文件,start用来调用执行其他格式的可执行文件(exe,com,vbs...)。
- goto 跟c里面差不多,标记用"adkfjdf:"来表示,然后"goto adkfjdf"
- for FOR %variable IN (set) DO command [command-parameters] (保留字大小写都无所谓,微软的系统一般都是这样)
%variable 的变量名有且仅有一个字母。如果是在脚本文件中使用for语句,必须写成%%variable,两个"%"
set 指定一个或一组文件。可以使用通配符。
for /d ... 与目录名匹配(directory),没有"/d"则只有文件名被%variable迭代,如果都要,只好写两句话了。。Sad
for /r [[driver:]path] ... "/r"表示recursion,包括了一下的所有子目录,后面[[driver:]path]参数指定起点,如果没有则表示当前目录。
for /l %variable in (start,step,end) ...
"/l"表示list,后面start,step,end都是数字,表示初值,步长和终值,比如打印1-100的命令
for /l %e in (1,1,100) @echo %e
for /f ["options"] %e in (fileset) ....
for /f ["options"] %e in ("string") ....
for /f ["options"] %e in ('command') .... (这里是平常的单引号!!!)
与linux下面的grep或者sed已经有点像了,有点行编辑的功能。表示把%e表示的文件打开读入缓冲,在缓冲中对每一行进行处理,把 token存入相应的变量,然后执行命令,继续下去直到所有文件都被处理过。因为所有的处理都是在缓冲中,所以对原文件的内容没有任何影响。也可用来分析字符串或者命令行的输出。
options:
eol=c,(end of line),指定一个符号,这个符号之后的文本会被当作注释。
skip=n,指定一个数字,处理的时候会略过开头的这么多行。
delims=xxx,制定一批字符,代替空格和回车作为token与token之间的分隔符(delimits)
tokens=x,y,m-n 第一个词语的标号为1,以此类推,后面%variable表示第一个词,拿%i来当例子。如果是写成tokens=1,2,3,4,那么%i表示第一个词,%j表示第二个词,%k表示第三个,%l表示第四个。这样写是不是很麻烦,于是你可以等价的写成1-4达到同样的效果。大家知道%variable因为只能取一个字母(微软做这种shell的解析真的很偷懒),所以最多你只能同时控制52个词,取为%A,最后一个为%z。最后在不加","的情况下使用 ,表示这行剩下所有的部分都是一个词。如果一开始就token=,那么就是取一整行的内容。
usebackq (use back quotes,使用反引号),为什么要使用反引号呢?因为(set)中的文件名可能会带有空格,这样的文件名需要用""括起来,但是,这样不是跟表示 string的语法冲突了吗?所以我们必须开启“使用反引号”的开关,开启之后,""中括起来的部分被当作文件名看待。而”(正常单引号)括起来的部分被当作字符串,最后“(反单引号)括起来的部分被当作命令。
for基本到这里,最后那一部分诸如"%~aI"没有看懂,达人帮忙领悟一下,帮助实在翻译得太烂。
- 参数与shift %0表示命令自己的文字。%1表示第一个参数。。。。%9表示第九个参数,超过了9个怎么办?没有问题,我们可以使用shift。这10个参数就好像10个连续的观察点一样。一旦shift,就是右移,这样就%0变成了原来的%1。。。。%9变成了原来的"%10"...
看这个打印所有参数的脚本
@echo off
:print
if "%1"=="" goto end
echo %1
shift
goto print
:end
@echo on
技巧
实例
一个ant编译的批处理
@echo off
echo.
echo JSch Build System
echo -----------------
set OLD_ANT_HOME=%ANT_HOME%
set ANT_HOME=tools
set OLD_CLASSPATH=%CLASSPATH%
%ANT_HOME%\bin\ant.bat -emacs %1 %2 %3 %4 %5 %6 %7 %8
goto cleanup
:cleanup
set ANT_HOME=%OLD_ANT_HOME%
set CLASSPATH=%OLD_CLASSPATH%