zoukankan      html  css  js  c++  java
  • 如何写批处理文件

    攻略

    [致谢] 本攻略摘自黄晓菲在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"没有看懂,达人帮忙领悟一下,帮助实在翻译得太烂。

    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 http://www.cnblogs.com/
      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%
    
  • 相关阅读:
    cors
    js 离开页面
    移动端 touch
    eclipse
    java获取classpath以外的路径
    Javascript类型转换的规则
    myeclipse开发安装C++
    MyEclipse10中配置开发Python所需要的PyDev 绝对靠谱 不忽悠!
    POI生成EXCEL,公式不自动执行的有关问题
    POI中设置Excel单元格格式样式(居中,字体,边框等)
  • 原文地址:https://www.cnblogs.com/licheng/p/1252670.html
Copyright © 2011-2022 走看看