BAT命令大全
阅读本文需要一定的dos基础概念,
象:盘符、文件、目录(文件夹)、子目录、根目录、当前目录
每个命令的完整说明请加 /? 参数参考微软的帮助文档
可以看到,在 /? 帮助里,"命令扩展名"一词会经常出现
"命令扩展名"是指相对于win98的dos版本而言,每个命令新增的功能.
命令测试环境win2000proSP4win98的命令功能太少,就不作研究了
-------------------------------------------------------------------------------------------------------------------
1 echo 和 @
回显控制命令
@ #关闭单行回显
echo off #从下一行开始关闭回显
@echo off #从本行开始关闭回显。一般批处理第一行都是这个
echo on #从下一行开始打开回显
echo #显示当前是 echo off 状态还是 echo on 状态
echo. #输出一个"回车换行",一般就是指空白行
echo hello world #输出hello world
"关闭回显"是指运行批处理文件时,不显示文件里的每条命令,只显示运行结果
批处理开始和结束时,系统都会自动打开回显
-------------------------------------------------------------------------------------------------------------------
2 errorlevel
程序返回码
echo %errorlevel%
每个命令运行结束,可以用这个命令行格式查看返回码
用于判断刚才的命令是否执行成功
默认值为0,一般命令执行出错会设 errorlevel 为1
-------------------------------------------------------------------------------------------------------------------
3 dir
显示目录中的文件和子目录列表
dir #显示当前目录中的文件和子目录
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
dir c: /a:d #显示 C 盘当前目录中的目录
dir c:// /a:-d #显示 C 盘根目录中的文件
dir d://mp3 /b/p #逐屏显示 d://mp3 目录里的文件,只显示文件名,不显示时间和大小
dir *.exe /s
显示当前目录和子目录里所有的.exe文件其中 * 是通配符,
代表所有的文件名,还一个通配符 ? 代表一个任意字母或汉字
如 c*.* 代表以 c 开头的所有文件?.exe 代表所有文件名是一个字母的.exe文件
如果指定的目录或文件不存在,将返回 errorlevel 为1
每个文件夹的 dir 输出都会有2个子目录 . 和 ..
. 代表当前目录.. 代表当前目录的上级目录
dir . #显示当前目录中的文件和子目录
dir .. #显示当前目录的上级目录中的文件和子目录
其它参数可参考 dir /?
-------------------------------------------------------------------------------------------------------------------
4 cd
更改当前目录
cd mp3 #进入当前目录中的mp3 目录
cd .. #进入当前目录中的上级目录
cd// #进入根目录
cd #显示当前目录
cd /d d://mp3 #可以同时更改盘符和目录
cd//"Documents and Settings"//All users
文件名带空格,可以不加引号
建议加上引号,因为有的时候不加引号会运行出错,如登录脚本
如果更改到的目录不存在,则出错返回 errorlevel=1
-------------------------------------------------------------------------------------------------------------------
5 md
创建目录
md abc #在当前目录里建立子目录 abc
md d://a//b//c #如果 d://a 不存在,将会自动创建
-------------------------------------------------------------------------------------------------------------------
6 rd
删除目录
rd abc #删除当前目录里的 abc 子目录,要求为空目录
rd /s/q d://temp #删除 d://temp 文件夹及其子文件夹和文件,不需要按 Y 确认
-------------------------------------------------------------------------------------------------------------------
7 del
删除文件
del d://test.txt #删除指定文件,不能是隐藏、系统、只读文件
del *.*
删除当前目录里的所有文件,不包括隐藏、系统、只读文件,要求按 Y 确认
del /q/a/f d://temp//*.*
删除 d://temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
del /q/a/f/s d://temp//*.*
删除 d://temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
-------------------------------------------------------------------------------------------------------------------
8 ren
文件重命名
ren 1.txt 2.bak #把 1.txt 更名为 2.bak
ren *.txt *.ini #把当前目录里所有.txt文件改成.ini文件
ren d://temp tmp #支持对文件夹的重命名
-------------------------------------------------------------------------------------------------------------------
9 cls
清屏
-------------------------------------------------------------------------------------------------------------------
10 type
显示文件内容
type c://boot.ini #显示指定文件的内容,程序文件一般会显示乱码
type *.txt #显示当前目录里所有.txt文件的内容
-------------------------------------------------------------------------------------------------------------------
11 copy
拷贝文件
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代表打印机,nul代表空设备
copy 1.txt + 2.txt 3.txt
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
如果不指定 3.txt ,则保存到 1.txt
copy test.txt +
复制文件到自己,实际上是修改了文件日期
COPY命令的技巧集成
目前,各种能够完成copy命令的工具软件层出不穷,许多人在操作时都已习惯了用pctools之类的工具来代替copy命令。但是copy命令的优势是 任何软件都替代不了的。因为它是一个内部命令,只要计算机能够启动,它便可以运行,不需要任何软件支持。因此,熟练掌握copy命令是更加有效使用计算机 的基本功。在执行copy的帮助命令copy/?时,将会得到copy命令格式的英文说明。
copy〈盘符〉[〈路径〉]〈源文件名〉[/A|/B][+〈源文件名〉[/A|/B][+...]][〈盘符〉][〈路径〉][〈目标文件名〉[/A|/B]][/V][/Y|/-Y]
其中/A为ASCII文本,即在拷贝文件时拷贝到第一个CTRL-Z(EOF)为止。
/B为二进制文件,即在拷贝时对CTRL-Z(EOF)象处理其它字符一样。
/V拷贝的同时并进行校验。
/Y在拷贝时 若遇同名文件可直接覆盖。
/-Y在拷贝时
若遇同名文件时,询问是否覆盖。
copy命令的选择项符合DOS命令的基本规则,巧妙地选用不同参数并结合通配符"*"或"?",将会使完成各种copy命令的操作更加方便。以下是copy命令的几种基本运用。所有命令举例都假设在当前路径下进行。
一、文件复制 这是copy命令的最常见用途。如果文件同名则必不在同一目录中,如果 不同名则可在同一目录中建立一个新的文件。
二、文件合并: copy文件名1+文件名2+...新文件名
此法多用于文本说明书、文本源程序等文本格式的文件合并。如果有新文件名则将所有要合并的文件合并起来建立一个新文件,如果没有新文件名则将所有要合并的文件合并起来建立在第一个文件中。
对于非文本格式的文件合并必须在第一个文件名之后加上/B参数。
例如:copy*.wps/b new.wps
三、文件的屏幕显示
(1)文本文件的显示 copy*.txt con
在实际工作中往往需要对某一类文本文件进行显示。而type显示命令只能单个文件显示,如果要连续显示多个同类文件,使用copy命令则更为方便。
(2)WPS文件的显示copy*.wps/b con
如果仅仅为了查看WPS文件的内容,则不需要进入WPS,只需要在DOS状态下,键入上述命令便可找到所需文件。
四、编辑简单的文本文件:copy con要编辑的文件名
对于简单的文本(如autoexec.bat)使用其它编辑工具,反倒显得麻烦。使用上述命令,即可进行文件编辑,当按F6键后,再回车便可以在磁盘上建立该文本文件。
五、充当打字机:copy con prn
在日常生活中,经常会遇到一些文稿内容简单却又急需形成书面文字的材料。用上述命令,即可进行文稿编辑,当按F6键后,再次回车。既直接把信息送往打印机,而不在磁盘上留下任何痕迹。用此方法还可以测试打印机是否联机。
六、进行键盘打字练习:copy con>con
如果仅仅为了键盘练习,而不想有任何保留,在DOS状态提示下最多可写127个字符,一旦回车,便会显示Bad command or file name信息,十分不便。如果使用上述命令,则可以无所顾及的进行练习,直到按F6再回车或按CTRL-C终止。
七、删除文件使其不可恢复:copy nul需要删除的文件名
使用DEL命令对文件进行删除后,用PCTOOLS工具软件或UNDelete命令,可以使被删除的文件得到恢复。对重要文件的删除,使用上述命令后,用任何工具无法恢复,从而加强了被 删文件的保密性。
八、更改文件的建立日期和时间:copy需要改期的文件名+,,
为了避免对一些应用系统文件的误删除,往往把文件建立的日期置为统一日期,先用DATE和TIME命令将系统日期定为所需日期和时间,然后再用上述命令, 即可改文件的建立日期和时间。此命令只适用单个文件修改,而不能用通配符"*"进行批量修改。否则,将删除批量中的第一个文件。
九、文件打印:copy文件名prn
多用于对文本文件的直接打印。
十、单驱动器的文件复制:如果仅仅只有单驱动器,或者出于某种原因只能使用单驱动器进行的文件复制,那么首先在COMS中,只定义所用的单驱动器类型 (如:A盘为5 1/4 1.2M或3 1/2 1.44MB盘为NONE)然后用copy a:文件名b:的命令,并按照屏幕提示插取磁盘,即可完成单驱动器的文件复制。
-------------------------------------------------------------------------------------------------------------------
12 title
设置cmd窗口的标题
title 新标题 #可以看到cmd窗口的标题栏变了
-------------------------------------------------------------------------------------------------------------------
13 ver
显示系统版本
-------------------------------------------------------------------------------------------------------------------
14 label 和 vol
设置卷标
vol #显示卷标
label #显示卷标,同时提示输入新卷标
label c:system #设置C盘的卷标为 system
-------------------------------------------------------------------------------------------------------------------
15 pause
暂停命令
运行该命令时,将显示下面的消息:
请按任意键继续 . . .
一般用于看清楚屏幕上显示的内容
-------------------------------------------------------------------------------------------------------------------
16 rem 和 ::
注释命令
注释行不执行操作
-------------------------------------------------------------------------------------------------------------------
17 date 和 time
日期和时间
date #显示当前日期,并提示输入新日期,按"回车"略过输入
date/t #只显示当前日期,不提示输入新日期
time #显示当前时间,并提示输入新时间,按"回车"略过输入
time/t #只显示当前时间,不提示输入新时间
-------------------------------------------------------------------------------------------------------------------
18 goto 和 :
跳转命令
:label #行首为:表示该行是标签行,标签行不执行操作
goto label #跳转到指定的标签那一行
注意:
Microsoft Windows XP [版本 5.1.2600]
GOTO 和 : 的跳跃性受bat脚本"语句先后顺序"限制.
goto label 句,以下的语句不被执行!
但是!GOTO 到 指定的 :label 后,
如果此 :label 模块中没有其他GOTO指示、中断或结束语句,
则此 :label 模块后的任何命令行包括其他没有指定跳转的 :label 段都将将继续执行!
新手许会因此而造成脚本的死循环!
例1---------------------------
cls
IF EXIST C:/*.* GOTO 1
IF EXIST D:/*.* GOTO 2
: 1
ECHO 条件1成立正在执行:1
: 2
ECHO 条件2成立正在执行:2
: 3
ECHO 条件3成立正在执行:3
例2------------------------------
cls
IF EXIST C:/*.* GOTO 1
IF EXIST D:/*.* GOTO 2
: 2
ECHO 条件2成立正在执行:2
: 1
ECHO 条件1成立正在执行:1
: 3
ECHO 条件3成立正在执行:3
例3------------------------------
cls
IF EXIST C:/*.* GOTO 1
IF EXIST D:/*.* GOTO 2
: 3
ECHO 条件3成立正在执行:3
: 2
ECHO 条件2成立正在执行:2
: 1
ECHO 条件1成立正在执行:1
------------------------------
3例的结果是不同的.
4.死循环例:
------------------------------
cls
: 1
ECHO 条件1成立正在执行:1
: 2
ECHO 条件2成立正在执行:2
: 3
ECHO 条件3成立正在执行:3
IF EXIST C:/*.* GOTO 1
IF EXIST D:/*.* GOTO 2
-------------------------------------
此 死循环例 脚本机器配置不高尽量不要测试.
-------------------------------------------------------------------------------------------------------------------(待续)
19 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 的行的行数
-------------------------------------------------------------------------------------------------------------------
20 more (外部命令)
逐屏显示
more c://test.txt #逐屏显示 c://test.txt 的文件内容
-------------------------------------------------------------------------------------------------------------------
21 tree
显示目录结构
tree d:// #显示D盘的文件目录结构
-------------------------------------------------------------------------------------------------------------------
22 &
顺序执行多条命令,而不管命令是否执行成功
c: & cd// & dir /w
相当于把下面3行命令写到1行去了
c:
cd/dir /w
-------------------------------------------------------------------------------------------------------------------
23 &&
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
f: && cd// && dir >c://test.txt
注意如果f盘不存在,那么后面2条命令将不会执行
find "ok" c://test.txt && echo 成功
如果找到了"ok"字样,就显示"成功",找不到就不显示
注释:
&& 前命令执行失败,仅其后"一条命令"将不被执行.
& 不论前条结果,后条命令继续执行.相当于换行.
当 && 与 & 出现在同一条命令行中时, &&前执行失败,则仅其后条不被执行,&后继续执行.
tskill taskmgr && echo 第一条 & echo 第二条
如果结束"进程管理器"成功将会显示:
第一条
第二条
如果结束"进程管理器"失败将会显示:
找不到进程: taskmgr
第二条
-------------------------------------------------------------------------------------------------------------------
24 ||
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
f: || e:
如果有f盘就不进入e盘
find "ok" c://test.txt || echo 不成功
如果找不到"ok"字样,就显示"不成功",找到了就不显示
-------------------------------------------------------------------------------------------------------------------
25 |
管道命令
前一个命令的执行结果输出到后一个命令
dir *.* /s/a | find /c ".exe"
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
type c://test.txt|more
这个和 more c://test.txt 的效果是一样的
小窍门
当有的命令不支持 /Y参数必须手动输入 Y 时 可以这样写:
echo y|XXXX XX XX XX
)
-------------------------------------------------------------------------------------------------------------------
26 > 和 >>
输出重定向命令
> 清除文件中原有的内容后再写入
>> 追加内容到文件末尾,而不会清除原有的内容
主要将本来显示在屏幕上的内容输出到指定文件中
指定文件如果不存在,则自动生成该文件
echo hello world>c://test.txt
生成c://test.txt文件,内容为hello world
这个格式在批处理文件里用得很多,可以生成 .reg .bat .vbs 等临时文件
type c://test.txt >prn
屏幕上不显示文件内容,转向输出到打印机
echo hello world>con
在屏幕上显示hello world,实际上所有输出都是默认 >con 的
copy c://test.txt f: >nul
拷贝文件,并且不显示"文件复制成功"的提示信息,
但如果f盘不存在,还是会显示出错信息
copy c://test.txt f: >nul 2>nul
不显示"文件复制成功"的提示信息,
并且f盘不存在的话,也不显示错误提示信息
echo ^^W ^> ^W>c://test.txt
生成的文件内容为 ^W > W
注意 ^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
-------------------------------------------------------------------------------------------------------------------
27 <
从文件中获得输入信息,而不是从屏幕上
一般用于 date time label 等需要等待输入的命令
@echo off
echo 2005-05-01>temp.txt
date <temp.txt
del temp.txt
这样就可以不等待输入直接修改当前日期
-------------------------------------------------------------------------------------------------------------------
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
命令行传递给批处理的参数
%0 批处理文件本身
%1 第一个参数
%9 第九个参数
%* 从第一个参数开始的所有参数
在C盘根目录新建test.bat,内容如下:
@echo off
echo %0
echo %1
echo %2
echo %*
运行cmd,输入 c://test.bat "/a" /b /c /d
可以看出每个参数的含意
修改test.bat内容如下
@echo off
echo %1
echo %~1
echo %0
echo %~f0
echo %~d0
echo %~p0
echo %~n0
echo %~x0
echo %~s0
echo %~a0
echo %~t0
echo %~z0
再运行cmd,输入 c://test.bat "/a" /b /c /d
结果为:
"/a"
/a
c://test.bat
c:/test.bat
c:
test
.bat
c:/test.bat
--a------
2006-11-21 19:13
136
可以参照 call/? 或 for/? 看出每个参数的含意
注意这里可以对文件进行日期比较和大小比较
echo load "%%1" "%%2">c://test.txt
生成的文件内容为 load "%1" "%2"
批处理文件里,用这个格式把命令行参数输出到文件
-------------------------------------------------------------------------------------------------------------------
29 if
判断命令
if "%1"=="/a" echo 第一个参数是/a
if /i "%1" equ "/a" echo 第一个参数是/a
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
if exist c://test.bat echo 存在c://test.bat文件
if not exist c://windows (
echo 不存在c://windows文件夹
rem 有多条命令可用小括号括起来,称为"复合语句"
rem 行前的空格是为了看起来条理清楚
)
if exist c://test.bat (
echo 存在c://test.bat
) else (
echo 不存在c://test.bat
rem else表示"否则",判断结果为假时执行其后的命令
)
-------------------------------------------------------------------------------------------------------------------
30 setlocal 和 endlocal
设置"命令扩展名"和"延缓环境变量扩充"
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态
"命令扩展名"默认为启用
"延缓环境变量扩充"默认为停用
批处理结束系统会自动恢复默认值
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。
所以用到"命令扩展名"的程序,建议在开头和结尾加上
SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,
以确保程序能在其它系统上正确运行
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,
在 set 的说明里有其实用例程
-------------------------------------------------------------------------------------------------------------------
31 set
设置变量
引用变量可在变量名前后加 % ,即 %变量名%
set #显示目前所有可用的变量,包括系统变量和自定义的变量
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2
echo %p:~0,3% #显示前3个字符,即aa1
echo %p:~-2% #显示最后面的2个字符,即b2
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
set /a p=39 #设置p为数值型变量,值为39
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
set /a p="1&0" #"与"运算,要加引号。其它支持的运算符参见set/?
set p= #取消p变量
set /p p=请输入
屏幕上显示"请输入",并会将输入的字符串赋值给变量p
注意这条可以用来取代 choice 命令
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
@echo off
set p=aaa
if %p%==aaa (
echo %p%
set p=bbb
echo %p%
)
结果将显示
aaa
aaa
因为在读取 if 语句时已经将所有 %p% 替换为aaa
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
可以启用"延缓环境变量扩充",用 ! 来引用变量,即 !变量名!
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set p=aaa
if %p%==aaa (
echo %p%
set p=bbb
echo !p!
)
ENDLOCAL
结果将显示
aaa
bbb
还有几个动态变量,运行 set 看不到
%CD% #代表当前目录的字符串
%DATE% #当前日期
%TIME% #当前时间
%RANDOM% #随机整数,介于0~32767
%ERRORLEVEL% #当前 ERRORLEVEL 值
%CMDEXTVERSION% #当前命令处理器扩展名版本号
%CMDCMDLINE% #调用命令处理器的原始命令行
可以用echo命令查看每个变量值,如 echo %time%
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
-------------------------------------------------------------------------------------------------------------------
32 start
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
start explorer d:/调用图形界面打开D盘
@echo off
cd /d %~dp0 :: %~dp0 代表本文件所在盘符和路径,此例中本批处理需与劲舞团.reg、patcher.exe在同一文件夹
regedit /s 劲舞团.reg
start patcher.exe
不加 start 命令的话,"劲舞团"运行时,后面会有个黑乎乎的cmd窗口
-------------------------------------------------------------------------------------------------------------------
33 call批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行有时有的应用程序用start调用出错的,也可以call调用 -------------------------------------------------------------------------------------------------------------------
34 choice (外部命令)选择命令让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……win98里是 choice.comwin2000pro里没有,可以从win98里拷过来win2003里是choice.exechoice /N /C y /T 5 /D y>nul延时5秒下面是个 choice 语句的例子@echo offrem 以下在win2000pro运行通过,从win98里拷的chioce.com文件choice /c:abc aaa,bbb,cccif errorlevel 3 goto cccif %errorlevel%==2 goto bbbif errorlevel==1 goto aaarem 必须先判断数值高的返回码rem 可以看到 errorlevel 值的判断有3种写法,有时某种写法不好用,可以用另外的写法rem 直接运行chioce相当于运行choice /c:yn:aaaecho aaagoto end:bbbecho bbbgoto end:cccecho cccgoto end:end