转义和续行符^
1.将批处理文件的特殊符号转义,就像Java和c中的转义字符\
C:\Users\Administrator>echo >
命令语法不正确。
C:\Users\Administrator>echo >>
命令语法不正确。
C:\Users\Administrator>echo &
ECHO 处于打开状态。
C:\Users\Administrator>echo <
命令语法不正确。
C:\Users\Administrator>echo |
命令语法不正确。
C:\Users\Administrator>echo ^>>
命令语法不正确。
C:\Users\Administrator>echo ^>^>
>>
C:\Users\Administrator>echo ^>
>
C:\Users\Administrator>echo ^&
&
C:\Users\Administrator>echo ^|
|
2.bat文件是按行执行命令的,当你一行无法把一条命令写完时,需要用续行符续行。
C:\Users\Administrator>echo hello w^
More? orld
hello world
为什么转义字符放在行尾可以起到续行符的作用呢?原因很简单,因为每行末尾还有一个看不见的符号,即回车符,转义字符位于行尾时就让回车符失效了,从而起到了续行的作用。
下面的介绍还会用到续行符。
comp命令
C:\Users\Administrator>help comp
比较两个文件或两个文件集的内容。
COMP [data1] [data2] [/D] [/A] [/L] [/N=number] [/C] [/OFF[LINE]]
data1 指定要比较的第一个文件的位置和名称。
data2 指定要比较的第二个文件的位置和名称。
/D 以十进制格式显示差异。
/A 以 ASCII 字符显示差异。
/L 显示不同的行数。
/N=number 只比较每个文件中第一个指定的行数。
/C 比较文件时 ASCII 字母不区分大小写。
/OFF[LINE] 不要跳过带有脱机属性集的文件。
要比较文件集,请在 data1 和 data2 参数中使用通配符。
先创建两个文件C:\Users\Administrator\Desktop\testbat.txt和C:\Users\Administrator\Desktop\testbat1.txt。其中前者内容是“abcdefg”,后者内容是“abcd123”。现在可以执行如下命令:
C:\Users\Administrator>comp C:\Users\Administrator\Desktop\testbat.txt C:\Users\Administrator\Desktop\testbat1.txt /l /a
比较 C:\Users\Administrator\Desktop\testbat.txt 和 C:\Users\Administrator\Desktop\testbat1.txt...
在 LINE 1 比较错误
file1= e
file2 = 1
在 LINE 1 比较错误
file1= f
file2 = 2
在 LINE 1 比较错误
file1= g
file2 = 3
是否要比较更多文件 (Y/N)? n
If命令
if命令部分帮助信息
C:\Users\Administrator>help if
执行批处理程序中的条件处理。
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
NOT 指定只有条件为 false 的情况下,Windows 才
应该执行该命令。
ERRORLEVEL number 如果最后运行的程序返回一个等于或大于
指定数字的退出代码,指定条件为 true。
string1==string2 如果指定的文字字符串匹配,指定条件为 true。
EXIST filename 如果指定的文件名存在,指定条件为 true。
command 如果符合条件,指定要执行的命令。如果指定的
条件为 FALSE,命令后可跟 ELSE 命令,该命令将
在 ELSE 关键字之后执行该命令。
ELSE 子句必须出现在同一行上的 IF 之后。例如:
IF EXIST filename. (
del filename.
) ELSE (
echo filename. missing.
)
由于 del 命令需要用新的一行终止,因此以下子句不会有效:
IF EXIST filename. del filename. ELSE echo filename. missing
由于 ELSE 命令必须与 IF 命令的尾端在同一行上,以下子句也
不会有效:
IF EXIST filename. del filename.
ELSE echo filename. missing
如果都放在同一行上,以下子句有效:
IF EXIST filename. (del filename.) ELSE echo filename. missing
如果命令扩展被启用,IF 会如下改变:
IF [/I] string1 compare-op string2 command
IF CMDEXTVERSION number command
IF DEFINED variable command
其中, compare-op 可以是:
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
if 表示将判断是否符合规定的条件,从而决定执行不同的命令。
1)IF [NOT] string1==string2 command
下面是test4_0.cmd内容:
@echo off
echo Hello , here is test4_0.cmd
echo ---------------------------
echo Is the first input args equal "a"?
if %1 == a (
echo Yes ,it is .
) else (
echo No , it is not .
echo It is "%1" .
)
pause
在cmd控制台中运行结果如下:
C:\Users\Administrator>call C:\Users\Administrator\Desktop\test4_0.cmd inputInfoHere
Hello , here is test4_0.cmd
---------------------------
Is the first input args equal "a"?
No , it is not .
It is "inputInfoHere" .
请按任意键继续. . .
2)IF [NOT] EXIST filename command
下面是test4_1.cmd内容:
@echo off
echo Hello , here is test4_1.cmd
echo ---------------------------
echo Startting test4_0.cmd ...
if exist C:\Users\Administrator\Desktop\test4_0.cmd start C:\Users\Administrator\Desktop\test4_0.cmd infohere
echo test4_1.cmd will pause !!
pause
运行上述文件之前需要适当的修改一下,运行的结果:
先弹出一个cmd控制台,其打印如下:
Hello , here is test4_1.cmd
---------------------------
Startting test4_0.cmd ...
test4_1.cmd will pause !!
请按任意键继续. . .
紧跟着弹出另一个cmd控制台,其打印如下:
Hello , here is test4_0.cmd
---------------------------
Is the first input args equal "a"?
No , it is not .
It is "infohere" .
请按任意键继续. . .
这是两个相对独立的运行过程,因为用的是start命令而不是call,具体请参见
bat文件浅析(二)
3)IF [NOT] ERRORLEVEL number command
很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),称为错误码errorlevel或称返回码。
常见的返回码为0、1。通过if errorlevel命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令。运行如下test4_2.cmd文件:
@echo off
comp C:\Users\Administrator\Desktop\testbat.txt C:\Users\Administrator\Desktop\testbat1.txt /l /a
echo %errorlevel%
if errorlevel 1 echo They are not the same .
pause
运行结果:
比较 C:\Users\Administrator\Desktop\testbat.txt 和 C:\Users\Administrator\Desktop\testbat1.txt...
在 LINE 1 比较错误
file1= e
file2 = 1
在 LINE 1 比较错误
file1= f
file2 = 2
在 LINE 1 比较错误
file1= g
file2 = 3
是否要比较更多文件 (Y/N)? n
1
They are not the same .
请按任意键继续. . .
4)ELSE
语法: if条件 (成立时执行的命令) else (不成立时执行的命令)
如果是多个条件,建议适当使用括号把各条件包起来,以免出错。
例: if 1 == 0 ( echo comment1 ) else if 1==0 ( echo comment2 ) else(echo comment3 )
注:如果 else的语句需要换行,if执行的行尾需用“^”连接,并且 if执行的动作需用(括起来),否则报错
例: if 1 == 0 ( echo comment1 ) else if 1==0 ( echo comment2 ) ^
else (echo comment3 )
5) 比较运算符:
EQU - 等于 (一般使用“==”)
NEQ - 不等于 (没有“!=”,改用“ if not 1==1 ”的写法)
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
choice命令
choice 使用此命令可以让用户输入一个字符(用于选择),从而根据用户的选择返回不同的 errorlevel,
C:\Users\Administrator>choice /?
CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]
描述:
该工具允许用户从选择列表选择一个项目并返回所选项目的索引。
参数列表:
/C choices 指定要创建的选项列表。默认列表是 "YN"。
/N 在提示符中隐藏选项列表。提示前面的消息得到显示,选项依旧处于启用状态。
/CS 允许选择分大小写的选项。在默认情况下,这个工具是不分大小写的。
/T timeout 做出默认选择之前,暂停的秒数。可接受的值是从 0到 9999。如果指定了 0,就不会有暂停,默认选项会得到选择。
/D choice 在 nnnn 秒之后指定默认选项。字符必须在用 /C 选项指定的一组选择中; 同时,必须用 /T 指定 nnnn。
/M text 指定提示之前要显示的消息。如果没有指定,工具只显示提示。
/? 显示此帮助消息。
注意:
ERRORLEVEL 环境变量被设置为从选择集选择的键索引。列出的第一个选择返回 1,第二个选择返回 2,等等。如果用户按的键不是有效的选择,
该工具会发出警告响声。如果该工具检测到错误状态,它会返回 255 的ERRORLEVEL 值。如果用户按 Ctrl+Break 或 Ctrl+C 键,该工具会返回 0
的 ERRORLEVEL 值。在一个批程序中使用 ERRORLEVEL 参数时,将参数降序排列。
示例:
CHOICE /?
CHOICE /C YNC /M "确认请按 Y,否请按 N,或者取消请按 C。"
CHOICE /T 10 /C ync /CS /D y
CHOICE /C ab /M "选项 1 请选择 a,选项 2 请选择 b。"
CHOICE /C ab /N /M "选项 1 请选择 a,选项 2 请选择 b。"
如下test4_3.cmd测试文件,注意errorlevel是由大到小的顺序判断的:
@echo off
choice /c xyz /m "Say hello input x ;Say goodbye input y;Say ding input z"
if errorlevel 3 (
echo ding
) else if errorlevel 2 (
echo goodbye
) else if errorlevel 1 (
echo hello
)
pause
运行结果:
Say hello input x ;Say goodbye input y;Say ding input z [X,Y,Z]?Y
goodbye
请按任意键继续. . .
for命令
for 命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令,它的帮助信息太长,我就不粘了。
1)for {%variable | %%variable} in (set) do command [command-parameters]
%variable 指定一个单一字母可替换的参数。变量名称是区分大小写的,所以 %i 不同于 %I
在批处理文件中使用 FOR命令时,指定变量建议用 %%variable而不要用 %variable。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters为特定命令指定参数或命令行开关。
2)如果命令扩展名被启用,下列额外的 FOR命令格式会受到支持:
a.FOR /D%variable IN (set) DO command [command-parameters]
如果集里面包含通配符,则指定与目录名匹配,而不与文件名匹配。
b.FOR /R [[drive:]path]%variable IN (set) DO command[command-parameters]
检查以[drive:]path为根的目录树,指向每个目录中的FOR语句。
如果在 /R后没有指定目录,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。
c.FOR /L %variable IN (start,step,end) DO command [command-parameters]
该集表示以增量形式从开始到结束的一个数字序列。
如:(1,1,5)将产生序列 1 2 3 4 5; 而(5,-1,1)将产生序列 (5 4 3 2 1)。
d.有或者没有usebackq选项:
FOR /F ["options"] %variable IN (file-set) DO command
FOR /F ["options"] %variable IN ("string") DOcommand
FOR /F ["options"] %variable IN (command) DO command
参数"options"为:
eol=c -指一个行注释字符的结尾(就一个,如“;”)
skip=n -指在文件开始时忽略的行数。
delims=xxx -指分隔符集。这个替换了空格和跳格键的默认分隔符集。
tokens=x,y,m-n -指每行的哪一个符号被传递到每个迭代的 for本身。这会导致额外变量名称的分配。
m-n格式为一个范围。通过 nth符号指定 mth。
如果符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。
usebackq -指定新语法已在下类情况中使用:
在作为命令执行一个后引号的字符串并且一个单引号字符为文字字符串命令并允许在 filenameset中使用双引号扩起文件名称。
3)使用实例:
1. 如下命令行会显示当前目录下所有以bat或者txt为扩展名的文件名。
for %%c in (*.bat *.txt) do (echo %%c)
a. 如下命令行会显示当前目录下所有包含有 e或者 i的目录名。
for /D %%a in (*e* *i*) do echo %%a
b. 如下命令行会显示 E盘test目录下所有以bat或者txt为扩展名的文件名。
for /R E:\test %%b in (*.txt *.bat) do echo %%b
for /r %%c in (*) do (echo %%c) ::遍历当前目录下所有文件
c. 如下命令行将产生序列 1 23 4 5
for /L %%c in (1,1,5) do echo %%c
d. 以下两句,显示当前的年月日和时间
For /f "tokens=1-3 delims=-/. " %%j In ('Date /T') do echo %%j年%%k月%%l日
For /f "tokens=1,2 delims=: " %%j In ('TIME /T') do echo %%j时%%k分
e. 把记事本中的内容每一行前面去掉8个字符
setlocal enabledelayedexpansion
for /f %%i in (zhidian.txt) do (
set atmp=%%i
set atmp=!atmp:~8!
if {!atmp!}=={} ( echo.) else echo !atmp!
)
:: 读取记事本里的内容(使用 delims是为了把一行显示全,否则会以空格为分隔符)
for /f "delims=" %%a in (zhidian.txt) do echo.%%a
4)continue和 break
利用 goto实现程序中常用的 continue和 break命令,其实非常简单
continue: 在 for 循环的最后一行写上一个标签,跳转到这位置即可
break: 在 for循环的外面的下一句写上一个标签,跳转到这位置即可
如下 (伪代码)
for /F ["options"] %variable IN (command) DO (
... do command ...
if ... goto continue
if ... goto break
... do command ...
:continue
)
:break
最后给一个例子:
for /f "delims=" %%i in ('dir /b /a-d /s "%FILE_PATH%"') do (
::文件夹
echo %%~dpi
::文件名
echo %%~nxi
::文件后缀
echo %%~xi
::文件绝对路径
echo %%~i
echo ------------------xxxxxxxxxxx---------------------
)