1.基本的配置
@echo off
color 8f
set /a num=0
echo %num%
pause
第一行是指关闭cmd的回显,也就是说执行某段代码时不会在cmd窗口显示这段代码;
第二行配置窗口颜色,可以用help color获取不同颜色的代码;
第三行是指将0赋给num变量
第四行是指显示num的值,在bat中使用变量需加上%或!在变量两边
第五行 暂停,按任意键继续
2.关于errorlevel
errorlevel是bat提供的一个变量,它用来检测上一句的代码是否执行成功,成功则值为0,失败则为非零数,一般用%errorlevel%或!errorlevel!获取值,例如:
set /a num=0
echo %errorlevel%
则输出结果为0,表示上一句变量赋值成功。
3.关于setlocal EnableDelayedExpansion
setlocal EnableDelayedExpansion
systeminfo>>sitemp.txt
find "Windows 7" "sitemp.txt"
if !errorlevel!==0 (
find "X86-based PC" "sitemp.txt"
if !errorlevel!==0 (
set slist=win7x86list
set /a bit=0
) else (
set slist=win7x64list
set /a bit=1
)
) else (
find "X86-based PC" "sitemp.txt"
if !errorlevel!==0 (
set slist=win10x86list
set /a bit=0
) else (
set slist=win10x64list
set /a bit=1
)
)
del sitemp.txt
如果不开启变量延迟,则变量errorlevel的值会一直为第一次得到的值;值得注意的是,在开启变量延迟后,变量前后需用感叹号!括起来,而不能用%;开启变量延迟的前提下,想要输出感叹号,需要以^^!形式才能输出,例如:
setlocal EnableDelayedExpansion
echo ^^!
这样才能正常显示!
4.find和findstr
要想把查找的成功与否的结果作为一个判断条件,一般采用find命令,因为find命令可以返回参数给!errorlevel!,找到则!errorlevel!值为0,反之不为0,代码举例见3.
5.输出指定内容到文件
//123写入test.txt
echo 123>>test.txt
//特殊字符的写入
//()写入test.txt
echo ^(^)>>test.txt
//变量写入,写%a%到test.txt
echo %%a%%>>test.txt
//>>写到test.txt
echo ^>^> >>test.txt
//多行同时写入到test.txt
( echo 1
echo 2
echo 3)>>test.txt
//if else写入,注意else需和上一句命令在同一行,否则写入错误
( echo if xxxx ^(
echo xxxx ^) else ^(
echo xxxxx ^) )>>test.txt
6.常用命令
//copy
copy 1.txt 2.txt 复制1.txt到2.txt
copy 1.txt 2.txt //强制覆盖
copy 1.txt C:\bat //复制1.txt到指定文件夹
//第二个参数是已有文件夹时,move命令类似于剪切;第二个参数不是已有文件夹时,move命令类似于 剪切+重命名---【注意】网上说move第二个参数不能是文件,实践证明是错的
move 1.txt 2.txt //执行结果是生成2.txt,内容和1.txt相同
move 1.txt C:\bat //将1.txt剪切到指定目录
//del只能删除文件或文件夹下的所有文件,不能删除文件夹及子文件夹
del 1.txt
//rd 删除目录
rd folder //folder为空才可删除
rd /s folder //删除folder及子目录所有文件,需要确认操作
rd /s /q folder //删除folder及子目录所有文件,无需确认
7.常用操作
//导出注册表操作
reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall uninstall.reg
//获取进程列表的映像名称
wmic process get name
8.if else
//完整版
if xxx ( //注意:括号前有空格
command
) else (
command
)
9.for循环
FOR这条命令基本上都被用来处理文本
/D
FOR /D %%variable IN (set) DO command
主要用于目录搜索,不会搜索文件
/R
递归
进入根目录树 [Drive:]Path,在树的每个目录中执行 for 语句。如果在 /R 后没有指定目录,则认为是当前目录。
@echo off
for /r c:/ %%i in (*.exe) do @echo %%i
pause
执行后把C盘根目录,和每个目录的子目录下面全部
的EXE文件都列出来
/F
在批处理中使用的最多,主要用来处理文件和一些命令的输出结果,用法如下:
格式:
FOR /F [“options”] %%i IN (file) DO command
FOR /F [“options”] %%i IN (“string”) DO command
FOR /F [“options”] %%i IN (‘command’) DO command
FOR /F %%i IN (file) DO command
按照每一行分成一个一个的元素
//举例
//假如文件a.txt中有如下内容:
第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列
for /f %%i in (a.txt) do echo %%i
//参数/f,所以for会先打开a.txt,然后读出a.txt里面的所有内容,把它作为一个集合,并且以每一行作为一个元素,所以会产生这样的集合,
{“第1行第1列 第1行第2列 第1行第3列”, //第一个元素
“第2行第1列 第2行第2列 第2行第3列”, //第二个元素
“第3行第1列 第3行第2列 第3行第3列”} //第三个元素
for /f %%i in (a.txt) do echo %%i //这个会显示a.txt里面的内容,因为/f的作用,会读出a.txt中
的内容。
for %%i in (a.txt) do echo %%i //而这个只会显示a.txt这个名字,并不会读取其中的内容。
for /f "delims= " %%i in (a.txt) do echo %%i
显示的结果是:
第1行第1列
第2行第1列
第3行第1列
"delims= "后面有一个空格,意思是将每个元素以空格分割,默认是只取分割之后的第一个元素。
for /f "tokens=2 delims= " %%i in (a.txt) do echo %%i
执行结果:
第1行第2列
第2行第2列
第3行第2列
如果要显示第三列,那就换成tokens=3。
同时tokens支持通配符*,以及限定范围。
如果要显示第二列和第三列,则换成tokens=2,3或tokens=2-3,如果还有更多的则为:tokens=2-10之类的。
此时的命令为:
for /f "tokens=2,3 delims= " %%i in (a.txt) do echo %%i %%j
怎么多出一个%%j?
这是因为你的tokens后面要取每一行的两列,用%%i来替换第二列,用%%j来替换第三列。
并且必须是按照英文字母顺序排列的,%%j不能换成%%k,因为i后面是j
执行结果为:
第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列
对以通配符*,就是把这一行全部或者这一行的剩余部分当作一个元素了。
比如:
for /f "tokens=* delims= " %%i in (a.txt) do echo %%i
执行结果为:
第1行第1列 第1行第2列 第1行第3列
第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列
其实就跟for /f %%i in (a.txt) do echo %%i的执行结果是一样的。
再如:
for /f "tokens=2,* delims= " %%i in (a.txt) do echo %%i %%j
执行结果为:
第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列
用%%i代替第二列,用%%j代替剩余的所有。
skip就是要忽略文件的前多少行,而eol用来指定当一行以什么符号开始时,就忽略它。
比如:
for /f "skip=2 tokens=*" %%i in (a.txt) do echo %%i
结果为:
第3行第1列 第3行第2列 第3行第3列
用skip来告诉for跳过前两行。
如果不加tokens=*的话,执行结果为:
第3行第1列
当a.txt内容变成:
.第1行第1列 第1行第2列 第1行第3列
.第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列
执行
for /f "eol=. tokens=*" %%i in (a.txt) do echo %%i
结果是:
第3行第1列 第3行第2列 第3行第3列
用eol来告诉for忽略以“.”开头的行。
同样也必须加tokens=*,否则只会显示“第3行第1列”
//for循环内容参考了http://blog.csdn.net/jeefchen/article/details/5663822,这篇文字对for介绍的非常清楚