这里写目录标题
#dos的特殊符号
1、@: 执行本行命令时,命令内容在cmd中不显示
echo off:关闭所有命令显示
2、%: 批处理变量引导符
%a FOR循环时用,CMD直接执行使用
%%a FOR循环时用,BAT脚本中使用
%a% 调用普通变量
!a! 普通变量
3、>、<、>>、<< 重定向符号
1)> 重定向符号,且覆盖文件
echo 123> 1.txt # 默认多一行空行
2)>> 重定向符号,追加文件内容
echo 456>> 1.txt # 默认多一行空行
3)< 重定向符号,反向输入命令
echo 2005-05-01> temp.txt
date < temp.txt #这样就可以不等待输入直接修改当前日期
4)>&, 将一个句柄的输出写入到另一个句柄的输入中。
5)<&, 刚好和>&相反,从一个句柄读取输入并将其写入到另一个句柄输出中
6)1>nul 表示禁止输出正确的信息
2>nul 表示禁止输出错误信息。
句柄 0:标准输入 stdin,键盘输入
句柄 1:标准输出 stdout,输出到命令提示符窗口(console,代码为 CON)
句柄 2:标准错误 stderr,输出到命令提示符窗口(console,代码为 CON)
其中的 stdin 可被<重定向,stdout 可被>、>>重定向
4、管道符号: |、||
| :将第一条命令的结果作为第二条命令的参数来使用
格式: 第一条命令 | 第二条命令 [ | 第三条命令… ]
|| :仅当一条命令失败后才执行第二条命令
格式:第一条命令 || 第二条命令 [ || 第三条命令… ]
查看d盘目录的txt文件:dir d:\|find “txt”
5、组合命令: &、&&
&:按顺序执行,前一个命令失败了,不影响后面命令执行
语法:第一条命令 & 第二条命令 [ & 第三条命令… ]
&&:按顺序执行,前一个命令失败了,后面命令不会执行
语法:第一条命令 && 第二条命令 [ && 第三条命令… ]
6、命令执行: 分号;
命令相同时,可以将不同目标用;分隔
如执行过程中发生错误,返回错误报告,但程序仍会执行
dir d: ; dir e:
7、转义字符: ^
echo 123^> 1.txt
8、字符串界定符: 双引号"
9、逗号,
逗号相当于空格
dir,d:
10、括号()
小括号在批处理编程中有特殊的作用,左右括号必须成对使用
括号中可以包括多行命令,这些命令将被 看成一个整体,视为一条命令行
echo 1 & echo 2 & echo 3
等同于
(
echo 1
echo 2
echo 3
)
11、设备文件名:
nul:空设备,不显示结果(显示器上)
prn:打印机
con:显示器
12、编码: chcp
chcp 65001 #改变代码页,UTF-8的代码页为65001、GBK–936
13、批处理中可能会见到的其它特殊标记符
CR(0D) 命令行结束符
Escape(1B) ANSI 转义字符引导符
Space(20) 常用的参数界定符
Tab(09) ; = 不常用的参数界定符
- COPY 命令文件连接符
- ? 文件通配符
/ 参数开关引导符
: 批处理标签引导符
for /f
提取文本信息,则是for /f的拿手好戏:读取文件内容;提取某几行字符;截取某个字符片段;对提取到的内容再切分、打乱、杂糅……只要你所能想到的花样,for /f 都会想方设法帮你办到,因为,for /f 就是被设计成专门用于解析文本的
1、普通用法:
两个小案例:把test.bat、test.txt放在同目录
test.txt:
无论:是文件、窗体、还是控件,在所有的非机器语言看来。
无外乎都:是形如"c:test.txt"、"CWnd"之类的文本信息
都只有:转化为具有一定格式的文本信息,方可被代码识别、操控
test.bat:
@echo off
chcp 65001 #改变代码页,UTF-8的代码页为65001、GBK--936
for /f %%i in (test.txt) do echo %%i # 打印text.txt的内容
pause
test2.bat:
@echo off
chcp 65001
for /f %%i in (test.txt) do echo %%i&pause # 一行行打印,每次需要点击确认
pause
2、切分字符串的利器:“delims=[符号列表]”
以逗号作为被处理的字符串的分隔符号,换句话说 只显示每行的逗号前的内容
@echo off
chcp 65001
for /f "delims=, " %%i in (test.txt) do echo %%i # 默认是空格或回车
pause
delims指定的是符号列表,所以可以指定多个分隔符号。
- 多个符号挨着写
- 每行存在多个指定符号的,分隔成多份,但for /f只会提取第一份的内容
- 不存在指定符号的,不进行分割
@echo off
for /f "delims=、," %%i in (test.txt) do echo %%i
pause
3、定点提取: tokens=
for /f 只能提取到第一份内容,有局限性,如果要提取其他份的内容呢,那么就需要用到tokens
- 一般跟数字,选择第几份的内容
- 选取多份内容时,数字之间用逗号相连
test2.txt
人生为棋,我愿为卒,行动虽慢,可谁又曾看见我后退一步
获取第2份内容:
@echo off
chcp 65001
for /f "delims=, tokens=2" %%i in (test2.txt) do echo %%i
pause
获取多份内容试试:
@echo off
chcp 65001
for /f "delims=, tokens=2,3" %%i in (test2.txt) do echo %%i
pause
结果如何呢,还是只有第2份内容,原因是选择第2、3份的内容,但却没有打印出来
只需要在%%i 后面再加一个变量即可,如%%j
如果需要更多个份数呢?当然是在后面添加更多的对应的变量
@echo off
chcp 65001
for /f "delims=, tokens=2,3" %%i in (test2.txt) do echo %%i %%j
pause
数字还可以用-进行多个选择
@echo off
chcp 65001
for /f "delims=, tokens=1,3-4" %%i in (test2.txt) do echo %%i %%j %%k %%l
pause
也可以用*表示后面的所有份数
从结果可以看出,*号只使用1个变量(有两个变量未使用,打印了出来)
@echo off
chcp 65001
for /f "delims=, tokens=2,*" %%i in (test2.txt) do echo %%i %%j %%k %%l
pause
4、跳过无关内容: skip=n(行数)
全文并不是都需要的,为了提高文本处理的效率,for /f 允许跳过无用行
从N+1行开始处理
N是正整数
还是拿test.txt举例
@echo off
chcp 65001
for /f "skip=2" %%i in (test.txt) do echo %%i %%j %%k %%l
pause
5、忽略以指定字符打头的行: eol=
- 指定忽略以什么开头的内容,默认是空格或回车
- eol与delims冲突时,以eol为准
- 行中出现指定符号,不受影响
这次使用test3.txt
君不见黄河之水天上来,奔流到海不复回
君不见高堂明镜悲白发,朝如青丝暮成雪
;人生得意须尽欢,莫使金樽空对月
天生我材必有用;千金散尽还复来
烹羊宰牛且为乐;会须一饮三百杯
1)默认空格或回车(没实现)
即使没有这个参数,默认也是去空格和空行的
2)eol与delims冲突时,以eol为准
@echo off
chcp 65001
for /f "delims=, eol=;" %%i in (test3.txt) do echo %%i %%j %%k %%l
pause
3)开头是;号的被忽略了,而行中有;号的不受影响
@echo off
chcp 65001
for /f "eol=;" %%i in (test3.txt) do echo %%i %%j %%k %%l
pause
6、for /f 格式句式
1、for /f %%i in (文件名) do (……)
2、for /f %%i in ('命令语句') do (……)
3、for /f %%i in ("字符串") do (……)
4、for /f "usebackq" %%i in ("文件名") do (……)
5、for /f "usebackq" %%i in (`命令语句`) do (……)
6、for /f "usebackq" %%i in ('字符串') do (……)
1)第一种很好理解,就是上述举例子:for /f %%i in (test.txt) do echo %%i;
2)读取(遍历)的内容是执行命令的结果时,必须用单引号包裹
for /f %%i in (‘dir /a-d /b *.txt’) do echo %%i
3)字符串用双引号
for /f “delims=. tokens=1-3” %%i in (“www.baidu.com”) do echo %%i-%%j-%%k
4)当使用usebackq时,符号发生变化
结果赋值给变量
@echo off
for /f %%i in ('echo "helloworld"') do set var=%%i
echo %var%
pause