• 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"没有看懂,达人帮忙领悟一下,帮助实在翻译得太烂。

  1. 参数与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


技巧


  • 巧用cd命令 cd命令在dos里面用于改变目录.在批处理里面同样起这样的作用.如果某个命令必须要到某个目录下去执行的话,cd命令就有用了.如果你不想让众多的cd命令干扰你的屏幕的输出,那么在cd命令前面加一个"@"吧.​​​
  • 巧用"@"符号如果你不像回显某命令行,那么在改行之前加一个"@"吧.
  • 某些命令行程序执行的时候会取代批处理的执行,当该程序执行完后,会导致整个批处理退出.比如ant就是这样.这个时候你需要用call指令,或者start指令. call指令可以在当前命令行窗口启动其他程序,并在该程序执行完之后取得控制权.一般用于执行另外一个批处理和cmd
    start指令会开启一个新的命令行窗口,在该窗口执行指定的程序.
    下面是个简单的例子:
    execant.bat
cd
call ant %1
cd ./dist/bin
可以去掉call指令或者将call指令换成start,看看响应的效果.

实例

一个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%