zoukankan      html  css  js  c++  java
  • bat

    基础:

        @title 设置标题
        @color 设置颜色
        @mode con: cols=50 lines=8 设置行列
        @pause 执行完毕暂停

        所有bat都应该使用REM注释

        REM 是明确的注释,::注释在某些情况下会出错,可能执行时被误当做磁盘访问。::实际上也只是一个不生效的特殊标签,有解析错误的概率,正常情况下在批处理脚本中和rem命令等效,它后面的内容在执行时不显示,也不起任何作用.

        echo 中 文为“反馈”、“回显”的意思。它其实是一个开关命令,就是说它只有两种状态:打开和关闭。于是就有了echo on和echo off两个命令了。直接执行echo命令将显示当前echo命令状态(off或on)执行echo off将关闭回显,它后面的所有命令都不显示命令本身,只显示执行后的结果,除非执行echo on命令。首行的@命令和echo off命令联合起来,达到了两个目的:不显示echo off命令本身,不显示以后各行中的命令本身。

    bat文件中一个命令过长需要换行时刻在命令中加入^,然后就可以回车换行了.

    函数调用:

        从批处理程序调用另一个批处理程序(过程)。
    CALL [drive:][path]filename [batch-parameters]
        batch-parameters   指定批处理程序所需的命令行信息。
    如果命令扩展被启用,CALL 会如下改变:
    CALL 命令现在将卷标当作 CALL 的目标接受。语法是:
        CALL:label arguments

        批处理中调用存在调用栈上限,超过上限会溢出报错。(bat栈上限

    参数:

        bat调用传递超过10个参数

        Bat 参数去引号(各种去引号的奇葩方式,三种变量互转),普通变量不能直接去掉外层引号


    Windows中的命令行(bat)提示符里的Start命令执行路径包含空格时的问题

        START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED] [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL] [/AFFINITY <hex affinity>] [/WAIT] [/B] [command/program] [parameters]
        "title"     在窗口标题栏中显示的标题。

        由帮助可以看出,Start命令会将第一个带双引号的参数当做标题,因而(start "C:\Program Files\Internet Explorer\iexplore.exe")将会出错. 所以应该在前面加上一对双引号作为标题. 即 start "" "C:\Program Files\Internet Explorer\iexplore.exe"

        start /wait calc.exe (等待调用程序结束的启动方式)      

    @的作用就是让脚本在执行时不显示后面的echo off部分。

    find 与linux的netstat | grep "7626"相似 netstat | find "7626"

    判断文件是否存在
        IF EXIST filename. (
         del filename.
        ) ELSE (
         echo filename. missing.
        )

    路径操作:

        取当前路径
        在批处理开头加入cd /d %~dp0 一行代码就可以做到“编写一次,到处运行”。%0是批处理文件本身的路径,%~dp进行扩展, d向前扩展到驱动器,p往后扩展到路径。例如,你的bat文件在e:/mybat/test.bat,则%0就是e:/mybat/test.bat, %~dp0是e:/mybat/。
        另外,%i提取第i个命令选项,例如%1提取第1个option,i可以取值从1到9
        %~0: 取文件名(名+扩展名)
        %~f0:取全路径
        %~d0:取驱动器名
        %~p0:只取路径(不包驱动器)
        %~n0:只取文件名
        %~x0:只取文件扩展名
        %~s0:取缩写全路径名
        %~a0:取文件属性
        %~t0:取文件创建时间
        %~z0:取文件大小
        以上选项可以组合起来使用。


        取执行路径

        %CD%\某程序

        取上层路径
        @echo off
        pushd "%cd%"
        cd ..
        set pard=%cd%
        popd
        echo 上一层目录为%pard%
        echo 当前目录为%cd%
        pause

    字符串操作:

        替换字符串
        %var:str1=str2%

        会扩展 var 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。
        要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
        "str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的开始到 str1 剩余部分第一次出现的地方,都一直保持相配。

        截取字符串

        @echo off
        set ifo=abcdefghijklmnopqrstuvwxyz0123456789
        echo 原字符串(第二行为各字符的序号):
        echo %ifo%
        echo 123456789012345678901234567890123456
        echo 截取前5个字符:
        echo %ifo:~0,5%
        echo 截取最后5个字符:
        echo %ifo:~-5%
        echo 截取第一个到倒数第6个字符:
        echo %ifo:~0,-5%
        echo 从第4个字符开始,截取5个字符:
        echo %ifo:~3,5%
        echo 从倒数第14个字符开始,截取5个字符:
        echo %ifo:~-14,5%
        echo 当前时间是:%time% 即 %time:~0,2%点%time:~3,2%分%time:~6,2%秒%time:~9,2%厘秒
        pause

        扩充字符串

            “扩充”这个词汇来自于微软自己的翻译,意思就是对表示文件路径的字符串进行特殊的处理,具体功能罗列如下:
      =========================================
      ~I - 删除任何引号("),扩充 %I
      %~fI - 将 %I 扩充到一个完全合格的路径名
      %~dI - 仅将 %I 扩充到一个驱动器号
      %~pI - 仅将 %I 扩充到一个路径
      %~nI - 仅将 %I 扩充到一个文件名
      %~xI - 仅将 %I 扩充到一个文件扩展名
      %~sI - 扩充的路径只含有短名
      %~aI - 将 %I 扩充到文件的文件属性
      %~tI - 将 %I 扩充到文件的日期/时间
      %~zI - 将 %I 扩充到文件的大小
      %~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩充
      到找到的第一个完全合格的名称。如果环境变量名
      未被定义,或者没有找到文件,此组合键会扩充到
      空字符串
      可以组合修饰符来得到多重结果:
      %~dpI - 仅将 %I 扩充到一个驱动器号和路径
      %~nxI - 仅将 %I 扩充到一个文件名和扩展名
      %~fsI - 仅将 %I 扩充到一个带有短名的完整路径名
      %~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充
      到找到的第一个驱动器号和路径。
      %~ftzaI - 将 %I 扩充到类似输出线路的 DIR
      =========================================
      以上内容引用于for /?帮助信息。其中的I代表变量I,不过需要说明的是,不是所有的变量都能够进行扩充的,有两个条件:1、该字符串代表一个文件路径;2、变量要用%x来表示,x可取a-z A-Z 0-9共62个字符中的任意一个。(比如批处理或函数的参数,%0~%9,%x中x取a-z A-Z的形式,for语句里面的变量就是用%x来表示的)
        

    bat标准结束
        echo 输出完毕,按任意键退出&&pause>nul&&exit

    调试
        加一个set打印就好

    goto:eof

        call和goto:eof call经常和:eof配合,这个是个默认标签,在调用了call跳转到一个标签之后倘若想再跳回去则必须用goto:eof

    set /A  不支持后面数字出现08 和 09 是无效的数字,因为 8 和 9 不是有效的八进制位数

        此时支持数字格式为:十六进制有 0x 前缀,八进制有 0 前缀的,数字值为十进位数字。而08、09就成了八进制,但又会是非法8进制

    技巧操作:

         bat输出重定向

         bat取时间间隔

         bat 数组实现

    setlocal 和 endlocal

        setlocal 和 endlocal 之间对于变量的所有修改对外部不可见

        1.这可以相当于其他语言中的作用域,新定义的变量只有在作用域内存在,作用域外不存在;
        2.但是对于全局变量(外层作用域变量)的操作则有所不同,作用域中可以访问全局变量(外层作用域变量),但是对于全局变量(外层作用域变量)的修改,只在作用域内生效,在作用域外是不生效的。可以将对于全局变量的修改理解为作用域内重新定义,这样在作用域内相当于覆盖了全局变量定义。
        3.这种作用域是允许嵌套的,不过嵌套层数限制为最多32层,否则就会提示 “以达到最大递归层”的错误信息。
        4.有了作用域后,批处理的函数便更像其他语言的函数,因为拥有了局部变量。
        5.然后带来的问题则是使用作用域之后,作用域内部变量如何返回出去呢,下面两种方式:
        ①
        {
            endlocal
            REM 这里必须使用%%,为了在执行这一段之前使用作用域内部变量替换指令,然后退出作用域执行指令
            set globalval=%innerval%
        }
        ②
        endlocal & set globalval=%innerval%

    bat函数管道读取

    while read line
    do
        …
    done
  • 相关阅读:
    Windows核心编程(笔记11) 第十三章 Windows内存体系结构 四
    源码网站推荐 四
    程序员应知——破窗与童子军军规 四
    warning LNK4098 VC开发中遇到的问题 四
    各种系统架构图及其简介 四
    Windows核心编程(笔记10) 第十一章 Windows线程池 第十二章 纤程 四
    Windows核心编程(笔记12) 第十四章 探索虚拟内存 第十五章 在应用程序中使用虚拟内存 四
    Perl、PHP、ASP、JSP技术比较 四
    #pragma 预处理指令详解 四
    实战剖析三层架构 四
  • 原文地址:https://www.cnblogs.com/dongzhiquan/p/bat.html
Copyright © 2011-2022 走看看