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%
    
  • 相关阅读:
    poj 3068 Bridge Across Islands
    XidianOJ 1086 Flappy v8
    XidianOJ 1036 分配宝藏
    XidianOJ 1090 爬树的V8
    XidianOJ 1088 AK后的V8
    XidianOJ 1062 Black King Bar
    XidianOJ 1091 看Dota视频的V8
    XidianOJ 1098 突击数论前的xry111
    XidianOJ 1019 自然数的秘密
    XidianOJ 1109 Too Naive
  • 原文地址:https://www.cnblogs.com/licheng/p/1252670.html
Copyright © 2011-2022 走看看