bat学习笔记

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行第3for /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介绍的非常清楚
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值