分享知识 传递快乐
REM 和 :: 命令
常用注释方式有两种:REM 和 ::(双英文冒号)。
- REM为注释命令,一般用来给程序加上注解,该命令后的内容不被执行,但能回显。
- :: (双英文冒号)也可以起到rem 的注释作用,而且更简洁有效,::后的字符行在执行时不会回显。
: (冒号)命令
任何以单冒号:开头的字符行,在批处理中都被视作标号,而直接忽略其后的所有内容。
- 有效标号:(:)冒号后紧跟一个以字母数字开头的字符串,goto语句可以识别。
- 无效标号:(:)冒号后紧跟一个非字母数字的一个特殊符号,goto无法识别的标号,可以起到注释作用,所以 :: 常被用作注释符号,其实 :+ 也可起注释作用。
@ 命令
@字符放在命令前将关闭该命令回显,无论此时echo是否为打开状态。
ECHO 命令
输出信息。
1)打开回显或关闭回显功能
格式:
echo [{ on|off }]
如果想关闭“ECHO OFF”命令行自身的显示,则需要在该命令行前加上“@”,如:
@echo off
2)输出信息
格式:echo 信息内容
3)输出空行,即相当于输入一个回车
格式:echo.
值得注意的是命令行中的“.”要紧跟在ECHO后面中间不能有空格,否则“.”将被当作提示信息输出到屏幕。另外“.”可以用,:;”/[\]+等任一符号替代。
命令ECHO.输出的回车,经DOS管道转向可以作为其它命令的输入,比如echo.|time即相当于在TIME命令执行后给出一个回车。所以执行时系统会在显示当前时间后,自动返回到DOS提示符状态。
4)建立新文件或增加文件内容
格式:
echo 文件内容>文件名
echo 文件内容>>文件名
例如:
c:>echo @echo off>autoexec.bat建立自动批处理文件
c:>echo c:\cpav\bootsafe>>autoexec.bat向自动批处理文件中追加内容
TITLE 命令
设置cmd窗口的标题。
MODE 命令
- 串行口: MODE COMm[:] [BAUD=b] [PARITY=p] [DATA=d] [STOP=s] [to=on|off] [xon=on|off] [odsr=on|off] [octs=on|off] [dtr=on|off|hs] [rts=on|off|hs|tg] [idsr=on|off]
- 设备状态: MODE [device] [/STATUS]
- 打印重定向: MODE LPTn[:]=COMm[:]
- 选定代码页: MODE CON[:] CP SELECT=yyy
- 代码页状态: MODE CON[:] CP [/STATUS]
- 显示模式: MODE CON[:] [COLS=c] [LINES=n]
- 击键率: MODE CON[:] [RATE=r DELAY=d]
还可以设置窗口大小:
mode con cols=100 lines=40
说明:此命令设置DOS窗口大小:40行,100列
COLOR 命令
设置命令窗口的颜色,dos的颜色属性设置是由两个十六进制数字指定。
背景色:0=黑、1=蓝、2=绿、3=浅绿、4=红、5=紫、6=黄、7=白
前景色:8=灰、9=淡蓝、A=淡绿、B=淡浅绿、C=淡红、D=淡紫、E=淡黄、F=亮白
设置字体与背景颜色
color 0a
SET 命令
用于设置变量或对变量赋值。
格式:
set PATH_HOME=C:\Users\Administrator
参数:
- /A:命令行开关指定等号右边的字符串为被评估的数字表达式。
- /P:命令行开关允许将变量数值设成用户输入的一行输入。
1)提示用户输入
@echo off
set /p num=请输入要ping的次数:
ping /n %num% 127.0.0.1
pause.
2)提示用户输入并计算输入值
@echo off
set /p b=输入一个数字:
echo %b%
set /a a=2*%b%
echo %b%+%b%=%a%
pause>nul
set /a 执行数学计算
set /p 提示用户输入
%% 命令
%%处理变量引导符。
格式:
echo %PATH_HOME%
输出结果:
C:\Users\Administrator
IF 命令
用于条件判断。
格式:
if <条件> (<方法体>) [else if <条件> (<方法体>)][else (<方法体>)]
1)判断两个字符串是否相等
set param=1
if %param% EQU "1" (
echo true
)
2)验证文件是否存在
::存在
if exist "C:\a.txt" (
echo file is find!
) else (
echo file is not found!
)
::不存在
if not exist "C:\a.txt" (
echo file is not found!
)
3)带参数验证
set param=abc
if /I "%param%" EQU "ABC" (
echo true
)
参数:
- if /i:忽略大小写。
比较参数如下:
- EQU - 等于
- NEQ - 不等于
- LSS - 小于
- LEQ - 小于或等于
- GTR - 大于
- GEQ - 大于或等于
RD 命令
删除目录。
格式:
rd [/s] [/q] [drive:]path
参数:
- /S 表示删除该目录下所有遍历的子目录和文件
- /Q 删除目录时不提示确认,直接删除
1)删除目录
rd /s /q d:\apache\tomcat\apache-tomcat-7.0.67\wtpwebapps
MD 命令
创建文件夹。
格式:
md [路径\]目录
1)创建单个文件夹
md e:\test
在D盘下建立一个名为test的文件夹。
2)创建缺省路径目录
md test
这里为缺省路径,在当前目录下创建一个名为test的文件夹。
3)创建含有空格或是特殊符号的文件夹
md "e:\my test"
在E盘下建立一个名为my test的文件夹。对于新建的文件夹名称中包含有空格或是特殊符号的,一定要用双引号“”把文件夹名括起来。
4)同时创建多个目录
md d:\test e:\test\aaa test
5)创建多级目录
md d:\a\b\c
REN 命令
重命名文件(夹)。
格式:
ren [drive:][path]filename1 filename2.
1)单个文件的重命名
ren d:\test.txt test.bat
2)缺省路径文件的重命名
ren test.txt test.bat
缺省路径情况下,把当前目录下的123.txt重命名为456.bat。
3)批量重命名
ren *.bat *.txt
把后缀名为bat的文件批量更改为txt后缀后的文件。
通过*和?这两个通配符来批量重命名。*表示任意多个字符,?表示一个字符。
MOVE 命令
移动文件并重命名文件和目录。
格式:
move [/y | /-y] [drive:][path]filename1[,...] destination
move [/y | /-y] [drive:][path]dirname1 dirname2
参数:
- [drive:][path]filename1:指定您想移动的文件位置和名称。
- destination:指定文件的新位置。目标可包含一个驱动器号和冒号、一个目录名或组合。如果只移动一个文件并在移动时将其重命名,您还可以包括文件名。
- [drive:][path]dirname1:指定要重命名的目录。
- dirname2:指定目录的新名称。
- /Y:取消确认改写一个现有目标文件的提示。
- /-Y:对确认改写一个现有目标文件发出提示。
1)移动文件
代码1:
move d:\test d:\test2
如果把文件夹test移到文件夹test2内。
代码2:
move test.txt test2
把当前目录下的test.txt移动到当前文件夹test2内。这里都使用了相对路径,缺省路径情况下默认为当前目录。
代码3:
move test.txt e:\test2
把当前目录下的test.txt移动到e:\test2目录下。
想要移动的文件(夹)可以使用相对路径,也可以使用绝对路径,缺省路径情况下默认为当前目录。
Destination 只能是目录路径, 可以使用相对路径,也可以使用绝对路径,缺省路径情况下默认为当前目录。
2)重命名文件(夹)
代码1:
move d:\test d:\test2
这里要注意一下,如果目标文件夹test2不存在,则把test移到d:\下,并把自身名称更改为test2。利用这一特性,move命令具备重命名功能。
代码2:
move d:\test.txt d:\abc\test2.txt
如果 test2.txt存在,系统将会提示你:改写 D:\test2.txt 吗? (Yes/No/All):
当你输入Y后则test.txt会覆盖test2.txt。如果test2.txt不存在,则把test.txt移到d:\abc目录下,并重命名为test2.txt。
代码3:
move /y test.txt test2.txt
如果test.txt和test2.txt都存在,通过/y参数后,系统不会提示你,而直接把test.txt覆盖test2.txt。
代码4:
move test.txt e:\abc\test2.txt
对于跨区移动,如果test2.txt存在会提示:文件存在。命令不会执行;如果test2.txt不存在,则把test.txt移到e:\abc目录下,并重命名为test2.txt。
GOTO 命令
跳转,用:XX构筑一个标记,用goto XX跳转到XX标记处。
@echo off
:MENU
echo.
echo. [1] 测试1
echo. [2] 测试2
echo. [0] 退出
echo.
echo.请输入选择的序号:
set /p ID=
if "%id%"=="1" goto show1
if "%id%"=="2" goto show2
if "%id%"=="0" exit
PAUSE
:show1
echo AAAAAAAAAAAAAA
echo BBBBBBBBBBBBBB
goto MENU
:show2
echo CCCCCCCCCCCCCC
echo DDDDDDDDDDDDDD
goto MENU
当输入1的时候,会跳转到show1代码块。
注意代码块中有个 “goto MENU” 加上这个是为了不让输出后关闭窗口,而是继续执行 “MENU” 代码信息。
CALL 命令
在批处理的过程中调用另一个批处理,当另一个批处理执行完了后回调自身。
@echo off
:MENU
echo.
echo. [1] 测试1
echo. [2] 测试2
echo. [0] 退出
echo.
echo.请输入选择的序号:
set /p ID=
if "%id%"=="1" goto show1
if "%id%"=="2" goto show2
if "%id%"=="0" exit
PAUSE
:show1
call :show11
call :show12
goto MENU
:show2
call :show21
call :show22
goto MENU
:show11
echo AAA-show11
goto :eof
:show12
echo BBB-show12
goto :eof
:show21
echo CCC-show21
goto :eof
:show22
echo DDD-show22
goto :eof
输出结果:
[1] 测试1
[2] 测试2
[0] 退出
请输入选择的序号:
1
AAA-show11
BBB-show12
[1] 测试1
[2] 测试2
[0] 退出
请输入选择的序号:
注意:如果不加 goto:eof 命令,会继续往下执行。
call语句与goto语句区别:
- goto过去,执行完goto的语句,不会再跳转回来;
- call过去,再加上goto:eof,会跳转回执行call语句的地方继续执行下面的语句;
- 使用call语句时需要注意,执行完跳转的语句之后,记得加上goto,不然将执行2遍跳转语句。
PAUSE 命令
暂停。
ERRORLEVEL 命令
程序返回码。
bat脚本中常用%errorlevel%表达上一条命令的返回值,用于判断命令执行状态,命令运行结束后可以用echo %errorlevel%查看返回码,用于判断刚才的命令是否执行成功。
1)判断一条命令执行状态
::查找是否有chrome.exe线程
tasklist|find /i "chrome.exe">nul
echo %errorlevel%
if %errorlevel% EQU 0 (
echo yes
) else (
echo no
)
一般上一条命令的执行结果返回的值只有两个,0表示”成功”、1表示”失败”,实际上,errorlevel 返回值可以在0~255 之间。
2)判断多条命令执行状态
@echo off
setlocal enabledelayedexpansion
tasklist|find /i "360tray.exe">nul
echo 360:!errorlevel!
if !errorlevel! EQU 0 (
tasklist|find /i "chrome.exe">nul
echo chrome:!errorlevel!
if !errorlevel! EQU 0 (
::这个设置为找不到
tasklist|find /i "We2Chat.exe">nul
echo We2Chat:!errorlevel!
if !errorlevel! EQU 0 (
echo ........
) else (
echo We2Chat:no
)
) else (
echo chrome:no
)
) else (
echo 360:no
)
pause>nul
输出结果:
360:0
chrome:0
We2Chat:1
We2Chat:no
在for循环中或if语句中多条命令都需要获取返回值等情况下,用errorlevel会显得无效,从第二条命令开始errorlevel的值都不会变。此处涉及批处理中的变量延迟问题,并不是errorlevel无效,而是对errorlevel变量的引用采用的是没开启变量延迟情况下的百分号%。
setlocal EnableDelayedExpansion:开启变量延迟的设置,即延迟环境变量扩展,告诉解释器在遇到复合语句的时候,不要将其作为一条语句同时处理,而是一条一条地去解释。但是这时如果仍然用百分号%来引用变量是不起作用的,必须用感叹号!,如!errorlevel!。
EXIT 命令
退出cmd。
::验证文件是否存在
if not exist "d:/test.txt" (
echo 缺少文件!
pause
exit
)
学过编程的可以知道,exit类似于return。
START 命令
批处理中调用外部程序的命令(该外部程序在新窗口中运行,批处理程序继续往下执行,不理会外部程序的运行状况),如果直接运行外部程序则必须等外部程序完成后才继续执行剩下的指令
1)调用图形界面打开D盘
start explorer d:\
2)打开多个微信窗口
start D:\WeChat\WeChat.exe&D:\WeChat\WeChat.exe
NUL 命令
把执行结果定向到空,不返回任何结果。
格式:
'<执行命令>' >nul
1)屏蔽屏幕输出
pause > nul
pause 就是暂停命令,执行时会在命令行窗口显示“请按任意键继续. . .”并等待你按键。
pause > nul的作用是同样的,区别是不显示“请按任意键继续. . .”这些字,nul相当于空文件,把这些文字隐去了。同样是等待你按键。
2)屏蔽一切屏幕输出
del abc.txt>nul 2>nul
这个">nul 2>nul"可以屏蔽一切屏幕的输出。如果使用"[命令]>nul"就可以屏蔽命令在屏幕上的输出,但是有的命令执行会出错,即使用了">nul"也不能屏蔽命令产生的信息,所以就在后面加" 2>nul"这个,就是"[命令]>nul+空格+2>nul",这样,不管命令是否正确的运行,都不会在屏幕看到这个命令所产生的屏幕显示了。
FIND 命令
在文件中搜索字符串。
格式:
find [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]
参数:
- /V:显示所有未包含指定字符串的行。
- /C:仅显示包含字符串的行数。
- /N:显示行号。
- /I:搜索字符串时忽略大小写。
- /OFF[LINE]:不要跳过具有脱机属性集的文件。
- "string":指定要搜索的文字串,
- [drive:][path]filename:指定要搜索的文件。
1)查找字符串
find "abc" d:/test.txt
::忽略大小写
find /i "abc" d:/test.txt
2)显示行号
find /n "abc" d:\abc.txt
3)仅显示包含字符串的行数
find /c "abc" d:\abc.txt
4)显示所有未包含指定字符串的行
find /v "abc" d:\abc.txt
这个参数用于找出文件中不包含指定字符串的行。在这里表示查找不包含"abc"字符串的行。
注意:find命令中要查找的字符串一字要用双引号" "括起来。
FINDSTR 命令
在文件中寻找字符串。
格式:
findstr [/b] [/e] [/l] [/r] [/s] [/i] [/x] [/v] [/n] [/m] [/o] [/f:file] [/c:string] [/g:file] [/d:dir list] [/a:color attributes] [/off[line]] strings [[drive:][path]filename[ ...]]
参数:
- /B:在一行的开始配对模式。
- /E:在一行的结尾配对模式。
- /L:按字使用搜索字符串。
- /R:将搜索字符串作为一般表达式使用。
- /S:在当前目录和所有子目录中搜索匹配文件。
- /I: 指定搜索不分大小写。
- /X:打印完全匹配的行。
- /V:只打印不包含匹配的行。
- /N:在匹配的每行前打印行数。
- /M:如果文件含有匹配项,只打印其文件名。
- /O:在每个匹配行前打印字符偏移量。
- /P:忽略有不可打印字符的文件。
- /OFF[LINE]:不跳过带有脱机属性集的文件。
- /A:attr:指定有十六进位数字的颜色属性。请见 "color /?"
- /F:file:从指定文件读文件列表 (/ 代表控制台)。
- /C:string:使用指定字符串作为文字搜索字符串。
- /G:file:从指定的文件获得搜索字符串。 (/ 代表控制台)。
- /D:dir:查找以分号为分隔符的目录列表
- strings:要查找的文字。
- [drive:][path]filename:指定要查找的文件。
findstr 命令中正则表达式的用法规则
- .:通配符: 任何字符
- *:重复: 以前字符或类别出现零或零以上次数
- ^:行位置: 行的开始
- $:行位置: 行的终点
- [class]:字符类别: 任何在字符集中的字符
- [^class]:补字符类别: 任何不在字符集中的字符
- [x-y]:范围: 在指定范围内的任何字符
- \x:Escape: 元字符 x 的文字用法
- \<xyz:字位置: 字的开始
- xyz\>:字位置: 字的结束
1)基本格式:
findstr " strings " [drive:][path]filename
1.1)查找字符串
findstr "abc" d:/test.txt
::忽略大小写
findstr /i "abc" d:/test.txt
1.2)查找的多个字符串
findstr /r "wechat qq" test.txt
在test.txt中查找包含有 “wechat”或“qq”的行,查找的多个字符串间用空格隔格开。
/R:将搜索字符串作为正则表达式使用。参数/R 强调以正则表达式规则来解读字符串。
1.3)在当前目录和所有子目录中搜索
findstr /s /i "wechat" *.txt
在当前目录和所有子目录中的.txt文件中搜索字符串"wechat"(不区分字母大小写)。
1.4)指定字符串作为文字搜索字符串
findstr /c:"tencent wechat" test.txt
在test.txt中查找包含有 “tencent wechat”这几个字符的行。注意,这里“tencent wechat”是一整体的。
注意:
- 在使用 findstr "腾讯 微信" test.txt 的时候,并不能查找到内容,但是,加上开关 /i 或者 /r 之后就正确无误了,可能是在查找多个纯中文字符串的时候的一个bug吧;单个的纯中文字符串没有任何问题。
- 使用空格隔开搜索字符串,必须要有参数 /C 前缀。例:
::在文件 test.txt 中寻找 "hello" 或 "there"
findstr "hello there" test.txt
::在文件 test.txt 寻找 "hello there"
findstr /c:"hello there" test.txt
2)通配符和重复符规则
通配符和重复符规则,即 . 和 *。
通配符:即一个句点,代表任何一个字符,而且只能是一个,包括字母、数字、半角符号还有空格。
重复符:即型号* 代表前面字母的出现次数(出现次数从0到多次,0表示没有)。
2.1)查找任意字符,包括空行
findstr .* test1.txt
或
findstr ".*" test1.txt
2.2)查找指定字符串开关的字符串
findstr ac* test.txt
findstr abcd* test.txt
输出结果:
a
ac
acc
addc
ab
abc
abdc
abde
在文件 test.txt 中查找出现一个“a”字符串,以及a后面出现过0次或者任意次c的字符行。
在文件test.txt中查找出现一个“ab”字符串,以及ab后面出现过0次或者任意次c的字符行。
3)行首、行尾符规则
即 ^ 和 $。
3.1)查找指定行首的字符串
findstr "^test" test.txt
输出结果:
test main
testapp
3.2)查找指定行首行尾的行
findstr "^test$" test.txt
在文件test.txt中查找行首为test,且行尾也为test的行,即test独自一行。
4)字符集规则
字符集规则,即[class]。
- 表示含有集里的任意一个字符的即匹配。
- 该字符集里的元素可以是字母和数字和一般的半角字符,如:}{ ,.][等,但双引号"不被识别。不能是汉字, 汉字不被正确解释(汉字不是ASCII码)。
如果在字符集内插入通配符和重复符号,即"[.*]"将会把. 和 *视为普通字符,没有通配和重复的含义。
4.1)查找数字0-9的任意行
findstr "[0-9]" test.txt
输出结果:
1abcd
3 ab acd
4.2)查找包括任意字母的行
findstr "[a-zA-Z]" test.txt
4.3)查找包括其中任意一字母的行
findstr "[abcezy]" 2.txt
4.4)查找指定字母范围的行
findstr "[a-gq-t]" test.txt
在文件test.txt中查找小写字符a到g 或q到t的任意一字母的行。
4.5)匹配任意字母行
findstr "A[abc][123]Y" test.txt
在文件test.txt中查找可以匹配 AaY , AbcY, A234Y的行。
5)减法规则
5.1)过虑纯数字的行
findstr "[^0-9]" test.txt
注意:纯数字的行不能有空格,不论行首行尾或者是行中都不能有空格,否则过滤失败!
5.2)过虑纯字母的行
findstr "[^a-z]" test.txt
注意:纯字母的行不能有空格,不论行首行尾或者是行中都不能有空格,否则过滤失败!
5.3)过滤仅含有指定字母组成的纯字母字符串的行
findstr "[^abc]" test.txt
注意:仅含有由abc三个字母组成的纯字母字符串的行不能有空格,不论行首行尾或者是行中都不能有空格,否则过滤失败!
6)单词前缀后缀定位规则
该规则是匹配类似单个英文单词的,即\<xyz和xyz\>
该xyz可以是英文单词或数字,但不适用于汉字。符号 \ 理解为转义符,化解小于号和大于号的重定向命令含义。
6.1)查找指定前缀的字符串的行
findstr "\<abc" test.txt
6.2)查找指定后缀的字符串的行
findstr "abc\>" test.txt
6.3)精确查找
findstr "\<end\> test.txt
TASKLIST 命令
查看系统进程。
格式:
tasklist [/s system [/u username [/p [password]]]] [/m [module] | /svc | /v] [/fi filter] [/fo format] [/nh]
参数列表:
- /S system:指定连接到的远程系统(IP)。
- /U [domain\]user:指定使用哪个用户执行这个命令。
- /P [password]:为指定的用户指定密码。
- /M [module]:列出调用指定的 DLL 模块的所有进程。如果没有指定模块名,显示每个进程加载的所有模块。
- /SVC:显示每个进程中的服务。
- /V:指定要显示详述信息。
- /FI filter:显示一系列符合筛选器指定的进程。
- /FO format:指定输出格式,有效值: "TABLE"、"LIST"、"CSV"。
- /NH:指定栏标头不应该在输出中显示。只对 "TABLE" 和 "CSV" 格式有效。
1)查看本机所有进程
tasklist
在“命令提示符”中输入Tasklist 命令即可显示本机的所有进程,显示结果由5部分组成:图像名(进程名)、PID、会话名、会话#和内存使用。
2)查找某一进程
tasklist|find /i "nginx.exe">nul
tasklist查找所有进程,让find找出nginx.exe进程。
3)根据pid查询指定进程
tasklist|findstr xxxx
TASKKILL 命令
终止指定进程。
格式:
taskkill [/s system [/u username [/p [password]]]] { [/fi filter] [/pid processid | /im imagename] } [/f] [/t]
参数列表:
- /S system:指定要连接到的远程系统。
- /U [domain\]user:指定应该在哪个用户上下文执行这个命令。
- /P [password]:为提供的用户上下文指定密码。如果忽略,提示输入。
- /F:指定要强行终止进程。
- /FI:filter指定筛选进或筛选出查询的的任务。
- /PID:process id指定要终止的进程的PID。
- /IM:image name指定要终止的进程的图像名。通配符 '*'可用来指定所有图像名。
- /T:Tree kill: 终止指定的进程和任何由此启动的子进程。
- /?:显示帮助/用法。
1)根据进程名称结束某一进程
taskkill /F /IM nginx.exe >nul
2)根据进程PID结束某一进程
taskkill /PID xxx
SC 命令
SC 是用于与服务控制管理器和服务进行通信的命令行程序。
格式:
SC [服务器名称] 命令 [选项名称=选项值]
常用参数:
- config 改变一个服务的配置。(长久的)
- EnumDepend 列举服务的从属关系。
- GetDisplayName 获得一个服务的显示名称。
- GetKeyName 获得一个服务的服务键名。
- qc 询问一个服务的配置。
- query 询问一个服务的状态,也可以列举服务的状态类型。
1)查询Winows具体服务配置
sc query MariaDB
服务名不区分大小写。
2)实现模糊查询
sc query state= all | findstr /I "MariaDB"
sc query state= all | find /I "MariaDB"
sc query | find /i "MariaDB"
sc query MariaDB | find /i "STATE">nul
sc query 可以与 findstr/find 实现模糊查询,并且支持正则。
state状态:
- STATE:为服务运行状态
- START_PENDING:启动中
- RUNNING:已启动
- PAUSED:暂停
- STOP_PENDING:停止中
- STOPPED:已停止
3)查询服务PID
sc queryex MariaDB
4)查看window服务的详细配置
sc qc MariaDB
start_type为启动类型:
- DEMAND_START:手动
- AUTO_START:自动
- DISABLED:已禁用
5)设置服务的启动类型
sc config MariaDB start= auto
设置服务的启动类型:
- auto(自动)
- demand (手动)
- disabled(禁用)
注意:SC命令还可以创建、删除、启动、停止服务等。但不推荐sc启动、停止服务操作,因为sc启动服务但不启动依赖;可以使用 “net start/stop 服务名” 代替, 该命令会自动启动或停止相关联的服务。
FOR 命令
格式:
for [参数] %%变量名 in (相关文件或命令) do 执行的命令
注意:
- for、in和do是for语句的关键字,它们三个缺一不可;
- %%I是for语句中对形式变量的引用,即使变量l在do后的语句中没有参与语句的执行,也是必须出现的;
- 在批处理文件中使用for命令时,指定变量请使用 %%variable,而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I。
参数:
- /D:参数只能显示当前目录下的目录名字
- /R:搜索指定路径及所有子目录中与set相符合的所有文件
- /L:该集表示以增量形式从开始到结束的一个数字序列。可以使用负的Step
- /F:使用文件解析来处理命令输出、字符串及文件内容。
1)基本用法
1.1)简单遍历
for %%I in (A,B,C) do echo %%I
输出结果:
A
B
C
for语句的形式变量H,可以换成任意一个变量信息。for语句以逗号为分隔符,把 A,B,C 这个字符串切分成三个元素:A、B和C,由此决定了do后的语句将会被执行3次。
1.2)读取根目录
::显示d盘根目录下的所有目录
for /d %%i in (d:\*) do echo %%i
::显示当前目录下名字只有1-3个字母的目录
for /d %%i in (???) do echo %%i
这个参数主要用于目录搜索,不会搜索文件,/D 参数只能显示当前目录下的目录名字。(只会搜索指定目录下的目录,不会搜索再下一级的目录。)
1.3)搜索指定路径及所有子目录中与set相符的所有文件
::查找j盘下所有以.mp4结尾的文件,包含子目录
for /r j:\ %%i in (*.mp4) do echo %%i
::查找j盘下所有目录,包含子目录
for /r j:\ %%i in (1) do echo %%i
::查找j盘下sudu.pdf存在的目录
for /r j:\ %%i in (sudu.pdf) do if exist %%i echo %%i
此命令会搜索指定路径及所有子目录中与set相符合的所有文件,注意是指定路径及所有子目录。
- set中的文件名如果含有通配符(?或*),则列举/R参数指定的目录及其下面的所用子目录中与set相符合的所有文件,无相符文件的目录则不列举。
- 如果set中为具体文件名,不含通配符,则枚举该目录树(即列举该目录及其下面的所有子目录)(并在后面加上具体的文件名),而不管set中的指定文件是否存在。
1.4)以增量形式从开始到结束
for /l %%i in (1,1,5) do @echo %%i
::输出1 2 3 4 5
for /l %%i in (1,2,10) do @echo %%i
::输出1,3,5,7,9
for /l %%i in (100,-20,1) do @echo %%i
::输出100,80,60,40,20
for /l %%i in (1,1,5) do start cmd
::打开5个CMD窗口
for /l %%i in (1,1,5) do md %%i
::建立从1~5共5个文件夹
for /l %%i in (1,1,5) do rd /q %%i
::删除从1~5共5个文件夹
该命令表示以增量形式从开始到结束的一个数字序列,可以使用负的 Step。
2)高级用法
使用文件解析来处理命令输出、字符串及文件内容
这个参数是最难的,而且参数也最多。“for /f”常用来解析文本,读取字符串。
新建一ANSI编码的bat_test.txt文件,文件内容如下:
1、aaa.txt
2、bbb.txt
3、ccc.mp3
4、ddd.doc
5、eee.txt
2.1)显示全部内容
@echo off
for /f %%i in (bat_test.txt) do echo %%i
pause>nul
输出结果:
1、aaa.txt
2、bbb.txt
3、ccc.mp3
4、ddd.doc
5、eee.txt
如果不使用参数“/f”,运行结果只显示括号里的文字字符“bat_test.txt”,而不能读取文本文件“bat_test.txt”中的内容。可见,“/f”是解析文本字符串的好工具。
2.2)根据指定内容分割(delims)
for /f "delims=、" %%i in (bat_test.txt) do echo %%i
for /f "delims=." %%i in (bat_test.txt) do echo %%i
输出结果:
1
2
3
4
5
1、aaa
2、bbb
3、ccc
4、ddd
5、eee
"delims=、"表示定义顿号“、”为分隔符,并用该分隔符“、”切分文本字符串。字符串就是“歌曲列表.txt”里的内容,也就是文件里的文字和标点符号。
该顿号是原文中就有的。除了顿号“、”,原文中还有减号“-”和点号“.”,因此你也可以用它们来做分隔符。
默认情况下,单纯使用delims而不用tokens时,只显示第一个分隔符前的内容,第一个分隔符和第一个分隔符后面的内容将被忽略。
delims还可以定义多个分隔符,如:“delims=、.”。
2.3)提取单列(tokens)
for /f "tokens=2 delims=、." %%i in (bat_test.txt) do echo %%i
输出结果:
aaa
bbb
ccc
ddd
eee
用delims定义顿号“、”和点号“.”作为分隔符,将原文分成三部分。如“1、aaa.txt”被分割成:
第一部分(第一列):1
第二部分(第二列):aaa
第三部分(第三列):txt
“tokens=2”表示用tokens提取第二列的字符串,即“aaa”。
没有被tokens定义提取的第一列和第三列将被忽略。
2.4)提取多列(tokens)
for /f "tokens=1,3 delims=、." %%i in (bat_test.txt) do echo %%i %%j
输出结果:
1 txt
2 txt
3 mp3
4 doc
5 txt
“tokens=1,3”表示只提取第一列和第三列。
“delims=、.”表示定义顿号和点号为分隔符。
“%%i %%j”对应于“token”后面的列数。有多少列就要有多少个输出变量,并且各变量中的字母存在先后顺序。
2.5)忽略分隔符
for /f "tokens=1-3 delims=、." %%i in (bat_test.txt) do echo %%i %%j %%k
输出结果:
1 aaa txt
2 bbb txt
3 ccc mp3
4 ddd doc
5 eee txt
“tokens=1-3”中的“1-3”表示第一至第三列。
——————————
如有不足请留言指正
相互学习,共同进步