Windows下bat脚本
bat:
批处理(Batch)是一种简化的脚本语言,也称作宏。它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的命令解释器(通常是COMMAND. COM或者CMD.EXE)解释运行。类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件。批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在"命令提示"下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序。一般情况下,每条命令占据一行;当然也可以将多条命令用特定符号(如:&;、&&;、|、||等)分隔后写入同一行中;还有的情况就是像if、for等较高级的命令则要占据几行、几十甚至几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出。
echo [{on|off}] [message]
Sample:@echo off / echo hello world
rem [注释内容]
示例:rem 你好。
::和rem还是有区别的,当关闭回显时,rem和::后的内容都不会显示。但是当打开回显时,rem后的内容会显示出来,然而::后的内容仍然不会显示。
Pause 此命令将显示下面的消息:
Press any key to continue. . .(或:请按任意键继续. . .)
call 从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。
call [路径文件名] [标签]]
start 调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。
如:start calc.exe即可打开Windows的计算器
goto 跳转命令。程序指针跳转到指定的标签,从标签后的第一条命令开始继续执行批处理程序
示例:
:1
start
goto 1
注释:会打开很多个窗口(用来整人相当不错)。先用start命令打开窗口,再用goto 1命令转到1标签。注意标签名字前面要加上英文的冒号。
set 显示、设置或删除变量。批处理中的变量是不区分类型的
示例:
set aa=345 ##变量aa的值既可以被视为数字345,也可以被视为字符串345
命令"setlocal enabledelayedexpansion"来开启延迟变量开关
@ 回显屏蔽,表示不显示@后面的命令
>、>>(输出重定向) <(输入重定向)
^(转义符):将特殊字符转为普通字符,特殊符号指:| & > <
示例:
echo ^>
逻辑命令符包括:&;、&&;、||
&:用来连接n个DOS命令,并把这些命令按顺序执行,而不管是否有命令执行失败;
&&:前面的命令成功执行时,执行&&后面的命令,前面命令失败则后面不执行;
||:当前面的命令失败时,执行||后面的命令,否则不执行后面命令;
if语句:
(1)字符串比较
IF [not] string1 compare-op string2 command1 [else command2]
compare-op有以下几类:
== - 等于
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
注:选择开关/i则不区分字符串大小写;选择not项,则对判断结果进行逻辑非
示例:if %str1%==%str2% (echo 字符串相同!) else (echo 字符串不相同!)
if /i %str1% LSS %str2% (echo str1^
交互式:
echo.
set /p choice=是否显示当前时间?(y/n)
if /i not %choice% EQU n echo 当前时间是:%date% %time%
pause>nul
(2)存在判断
IF [NOT] EXIST filename command1 [else command2]
示例:
@echo off
if exist %0 echo 文件%0是存在的!
if not exist %~df0 (
echo 文件夹%~df0不存在!
) else echo 文件夹%~df0存在!
pause>nul
注释:存在判断既可以判断文件也可以判断文件夹、格式严格按上(%0即代表该批处理的全称,%~df0是对%0的修正,只保留了其驱动器盘符和路径)
(3)定义判断(判断变量是否存在)
IF [not] DEFINED variable command1 [else command2]
示例:
@echo off
set var=111
if defined var (echo var=%var%) else echo var尚未定义!
set var=% %
if defined var (echo var=%var%) else echo var尚未定义!
pause>nul
(4)结果判断
for语句:
(1)无开关
FOR %%variable IN (set) DO command
示例:for %%i in (a,"b c",d) do echo %%i
注释:%%variable是批处理程序里面的书写格式,在DOS中书写为%variable,即只有一个百分号(%)
(2)开关(大小写都可)
FOR /L %%variable IN (start,step,end) DO command ##/L可根据start、step、end控制循环次数
FOR /F ["options"] %%variable IN (set) DO command ##/F
##开关/D罗列出所有文件 /R遍历文件夹
字符串:
=========================================
@echo off
set ifo=abcdefghijklmnopqrstuvwxyz0 12 3456789
echo 原字符串(第二行为各字符的序号):
echo %ifo%
echo 1234567890123 45678901234567890123456
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%
pause
=========================================
=========================================
@echo off
echo 当前时间是:%time% 即 %time:~0,2%点%time:~3,2%分%time:~6,2%秒%time:~9,2%厘秒
pause
=========================================
替换字符串
=========================================
@echo off
set aa=伟大的中国!我为你自豪!
echo 替换前:%aa%
echo 替换后:%aa:中国=中华人民共和国%
echo aa = %aa%
set "aa=%aa:中国=中华人民共和国%"
echo aa = %aa%
pause
=========================================
字符串合并
@echo off
set aa=伟大的中国!
set bb=我为你自豪!
echo %aa%%bb%
echo aa=%aa%
echo bb=%bb%
set "aa=%aa%%bb%"
echo aa=%aa%
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
=========================================
注:%0是批处理里面的参数,代表当前运行的批处理的完全路径。类似的还有%1-%9,分别代表传递来的第1-9个参数
字符计算
=========================================
() - 分组
! ~ - -一元运算符(逻辑非、按位非、取负)
* / % - 算数运算符(乘、除得商、除得余数,即取余)
+ - - 算数运算符(加、减)
<< >> - 逻辑移位(左移一位、右移一位)
& - 按位"与"
^ - 按位"异"
| - 按位"或"
= *= /= %= += -= - 赋值
&= ^= |= <<= >>=
,-表达式分隔符(set可一次处理多个表达式)
=========================================