0%

BAT

批处理学习日志

简介

批处理脚本运行于windows系统,以.bat.cmd为后缀名,大致与Linux系统下的.sh文件对应,可直接双击运行或在命令行中运行,运行环境基本为命令行环境。

批处理命令大致与命令行命令效果一致。批处理命令不区分大小写。

常见功能

  • 可以可以读取用户的输入,以便进一步处理。
  • 有控制结构: for ,if , while 和switch
  • 更好的自动化和脚本支持高级功能,如函数和数组
  • 支持正则表达式
  • 可以包含其他编程代码,如Perl。

常用DOS命令

echo

显示字符串。

批处理脚本默认在运行时显示其命令。在命令前加@以取消显示。

使用

1
echo off

取消显示之后的命令,但会显示该命令本身,故一般与@搭配使用

1
@echo off

从而取消显示脚本的命令。

rem

注释。以rem开头的行被视为注释,执行时自动忽略,但可以回显(回显即脚本运行时显示其命令)。

补充

:也可用于注释。

  • 任何以冒号:开头的字符行,在批处理中都被视作标号,而直接忽略其后的所有内容。
    • 有效标号: 冒号后紧跟一个以字母数字开头的字符串,goto 语句可以识别。
    • 无效标号: 冒号后紧跟一个非字母数字的一个特殊符号,goto 无法识别的标号,可以起到注释作用,所以*:: 常被用作注释符号*。
  • ::后的字符行在执行时不会回显。

变量

引用

将变量名包含在%进行引用。

1
echo %massage%

输出massage变量的值。

传入参数

批处理执行时可传入参数,在脚本中使用%1%2%3等进行调用。

例如:

a.bat:

1
2
3
@echo off
echo %1
echo %2

运行:

1
a.bat 1 2

set

使用set命令给变量赋值。

1
set [/A] [variable]=[value]
  • /A:若该变量的值为数值,则使用该参数
  • varible:变量名
  • value:变量值
  • 注意等号左右不要有空格

例如:

add.bat:

1
2
3
4
5
@echo off
set /A a=1
set /A b=2
set /A c=%a%+%b%
echo %c%

则运行add.bat可得:

1
3

作用域

全局变量

默认情况下,变量作用域为整个命令提示符会话。

局部变量

调用SETLOCAL命令。

在调用SETLOCAL之后,变量赋值在调用ENDLOCALEXIT或执行到脚本的文件末尾(EOF)时都会返回。

环境变量

同正常变量调用方式。

字符串

DOS中,字符串为一个有序的字符集合。

创建字符串

使用set命令,如:

1
2
@echo off
set massage=hello world

空字符串

可通过如下方式创建空字符串(在命令行中似乎无法通过该方式创建空字符串):

1
set a=

可在方括号中包含变量名,并将其与方括号中的值进行比较。

通过该方式可判断空字符串:

1
if [%a%]==[] echo string a is empty

字符串连接

使用set命令后跟多个字符串(也可为数值变量)即可完成拼接。

例如:

1
2
3
4
5
6
@echo off 
SET a=Hello
SET b=World
SET /A d=50
SET c=%a% and %b% %d%
echo %c%

字符串长度

无特定函数,可通过自定义函数实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
@echo off
set str=Hello World
call :strLen str strlen
echo String is %strlen% characters long
exit /b

:strLen
setlocal enabledelayedexpansion

:strLen_Loop
if not "!%1:~%len%!"=="" set /A len+=1 & goto :strLen_Loop
(endlocal & set %2=%len%)
goto :eof

字符串提取

使用~,形如:

1
%str:~[num1],[num2]%

提取从$[[num1],[num2])$的字符串(从0开始)

也可使用负数,表示从末尾开始计算,[num2]可以缺省,缺省时一直截取到字符串末尾。

例如:

1
2
3
@echo off 
set str=Helloworld
echo %str:~0,5% %str:~-5%

将输出

1
Hello

替换字符

使用=,形如:

1
%str1:[sub_str1]=[str2]%

将字符串str1中的所有[sub_str1]替换为[str2]

可以用于删除字符。

例如:

1
2
3
4
@echo off 
set str=This message needs changed.
set str=%str:needs=has%
echo %str%

数组

没有专门的数组类型,但可通过逐个定义来实现,所以严格意义上是用类似方式命名的一系列变量集合。

参考资源

  1. 批处理教程 (yiibai.com)
  2. 批处理入门手册_w3cschool
-------------终了-------------

欢迎关注我的其它发布渠道