在window下.bat为批处理文件。我们今天来一起学习一下bat批处理的一些命令
-
不区分大小写
-
使用::注释。
例如::这是一条注释 -
修饰符@ :修饰命令,经过@修饰的命令,不在输出原始命令,只输出执行结果
输入1:echo hello1
输出1:(输出了原始命令,和执行结果)
c:\user\lenove>echo hello1
hello1加入@ 然后 输入2:
@echo hello2
输出2:(只输出了执行结果)
hello2
-
echo:回显(打印输出)
echo hello world!
@echo off : 执行以后,后面所有的命令均不显示,包括本条命令。
@echo on : 执行以后,后面所有的命令均不显示,但本条命令是显示的。 -
pause : 也是一条命令,作用就是使程序暂停,也就是输出“请按任意键继续…”的原因
如果不需要显示“请按任意键继续…”则使用
pause >nul
- color [attr] :设置命令行的背景与文字颜色。颜色属性由2个十六进制指定,第一个表示背景,第二个表示前景。每个数字可以是下面指定的值之一
数值 | 颜色 | 数值 | 颜色 |
---|---|---|---|
0 | 黑色 | 8 | 灰色 |
1 | 蓝色 | 9 | 淡蓝色 |
2 | 绿色 | A | 淡绿色 |
3 | 浅绿色 | B | 淡浅绿色 |
4 | 红色 | C | 淡红色 |
5 | 紫色 | D | 淡紫色 |
6 | 黄色 | E | 淡黄色 |
7 | 白色 | F | 亮白色 |
- call : 执行另一个批处理文件
call c:\code\run.bat
- 打开一个程序
start iexplore http:\www.baidu.com \使用IE浏览器打开百度
start chrome http:\www.baidu.com \使用chrome浏览器打开百度
start wps \打开wps文档
start wps hello.doc \使用wps打开hello.doc文档
-
dir path:输出path目录下所有文件名到控制台
dir path >a.txt \输出path目录下所有文件名到a.txt,若没有,则创建 -
del a.txt :删除a.txt。如果指定路径,则删除路径下所有的文件
-
创建文件、创建文件夹、移动、拷贝文件、拷贝文件夹
echo >a.txt mkdir c:\code //创建文件夹 md
move c:\a.txt d:\a.txt //剪切
copy c:\a.txt d:\a.txt //复制
rd c:\code //删除空文件夹 rem:删除非空文件夹
- set :设置变量功能有以下几点:
set //显示所有的环境变量
set c//显示所有的以c 开头的环境变量(不区分大小写)
set c = hello //设置变量c的值为hello
@echo c // 输出c
@echo %c% //输出hello
set d = c //赋值,d的值为c
set d = %c% //赋值,d的值与c的值相同,都为hello
set /p var=请输入变量的值://设置var的值为用户输入
set /a var = 1+1 //可以用表达式为变量赋值
- 进入某个目录 cd /d 特定的目录
cd /d "c:\program"
-
for 循环
cmd窗口中:for %i in (command1) do command2
在批处理文件中:for %%i in (command1) do command2
(1) %%i 是 bat 脚本中for循环独有语法,代表变量; (2) 除了在for循环之内使用%%i, 其他情况使用%i%表示变量。 (3) for、in和do是for语句的关键字,它们三个缺一不可; (4) in之后,do之前的括号不能省略; (5) command1表示字符串或变量,command2表示字符串、变量或命令语句;
看个例子:
::例子一
@echo off
for %%i in (ABC) do echo %%i
pause
例子一结果是:
::例子二
@echo off
for %%i in (A,B,C) do echo %%i
pause
例子二的结果是:
说明in 里面的内容默认是有分隔符的,默认的分隔符为 空格、逗号、等号。
进一步说明,如果in里面的字符串变成 www,baidu,com结果应该是怎样的呢?把逗号换成空格、等号也一样。
接下来说点高级用法:
(1) 搜索当前目录有哪些文件?
@echo off
for %%i in (.) do echo “%%i”
pause
(2)搜索当前目录下有哪些文本文件?
@echo off
for %%i in (*.txt) do echo “%%i”
pause
(3) for /f 的用法
命令格式:
(a) for /f [“options”] %%i in (file) do command
(b) for /f [“options”] %%i in (“string”) do command --注意双引号
© for /f [“options”] %%i in (‘command’) do command --注意单引号
参数说明:
file代表一个或多个文件,可以使用通配符。
string 代表字符串
command代表命令
["options"]选项有多个:
eol=c - 指定一个行注释字符,遇到c开头的行就忽略掉。
skip=n - 指定在文件开始时忽略的行数。
delims=xxx - 指定分隔符。默认是空格和TAB。
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代
的 for 本身。这会导致额外变量名称的分配。m-n
格式为一个范围。通过 nth 符号指定 mth。如果
符号字符串中的最后一个字符星号,
那么额外的变量将在最后一个符号解析之后
分配并接受行的保留文本。
usebackq - 1.把单引号字符串作为命令;2.允许中使用双引号扩起文件名称。
假如文本a.txt内容如下
第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列
第一种情况: 使用 for /f %%i in (d:\a.txt) do echo %%i
显示结果如下:
第1行第1列
第2行第1列
第3行第1列
因为命令默认是以空格和Tab作为分隔符,所以遇到分隔符之后,默认只取第一个,就将分隔符后面的都丢掉了。
如果想把每一行分解为更小的内容,怎么办?for 提供了更多的参数, 就是delims 和tokens:
delims :告诉for每一行应该拿什么作为分隔符,默认的分隔符是空格和tab键。
tokens :它的作用就是当你通过delims将每一行分为更小的元素时,由tokens来控制要取哪一个或哪几个。
比如使用 for /f "delims= " %%i in (d:\a.txt) do echo %%i
将空格作为分隔符,结果应该是:
第1行第1列
第2行第1列
第3行第1列
如果想要每一行的最后面的元素呢,就是使用tokens参数了。
比如执行for /f "tokens=2 delims= " %%i in (d:\a.txt) do echo %%i
得到的结果应该是:
第1行第2列
第2行第2列
第3行第2列
如果要显示第二列和第三列 则换成 tokens=2,3 或者 tokens=2-3,如果全部要显示则使用通配符tokens=*
for /f "tokens=2,3 delims= " %%i in (d:\a.txt) do echo %%i %%j
怎么多出来一个%%j呢?
因为tokens后面要取每一行的两列,所以应%%i,代表第二列。用%%j代表第三列。并且必须按照英文字母表顺序排列。不能把%%j替换成%%k,因为i的后面是j,不是k。
所以结果是:
第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列
使用find 命令查找指定的字符串
@Echo Off
for /f "delims=" %%i in ('type a.txt^|find "疑似"') do (echo %%i)
Pause