1. 批处理常用符号详解:
————————————————————————————————————————————
1、@
一般在它之后紧跟一条命令或一条语句,则此命令或语句本身在执行的时候不会显示在屏幕上。请把下面的代码保存为test.cmd文件,然后运行,比较一下两条echo语句在屏幕上的输出差异:
代码:
echo a
@pause
@echo b
@pause
执行结果如下:
引用:
C:\Documents and Settings\JM\桌面>echo a
a
请按任意键继续...
b
请按任意键继续...
2、%、%%
百分号用在不同的场合,有不同的含义:
① 当百分号成对出现,并且其间包含非特殊字符时,一般做变量引用处理,比如:%var%、%str%。把以下代码保存为批处理文件,运行后观察屏幕显示结果:
复制内容到剪贴板
代码:
@echo off
set str=abc
echo 变量 str 的值是: %str%
pause
在屏幕上将显示这样的结果:
引用:
变量 str 的值是: abc
按任意键继续...
另外,百分号作为变量引用还有一种特殊形式,那就是对形式参数的引用,此时,单个百分号后面紧跟0~9这10个数字,如%0、%1,请看演示代码:
代码:
@echo off
if defined str goto next
set str=
set /p str=请把文件拉到本窗口后回车:
call "%~0" %str%
pause
exit
:next
cls
echo 本批处理文件完整路径为:"%~0"
echo 拖到本窗口的文件完整路径为:"%~1"
goto :eof
最后, %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %* 用于把命令行中参数传递给批处理。
%0 批处理文件名本身,%1 第一个参数,%9 第九个参数,%* 从第一个参数开始的所有参数。
1.代码:
@echo off
echo cho cho .cho %*
D:\>test.bat */a* /b /c
输出结果: test.batecho */a*echo /becho */a* /b /cecho
%0 表示本身文件名:test.bate , %*表示整个命令行 */a* /b /c 。
2.代码:
@echo off
echo cho %~f1echo cho %~f0echo %~d0echo %~p0echo %~n0echo %~x0echo %~s0echo %~a0echo %~t0echo %~z0
D:\>test.bat "*/a*" /b /c
输出结果:"*/a*"echo D:\1.txt\a*echo test.batecho D:\test.batecho D:echo \echo testecho .batecho D:\test.batecho --a------echo 2008-12-22 15:49echo 119
解释:
%I - 表示输入的参数。
%~I - 删除任何引号(")。
%~fI - 将 %I 扩展到一个完全合格的路径名
%~dI - 仅将 %I 扩展到一个驱动器号
%~pI - 仅将 %I 扩展到一个路径
%~nI - 仅将 %I 扩展到一个文件名
%~xI - 仅将 %I 扩展到一个文件扩展名
%~sI - 扩展的路径只含有短名
%~aI - 将 %I 扩展到文件的文件属性
%~tI - 将 %I 扩展到文件的日期/时间
%~zI - 将 %I 扩展到文件的大小
%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展到找到的第一个完全合格的名称。如果环境变量名
未被定义,或者没有找到文件,此组合键会扩展到空字符串。
可以组合修饰符来得到多重结果:
%~dpI - 仅将 %I 扩展到一个驱动器号和路径
%~nxI - 仅将 %I 扩展到一个文件名和扩展名
%~fsI - 仅将 %I 扩展到一个带有短名的完整路径名
%~dp$PATH:I - 搜索列在路径环境变量的目录,并将 %I 扩展15:49 2008-12-22
到找到的第一个驱动器号和路径。
%~ftzaI - 将 %I 扩展到类似输出线路的 DIR
② 出现在 set /a 语句中时,表示两数相除取余数,也就是所谓的模运算,它在命令行窗口和批处理文件中的写法略有差异:在命令行窗口中,只需要单个的%,在批处理文件中,需要连续两个百分号,写成%%。
例如:在命令行窗口中,运行 set /a num=4%2 ,则结果将显示0,因为4除以2的余数为0;如果保存为批处理文件,则此语句将略有改变:
代码:
@echo off
set /a num=4%%2
echo 4除以2的余数为 %num%
pause
③ 转义符号:如果要显示%本身时,需要在前面用%来转义。例如:
代码:
@echo off
echo 一个百分号:%%
echo 两个百分号:%%%%
echo 三个百分号:%%%%%%
pause
3、:、::
① 以:打头的单个的:表示该行是一个标签,它之后的内容是一个标签段,如:test,则表示:test之下的内容是标签段,而test是这个标签段的名,可以用 goto test 、goto :test 跳转到该标签段或用 call :test 调用该子过程;而连续两个冒号打头表示该行内容为注释内容,实际上,:: 是个无效的标签名,:加上空格同样可以起到注释的作用,此时,::的功能和注释命令rem相同;但是,rem 注释语句中的某些命令符号如重定向符号和管道符号还是会执行,而如果用::来注释的时候,与::同处一行的所有命令或符号直接被命令解释器忽略掉,无形中提高了注释的兼容性和整个程序的执行效率,并且在众多的命令语句中更显得醒目,所以,注释语句推荐使用::的格式。
② 在 set 语句中:和~同时使用时,: 起到截取字符串的功能。假设 set str=abcde,那么,set var=%str:~0,1% 表示截取字符串abcde的第一个字符;和=同时使用时,起到替换字符串的功能。假设:set str=abc:de,那么,set var=%str:a=1% 则表示把字符串abc:de中的a替换为1,set var=%str::=2% 则表示把字符串abc:de中的:替换为2;
1. 代码:
@echo off
Set var=1234567890
Echo %var:~1% &::表示舍弃var的前1位。输出结果:234567890
Echo %var:~0,1% &::表示舍弃var的前0位之后取1位。输出结果:1
Echo %var:~1,1% &::表示舍弃var的前1位之后取1位。输出结果:2
Echo %var:~0,-1% & ::表示舍弃var的前0位和最后1位。输出结果:123456789
Echo %var:~1,-3% & ::表示舍弃var的前1位和最后3位。输出结果:234567
Echo %var:~-1% &::表示取var的最后1位。输出结果:0
Echo %var:~-4,3% & ::表示从var的倒数4位开始取3位。输出结果:789
Echo %var:~-8,-2% & ::表示从var的倒数8位开始并舍弃最后2位。输出结果:345678
2. 代码:
@echo off
Set var=abc:\123\ef:g\123\456"hij"789"klm\
Echo %var:"=% &::表示删除var中的所有"号。输出结果:acb:\ef:g\123\456hij789klm
Echo %var::=% &::表示删除var中的所有:号。输出结果:abc:\123\efg\123\456"hij"789"klm
Echo %var:"=ok% &::表示替换var中的所有"号为ok字。输出结果:abc:\123\ef:g\123\456okhijok789okklm
Echo %var:*"=% &::表示删除var中的第一次出现的"号及其前面所有的字符。输出结果:hij"789"klm\
Echo %var:*"=ppp% &::表示替换var中的第一次出现的"号及其前面所有的字符为ppp。输出结果:ppphij"789"klm\
4、~
① 用在 set 语句中,和:同时使用时,起到截取字符串的功能,请参考上一条的解释;
② 用在 set /a 语句中时,它是一元运算符号,表示将操作数字按位取反,例如,set /a num=~1的执行结果是-2,set /a num=~0的结果是-1
③ 用在for语句中,表示增强for的功能,能够提取到更多的信息。例如:在批处理文件的for语句中:%%~i表示去掉第一对外侧引号,%%~zi表示获取文件的大小(以字节为单位),%%~ni表示获取文件名,%%~xi表示获取扩展名(带点号)……它们可以组合使用,如%%~nxi表示获取文件名和后缀名。 解释:
5、>、>>、<
①一般而言,>表示用新内容覆盖原文件内容,>>表示向原文件追加内容,此时,它们以重定向符号的身份出现;如果用在 set /a 语句中,则>表示分组,>>表示逻辑移位;
②<从后面中获得输入信息。
代码:
Type 2.txt > 1.txt 表示把2.txt中的内容覆盖1.txt中的内容。
Echo 2008-12-20 >>1.txt < 1.txt 10:53 表示把2008-12-20与10:53 附加到1.txt文件中去。
>1.txt echo hello!!
6、|、""
一般而言,它以管道符号的身份出现,表示把在它之前的命令或语句的执行结果作为在它之后的命令或语句的处理对象,简而言之,就是把它之前的输出作为它之后的输入,例如:echo abcd|findstr "b",表示把echo abcd的执行结果,作为findstr "b" 的执行对象,也就是在字符串abcd中查找b字符;如果test.txt中有abcd字符串,则该语句与 findstr "b" test.txt 具有同样的效果;
1.代码:
D:\>echo abcd|findstr "b" & ::表示以"b"为条件,在"abcd"中查找"b".
D:\>dir | findstr "test" &::表示查找有"test"的目录。
"": 表示定义成字符型,加上双引号之后命令行中可以有空格符。
比如:set "str=this is a test" 表示str是一个字符型所以要加 ""
7、^
一般而言,^以转义字符的身份出现。因为在cmd环境中,有些字符具备特殊功能,如>、>>表示重定向,|表示管道,&、&&、||表示语句连接……它们都有特定的功能,如果需要把它们作为字符输出的话,echo> 、echo | ……之类的写法就会出错——cmd解释器会把它们作为具有特殊功能的字符对待,而不会作为普通字符处理,这个时候,就需要对这些特殊字符做转义处理:在每个特殊字符前加上转义字符^,因此,要输出这些特殊字符,就需要用 echo ^>、echo ^|、echo ^|^|、echo ^^……之类的格式来处理;
8、&
一般而言,&表示两条命令或语句同时执行的意思。如 echo a&echo b,将在屏幕上同时显示a和b字符。当几条语句含义近似或作用相同且没有先后的顺序之别时,启用&符号连接这些语句将会增加程序的可读性;& :: 表示注释。
9、&&、||
这是一对含义截然相反的命令符,&&表示如果它之前的语句成功执行,将执行它之后的语句,而||则表示如果它之前的语句执行失败,将执行它之后的语句;在某些场合,它们能替代 if……else…… 语句;例如:
代码:
@echo off
md test&&echo 成功创建文件夹test||echo 创建文件夹test失败
pause
效果等同于如下代码:
代码:
@echo off
md test
if "%errorlevel%"=="0" (echo 成功创建文件夹test) else echo 创建文件夹test失败
pause
10、()
小括号对经常出现在for语句和if语句中,还有一些特定场合;在for和if语句中属于语句格式的要求,例如:
① for %%i in (语句1) do (语句2):在这条语句中,语句1必须用括号对包围,而语句2的括号对则可视情况予以抛弃或保留:如果语句2是单条语句或用&、&&、||等连接符号连接的多条语句,括号对可以抛弃,如果语句2是有逻辑先后关系的多条语句集合,则必须保留括号对,并且,多条语句必须断行书写;例如:
代码:
@echo off
for %%i in (a b c) do echo %%i&echo --------
pause
也可以改写为:
代码:
@echo off
for %%i in (a b c) do (
? ? echo %%i
? ? &echo --------
)
pause
② if 条件 (语句1) else (语句2):如果没有else部分,则语句1的括号对可有可无;如果有else部分,则语句1中的括号对必须保留,此时,语句2中的括号对保留与否,和上一点类似。例如:
代码:
@echo off
if exist test.txt echo 当前目录下有test.txt
pause
代码:
@echo off
if exist test.txt (echo 当前目录下有test.txt) else echo 当前目录下没有test.txt
pause
代码:
@echo off
if exist test.txt (echo 当前目录下有test.txt) else (
? ? echo 当前目录下没有test.txt
? ? pause
? ? cls
? ? echo 即将创建test.txt文件
? ? cd.>test.txt&&echo 成功创建test.txt
)
pause
③ 特定场合下使用括号对,不但可以使代码逻辑清晰,增强可读性,还可能会减少代码量。比如用echo语句构造多行文本内容的时候:
代码:
@echo off
(
echo 第一行
echo 第二行
echo 第三行
)>test.txt
start test.txt
如果不使用括号对的话,则需要使用如下代码:
复制内容到剪贴板
代码:
@echo off
echo 第一行>test.txt
echo 第二行>>test.txt
echo 第三行>>test.txt
start test.txt
11、+、-、*、/
在 set /a 语句中,这些符号的含义分别为:加、减、乘、除。例如:set /a num=1+2-3*4/5。需要注意的是,这些运算符号遵循数学运算中的优先级顺序:先乘除后加减,有括号的先算括号,并且,直接忽略小数点,因此,刚才那个算式的结果是1而不是0或0.6。
另外,有可能会在代码中看到这样的写法:set /a num+=1、set /a num-=1、set /a num*=1 和 set /a num/=1,这些表示累加、累减、累乘、累除,步长都是1,展开后的完整写法为:set /a num=num+1、set /a num=num-1、set /a num=num*1 和 set /a num=num/1(set /a 语句中,变量引用可以忽略百分号对或感叹号对,set /a num=%num%+1 与 set /a num=num+1 等同)
12、equ、neq、lss、leq、gtr、geq:
这几个命令符是if语句中常用到的数值比较符号,取自英文的关键字母,具体的含义为:
引用:
命令符号? ?? ???含义? ?? ?? ?? ?? ? 英文解释
EQU? ?? ?? ?? ??? 等于? ?? ?? ?? ?? ? equal
NEQ? ?? ?? ?? ? ? 不等于? ?? ?? ?? ?? ? ?not equal
LSS? ?? ?? ?? ?? ? 小于? ?? ?? ?? ?? ??? less than
LEQ? ?? ?? ?? ?? ? 小于或等于? ?? ?? ? less than or equal
GTR? ?? ?? ?? ? ? 大于? ?? ?? ?? ?? ??? greater than
GEQ? ?? ?? ? ?? ? 大于或等于? ?? ?? ? greater than or equal
13、>& 、<& :
>&: 将一个句柄的输出写入到另一个句柄的输入中。
<&: 从一个句柄读取输入并将其写入到另一个句柄输出中。
2. ECHO, REM, PAUSE, TITLE, VER, COLOR, errorlevel,
md, rd, del, ren, type, copy, xcopy,
label, vol, date, time, goto, find, more,
pushd, Subst, assoc, ftype, Sc, 详解。
1.echo :
@? ?? ?? ?? ?? ?? ???#关闭单行回显
echo off? ?? ?? ?? ? #从下一行开始关闭回显
@echo off? ?? ?? ?? ?#从本行开始关闭回显。一般批处理第一行都是这个
echo on? ?? ?? ?? ???#从下一行开始打开回显
echo? ?? ?? ?? ?? ???#显示当前是 echo off 状态还是 echo on 状态
echo.? ?? ?? ?? ?? ? #输出一个"回车换行",一般就是指空白行
Echo\ #不显示任何。
echo hello world? ???#输出hello world
"关闭回显"是指运行批处理文件时,不显示文件里的每条命令,只显示运行结果批处理开始和结时,系统都会自动打开回显
2.rem:
rem 和 ::注释命令,注释行不执行操作。一般用:: 它后面的包括特殊的符号的一行都不显示。
3.pause:
暂停命令,
运行该命令时,将显示下面的消息:请按任意键继续 . . . 一般用于看清楚屏幕上显示的内容.
Pause >null #表示暂停,但不显示任意键继续…….
4.title:
设置cmd窗口的标题,
c:\>title universal ? ?? ???#可以看到cmd窗口的标题栏变成了universal 。
5.ver:
显示系统版本。
6.color:
设置控制台的前景和背景颜色。
第一个为背景,第二个则为
前景。每个数字可以为以下任何值之一:
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 浅绿色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时的颜色。
c:\>color 1C
7.errorlevel:
程序返回码,
echo %errorlevel%每个命令运行结束,可以用这个命令行格式查看返回码用于判断刚才的命令是否执行成功默认值为0,
一般命令执行出错会设 errorlevel 为1.
8.md:
创建目录。
md abc? ?? ?? ?? ???#在当前目录里建立子目录 abc.
md d:\a\b\c? ?? ?? ?#如果 d:\a 不存在,将会自动创建.
9.rd:
删除目录
rd abc? ?? ?? ?? ???#删除当前目录里的 abc 子目录,要求为空目录
rd /s/q d:\temp? ???#删除 d:\temp 文件夹及其子文件夹和文件,不需要按 Y 确认
10.del:
删除文件但不能删除目录。
del d:\test.txt? ???#删除指定文件,不能是隐藏、系统、只读文件
del *.*删除当前目录里的所有文件,不包括隐藏、系统、只读文件,要求按 Y 确认
del /q/a/f d:\temp\*.*删除 d:\temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
del /q/a/f/s d:\temp\*.*删除 d:\temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
11.ren:
文件重命名
ren 1.txt 2.bak? ???#把 1.txt 更名为 2.bak
ren *.txt *.ini? ???#把当前目录里所有.txt文件改成.ini文件
ren d:\temp tmp? ???#支持对文件夹的重命名
12.type:
显示文件内容
type c:\boot.ini? ? #显示指定文件的内容,程序文件一般会显示乱码
type *.txt? ?? ?? ? #显示当前目录里所有.txt文件的内容
13.copy,xcopy<增强版>:
拷贝文件
copy c:\test.txt d:\复制 c:\test.txt 文件到 d:\
copy c:\test.txt d:\test.bak复制 c:\test.txt 文件到 d:\ ,并重命名为 test.bak
copy c:\*.*复制 c:\ 所有文件到当前目录,不包括隐藏文件和系统文件不指定目标路径,则默认目标路径为当前目录
copy con test.txt从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件con代表屏幕,prn代表打印机
prn代表打印机,nul代表空设备。
copy 1.txt + 2.txt 3.txt合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件如果不指定 3.txt ,则保存到 1.txt
copy test.txt +复制文件到自己,实际上是修改了文件日期
xcopy d:\mp3 e:\mp3 /s/e/i/y复制 d:\mp3 文件夹、所有子文件夹和文件到 e:\ ,覆盖已有文件加 /i 表示如果 e:\ 没有 mp3 文件夹就自动新建一个,否则会有询问.
14.label 和 vol:
设置卷标
vol? ?? ?? ?? ?? ???#显示卷标
label? ?? ?? ?? ?? ?#显示卷标,同时提示输入新卷标
label c:system? ?? ?#设置C盘的卷标为 system
15.date 和 time:
日期和时间
date? ?? ?? ? #显示当前日期,并提示输入新日期,按"回车"略过输入
date/t? ?? ???#只显示当前日期,不提示输入新日期
time? ?? ?? ? #显示当前时间,并提示输入新时间,按"回车"略过输入
time/t? ?? ???#只显示当前时间,不提示输入新时间
16.goto 和 : :
跳转命令
:label? ?? ???#行首为:表示该行是标签行,标签行不执行操作
goto label? ? #跳转到指定的标签那一行
17.find :
(外部命令)查找命令
find "abc" c:\test.txt在 c:\test.txt 文件里查找含 abc 字符串的行如果找不到,将设 errorlevel 返回码为1
find /i "abc" c:\test.txt查找含 abc 的行,忽略大小写
find /c "abc" c:\test.txt显示含 abc 的行的行数
18.more:
(外部命令)逐屏显示
more c:\test.txt? ? #逐屏显示 c:\test.txt 的文件内容
Dir |more #把dir执行的结果以逐屏的方式显示。
19.pushd :
切换当前目录
c:\>pushd c:\windows
c:\windows>
c:\>pushd d:\netgear
d:\netgear>
20.subst(外部命令):
将路径与驱动器关联,映射磁盘。
Subst z: d:\logs #把d:\logs 映射成z:
subst z: \\server\d? ???#这样输入z:就可以访问\\server\d了
subst z: /d? ?? ?? ?? ? #取消该映射
subst? ?? ?? ?? ?? ?? ? #显示目前所有的映
21.assoc 和 ftype:
文件关联assoc 设置'文件扩展名'关联,关联到'文件类型',ftype 设置'文件类型'关联,关联到'执行程序和参数'。当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开,而是先判断.txt属于 txtfile, '文件类型'再调用 txtfile 关联的命令行 txtfile=%SystemRoot%\system32\NOTEPAD.EXE %1可以在"文件夹选项"→"文件类型"里修改这2种关联:
assoc? ?? ?? ???#显示所有'文件扩展名'关联
assoc .txt? ?? #显示.txt代表的'文件类型',结果显示 .txt=txtfile
assoc .doc? ?#显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
assoc .exe? ?#显示.exe代表的'文件类型',结果显示 .exe=exefile
assoc .txt=Word.Document.8 #设置.txt为word类型的文档,可以看到.txt文件的图标都变了
assoc .txt=txtfile #恢复.txt的正确关联
ftype? ?? ?? ??? #显示所有'文件类型'关联
ftype exefile? ?#显示exefile类型关联的命令行,结果显示 exefile="%1" %*
ftype exefile="%1" %* # 恢复 exefile 的正确关联
修复exe文件关联:
1、搜索cmd.exe,并改名为cmd.com或cmd.scr。
2、运行cmd.com
3、运行下面两个命令:???
ftype exefile="%1" %*????
assoc .exe=exefile??
4、将cmd.com改回cmd.exe
22.SC:
用于与服务控制管理器通信的命令行程序。
用法:
sc [command] [service name]< option1>< option2>...<\/div>