windows bat脚本总结

在cmd.exe中重复输入cmd是一件烦人的事情,如何才能节省时间?批处理脚本是不错的方式。基本上,只要把在cmd.exe中输入的命令一行一行放入*.bat脚本中就可以了。同时,bat脚本功能更加强大。日常工作中经常碰到需要设置环境变量,清理编译残留等,此时可以自己动手写bat脚本。可惜的是,现在网上找不到比较系统的教程。下面是我从网络中搜集过来的,日后会不断的完善。


Section 1, 输入,输出 
1, ::
   BAT脚本中的注释


2, @
   执行窗口中不显示它后面这一行的命令本身。
   ::a.bat
   @echo 'hello world!'
   
   ::b.bat
   echo 'hello world!'


3, echo
   显示信息,类似于C语言函数puts,或将命令回显打开或关上。
   ECHO [ON | OFF]: ECHO OFF 后的所有命令都不会显示命令本身,除非执行ECHO ON命令。
   ECHO [message]
   要显示当前回显设置,键入不带参数的 ECHO。


4,pause
   暂停此批处理程序,并显示消息: ‘请按任意键继续...’,类似于C语言中函数getchar。


5, %
   BAT脚本命令行传递参数
   ::a.bat arg1 arg2 arg3
   echo %1 %2 %3
   ::%1是参数1,%2是参数2, %3是参数3


6, >,>>, <, |
   重写向和管道,类似于Linux下的重写向和管道。




Section 2, 变量
1, 变量
    (a)定义变量
    set [variable=[string]], 注意没有空格
    variable  指定环境变量名。
    string    指定要指派给变量的一系列字符串。


    set变量中的开关: /A 和 /P
    set /A expression     指定等号右边的字符串为被评估的数字表达式。
    set /P variable=[promptString] 允许将变量数值设成用户输入的一行输入。


    查看关于set的更多详细内容,可以在cmd.exe中输入help set


    **子字符串提取(工作中经常用到)**
    示例:
    %PATH:~10,5%
    会扩展 PATH 环境变量,然后只使用在扩展结果中从第 11 个(偏移量 10)字符开始的五个字符。如果没有指定长度,则采用默认值,即变量数值的余数。如果两个数字(偏移量和长度)都是负数,使用的数字则是环境变量数值长度加上指定的偏移量或长度。


    %PATH:~-10%
    会提取 PATH 变量的最后十个字符。


    %PATH:~0,-2%
    会提取 PATH 变量的所有字符,除了最后两个。
    
    **子字符串替换**
    %PATH:str1=str2%
    会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的开始到 str1 剩余部分第一次出现的地方,都一直保持相配。
    
    
    (b)获取变量值
    %variable%
    获取变量variable的值。
    
    **系统定义变量**
    %CD% - 扩展到当前目录字符串。
    %DATE% - 用跟 DATE 命令同样的格式扩展到当前日期。
    %TIME% - 用跟 TIME 命令同样的格式扩展到当前时间。
    %RANDOM% - 扩展到 0 和 32767 之间的任意十进制数字。
    %ERRORLEVEL% - 扩展到当前 ERRORLEVEL 数值。


Section 3, 语句控制  
1, if
   IF [NOT] ERRORLEVEL number command
   IF [NOT] string1==string2 command
   IF [NOT] EXIST filename command


   NOT               指定只有条件为 false 的情况下,Windows 才应该执行该命令。
   ERRORLEVEL number 如果最后运行的程序返回一个等于或大于指定数字的退出代码,指定条件为 true。通常情况下,没有错误时退出代码为0。退出代码非0,可能存在错误。
   string1==string2  如果指定的文字字符串匹配,指定条件为 true。
   EXIST filename    如果指定的文件名存在,指定条件为 true。
   command           如果符合条件,指定要执行的命令。如果指定的条件为 FALSE,命令后可跟 ELSE 命令,该命令将在 ELSE 关键字之后执行该命令。


   ELSE 子句必须出现在同一行上的 IF 之后。例如:
       IF EXIST filename. (
          del filename.
       ) ELSE (
          echo filename. missing.
       )
   由于 del 命令需要用新的一行终止,因此以下子句不会有效:
   IF EXIST filename. del filename. ELSE echo filename. missing
   由于 ELSE 命令必须与 IF 命令的尾端在同一行上,以下子句也不会有效:
IF EXIST filename. del filename.
ELSE echo filename. missing
   如果都放在同一行上,以下子句有效:
IF EXIST filename. (del filename.) ELSE echo filename. missing




2, for
   FOR %variable IN (set) DO command [command-parameters]


   %variable  指定一个单一字母可替换的参数。
   (set)      指定一个或一组文件。可以使用通配符。
   command    指定对每个文件执行的命令。
   command-parameters 为特定命令指定参数或命令行开关。


   在批处理程序中使用 FOR 命令时,指定变量请使用 %%variable而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.
   
   **示例**
   FOR %%C IN (*.bat *.txt) DO ls -l %%C
   for %%i in (t*.*) do @echo %%i


   **命令扩展**
   FOR /D %variable IN (set) DO command [command-parameters]
    /D 如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。


   FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
    /R 检查以 [drive:]path 为根的目录树,包括其子目录。
    如果在 /R 后没有指定目录规范,则使用当前目录。如果集仅为一个单点(.)字符,
    则枚举该目录树。
   
   FOR /L %variable IN (start,step,end) DO command [command-parameters]
    /L 该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列
    1 2 3 4 5,(5,-1,1)将产生序列(5 4 3 2 1)


@echo off
FOR /L %%i IN (0, 2, 100) DO (
  echo %%i
    echo ***

@echo on




3, goto和:
   goto跳转与C/C++类似,:用于在批处理文件中定义标签。
   ::a.bat
   goto USAGE
   ...
   :USAGE
   ... 


   **示例**
   @echo off
   set n=%1
   set i=0
   :loop
   set /A i=%i%+1
   echo Bang! 
   if %i%==%n% goto end
   goto loop
   :end




Section 4, 工具Utils
1,taskkill, tasklist
   tasklist /FI "IMAGENAME EQ CHROME*" 列出所有chrome*进程
   TASKKILL /F /IM cmd.exe /T   


2, start
   启动一个单独的窗口运行指定的程序或命令。
   start cmd


3, call
   从批处理程序调用另一个批处理程序。


4, sort, chidr, comp, fc, find, ver


Section 5, 其它

1, @echo off
set foo="helloworld"
if %foo%=="helloworld" (
set foo="helloubuntu"
echo %foo%
)

输出什么? helloubuntu? No!

batch解释器到底是怎么执行的?

1.首先,解释器执行if判断为真,解释器对后面的cmd进行语法验证、执行(读整个句子时并不执行)等操作

2.读完整个句子后,解释器会进行一项变量扩展(也就是我们熟知的变量替换)的工作,batch特有的语法是两个%之间的变量(上面的%foo%就是)会被替换

3.完成替换工作后,解释器开始执行这个整句。

因为输出结果为helloworld


@echo off
setlocal enabledelayedexpansion
set foo="helloworld"
if %foo%=="helloworld" (
set foo="helloubuntu"
echo %foo%
)



  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值