|
|
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!( r7 V9 ^7 `$ ^8 S( j! J
前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效3 o8 L" z2 O) z# M, F
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展, y" {! \# M' k7 L' U
名为bat 目前比较常见 的批处理包含两类:
1 f: E6 x2 v2 M. f! \# K8 F X- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理0 O+ J5 w8 o+ f/ z" ]
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
& I3 y6 s& @3 E# x% T" F命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
8 M3 f, t/ n& z7 c+ v 怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出7 K x9 H. X# X( s/ h
批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set& A! O/ n( k0 i E* o! u
批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||
, n6 w- Q* S& j, l; x 常用DOS命令- 文件夹管理:, n, _: y: X7 f$ Q/ M
- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。
$ O6 g& z$ _ v8 J, v1 D3 X) x- Z
- 文件管理:
D& k* v" R$ e4 @( z- t: H$ P- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同% l1 l' d0 s% A- u( a: i& G6 W4 e
- 网络命令:
( f' {( q) {. T! M" z- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表
* i* _" b% h+ d; s5 y1 k# u, x9 W
- 系统管理:
. b+ G. }6 K5 Z; E+ M6 r- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置
; J7 G) \2 g. v. b# V; v, s8 s8 z $ w& C l! l3 L$ f' H x
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /? 2 C0 G" s n# [" A" R. v; S6 |
2 P/ K0 y! `# H T) {% [& O
Windows Batch 常用命令3 C4 n8 A' W- v' L1 ^! y
1 echo 和 @
. j& u5 e* b8 v* F6 o回显命令
# m- I& R) B' \' i@ #关闭单行回显% j5 Y* u5 D9 H# n9 w- C
echo off #从下一行开始关闭回显
9 {- ?! W+ r/ Z0 b- x0 P( K- D+ O' N@echo off #从本行开始关闭回显。一般批处理第一行都是这个. h/ F, k9 U1 o+ L; J
echo on #从下一行开始打开回显) a2 Y6 Q, I3 V) c
echo #显示当前是 echo off 状态还是 echo on 状态% o5 g* B4 B* G1 _' u3 p
echo. #输出一个”回车换行”,空白行5 f2 c1 K) {$ e% s( h: M$ ]
#(同echo, echo; echo+ echo[ echo] echo/ echo)8 ~8 p# U( a6 `6 _
: ]# k: U- J& e7 {# }, R: b" D' ?1 J2 errorlevel
* C+ x+ s: v: k. B: L d. o- e1 g- {echo %errorlevel%$ g2 s" d/ j) Y/ Q% g* r( z: d4 J. V
每个命令运行结束,可以用这个命令行格式查看返回码% t( i+ p9 N- r
默认值为0,一般命令执行出错会设 errorlevel 为14 j R$ [9 n8 m2 q( Y
& G) [: ~: [0 e% }* X9 Y, L% M
3 dir0 y0 y B( z! v, q* H6 Q% C: r
显示文件夹内容# S( o4 S" d0 z
dir #显示当前目录中的文件和子目录
- T' C) }# b5 ^! X7 s( G! U2 wdir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件2 E) L2 e+ U: r
dir c: /a:d #显示 C 盘当前目录中的目录
) e+ e3 T1 W- n5 Qdir c: /a:-d #显示 C 盘根目录中的文件
# d$ t: K0 f8 J' D& Ndir c: /b/p #/b只显示文件名,/p分页显示
( v3 _: R( r$ N; f, `2 ~6 qdir *.exe /s #显示当前目录和子目录里所有的.exe文件
4 U( o7 r& q; A: [* t* N
( c) \4 l w" @1 j3 N [; j4 cd' d6 V1 J( A+ F ^- S" w
切换目录
* u0 ?% |1 Q' ~" K9 ^cd #进入根目录, o/ E e1 W L; S% }% J% S. l
cd #显示当前目录
9 T% ?* u9 M2 n* jcd /d d:sdk #可以同时更改盘符和目录
, U, ]7 X6 g/ L# s B R
7 a- r1 n! \2 J5 y5 {! c3 r; Z5 md3 \9 y/ |+ c3 O0 b
创建目录: O. Q/ M6 Q* B$ Z9 _
md d:abc #如果 d:a 不存在,将会自动创建中级目录
1 u; L/ f8 x( T0 P3 `! _#如果命令扩展名被停用,则需要键入 mkdir abc: W. U& q9 I1 ?1 T3 p% r$ L/ E5 ?# E
6 a) b, e, ]% v7 `0 V
6 rd
. c: d9 G9 T6 N, z删除目录" K. i$ ?. F' c# q/ Y- l, E
rd abc #删除当前目录里的 abc 子目录,要求为空目录
/ X! H! n5 o! I/ w; H( |rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
( O/ p/ m# @( f- ]# X; V; r u5 I9 V2 e9 X% Y
7 del
' [' r6 Q, p, h7 z1 k删除文件( u2 L0 ]- }: \
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
2 w9 I3 o2 t$ \( o# b; b. xdel /q/a/f d:temp*.*
+ g8 G3 S0 p' }6 i c* ?1 d删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
1 c+ V6 D+ L- @$ M+ V$ Bdel /q/a/f/s d:temp*.*
5 v! c0 b9 Z" k" s! m, J删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录. }% Z* b9 |2 N& H8 R! b/ V. C% {
$ Z0 }. ^3 C4 A" \% s8 ren* w/ p. G6 z i- U, Z( ^
重命名命令
% _5 Y0 s, M N% ^ren d:temp tmp #支持对文件夹的重命名
2 g; N+ h5 \; I: W5 l' D" ^7 ]+ j8 H) T7 ?# Y* k, @: p* K7 a& ] l
9 cls
8 {0 i* _# x& S2 W5 C4 Y1 E清屏$ n" a+ S; ^- O. {# D: D. E7 U4 P2 s
10 type
; L& g6 w* t" @" e6 V6 Z显示文件内容
4 ~4 ?( f- l$ k0 {type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
4 Y& H/ |# K3 V5 N# A* H$ vtype *.txt #显示当前目录里所有.txt文件的内容
& `6 ~% k- I) a* }' G
! A& p# f( ?6 W/ {( h$ g5 l11 copy$ l! i& y+ q) L2 P
拷贝文件* D! h, c* v; M0 C$ v* h- O0 Z9 z
copy c:test.txt d:test.bak7 T3 `9 {& q5 U Z2 `' d8 \0 z" m
复制 c:test.txt 文件到 d: ,并重命名为 test.bak0 t+ d9 F9 Q& B/ w% K0 @* W" i
copy con test.txt
: ?; o. \' b9 P/ F从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
* Z7 ?% t; v/ ^$ M+ @con代表屏幕,prn代表打印机,nul代表空设备- ~9 u* f$ Z+ A X/ B* P
copy 1.txt + 2.txt 3.txt
. ?+ n9 ^- _( e# o6 M# J( R8 i) H: r合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
. K6 X5 h0 U; T如果不指定 3.txt ,则保存到 1.txt) n' s' S/ g7 Q O3 z" j
copy test.txt +/ _+ M4 Y! ^, Y2 F& j
复制文件到自己,实际上是修改了文件日期
' w5 m/ g6 H6 h Q$ F! A, s; R. \: S- W
12 title
4 u5 S0 j2 O; \1 h. N& ^0 A设置cmd窗口的标题
1 g3 e9 [7 C4 g+ f# W' Gtitle 新标题 #可以看到cmd窗口的标题栏变了1 t* c& p. H$ K" R5 \0 @' ^- D3 ^' n
2 Y4 s' O# x3 t* d9 F1 i% \
13 ver
5 Y" r0 |% P0 l显示系统版本$ v" D3 e1 F& z
8 n" O4 F7 V: ^- e* X& L14 label 和 vol1 M& e8 ]1 a& O7 n$ G
设置卷标5 Y3 A9 v3 I7 e; i! J, l' c9 v. e
vol #显示卷标* C6 I* f2 \# x$ F: O/ f
label #显示卷标,同时提示输入新卷标
* }5 l' f9 X! B6 {5 C7 elabel c:system #设置C盘的卷标为 system3 Y" `* w( ]3 q2 A5 Q
, X. U% a1 Y% O15 pause( L* f9 Z2 H/ c. ^% h! M+ A& m- l$ v
暂停命令
( |, C. x; B# |7 c* V4 x$ x
3 f6 d# u# G. v! B- H2 z1 `6 H16 rem 和 ::
0 ~$ t& j( U7 ]! G+ m注释命令
/ o" N# j8 }! L* P; c+ S O注释行不执行操作6 ~9 u; P! K) m) h; [* u
# }; Z3 W! N8 g$ S& c17 date 和 time+ h7 f0 b! h. y( m" f) l
日期和时间. e2 Y: Z, K" a* O
date #显示当前日期,并提示输入新日期,按"回车"略过输入( q$ o. P' c" K0 V5 t
date/t #只显示当前日期,不提示输入新日期" D! ?1 L% P3 P3 a& _# \7 Y
time #显示当前时间,并提示输入新时间,按"回车"略过输入8 D8 ]! B# I" s% k# b- F4 s, O% c
time/t #只显示当前时间,不提示输入新时间 J7 {5 u5 q8 g I; d* ]4 o
0 ~+ ]' \- P, ~18 goto 和 :/ U9 i9 A+ y% T$ c3 |
跳转命令6 _1 F$ g2 M% j8 `
:label #行首为:表示该行是标签行,标签行不执行操作" s/ F. @/ c: e) ^! M0 B: v# Z. M/ e
goto label #跳转到指定的标签那一行
1 [" Y0 _& X% q, Y5 [* g2 g/ g1 f2 M* Y: P
19 find (外部命令)- I8 Z' P2 G% r& X
查找命令
' `% v4 c1 P- W' v# gfind "abc" c:test.txt* Z) x( x4 V0 i
在 c:test.txt 文件里查找含 abc 字符串的行% j5 c! R% i- j. B' r, n! ~
如果找不到,将设 errorlevel 返回码为1
6 X+ a9 P; ]+ l5 Z1 {* |+ ^find /i “abc” c:test.txt
! k( M3 }/ n& g( {% K: q" s查找含 abc 的行,忽略大小写
; n% K) c, M$ \% K* b7 }0 K; i1 Nfind /c "abc" c:test.txt) s- l) a8 Q6 R
显示含 abc 的行的行数- y6 X s% _: |/ \
. i, s! f" ]( i3 Q, w
20 more (外部命令)% H! y7 ?/ p5 ]# h
逐屏显示8 ~ X. O+ Q9 D' p% J" b+ O. l* J
more c:test.txt #逐屏显示 c:test.txt 的文件内容+ _% g5 {+ J7 F( t( o
$ c4 w: O2 L9 ~& q" O Z# c; M v
21 tree5 V( E, Q p' o0 k8 c
显示目录结构
$ |# k# w2 U7 S M9 n1 Stree d: #显示D盘的文件目录结构! n. W! b) m+ V/ e8 R
' f( W# t/ x$ e I) D; z" S
22 &$ q2 @0 h/ M0 U1 b0 ~; R$ `
顺序执行多条命令,而不管命令是否执行成功
" b, m* _, c3 g( x
7 d0 w4 h8 l0 |23 && j) D/ ~( k7 ]) W
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令- u6 S- x$ M+ Z2 F |% W
find "ok" c:test.txt && echo 成功$ @) b- I: Z2 v7 |9 D" \
如果找到了"ok"字样,就显示"成功",找不到就不显示
5 X- @6 ~4 V" C" s8 @
5 ^! C: @% F. u5 t24 ||8 T9 z# J' ^3 n/ a" A7 ], B9 h
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令; n8 f+ u# \- f; O5 X
find "ok" c:test.txt || echo 不成功
* l9 H/ \5 \: j, `' s. a( d2 {7 _如果找不到"ok"字样,就显示"不成功",找到了就不显示; A6 D$ m" g3 D% b5 `* y" ^0 V
8 ~. c- W! Y; `, O$ A# u
25 |
. h6 _. j2 `5 k; v: U管道命令
( G3 w- a2 \; w, Z: T% Idir *.* /s/a | find /c ".exe"5 `0 F3 A3 j( r8 _5 P; U0 \5 {
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
- ?$ K O: V) m j8 T2 r该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数2 _. u: X( j: t; Q! P
type c:test.txt|more
+ S/ u# R$ C) j; H8 s这个和 more c:test.txt 的效果是一样的
+ V' X. x1 s9 Q( v8 y% | E' d8 c$ ?
% D: R: x1 j t) {% a26 > 和 >>4 N8 |$ @2 A( m$ j: ^) S* `
输出重定向命令
3 o- B2 }$ N- a6 |3 J> 清除文件中原有的内容后再写入8 @1 h& d2 l) E& N) u! w
>> 追加内容到文件末尾,而不会清除原有的内容
( N3 L; g; p" H8 s) s, [主要将本来显示在屏幕上的内容输出到指定文件中
) E( M" J# L6 Q$ i# b0 a$ i: L# p7 h指定文件如果不存在,则自动生成该文件$ K- X p, u4 D1 e, A6 s
type c:test.txt >prn! G+ o& }6 Q% Q% I( C
屏幕上不显示文件内容,转向输出到打印机
& P8 ~- M4 b" k, yecho hello world>con
( q, n! w5 |3 D8 ]- \1 a) b) @在屏幕上显示hello world,实际上所有输出都是默认 >con 的, c0 V! q/ q8 q& \
copy c:test.txt f: >nul0 }5 U5 G% J1 S2 M8 ^: R' Z
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
1 l. k/ L, z' bcopy c:test.txt f: >nul 2>nul
$ R2 A( f3 I. n% C. n; ]/ x不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息; @+ _, W2 R+ U
echo ^^W ^> ^W>c:test.txt
5 d' U9 Z6 ]* X1 J- D- }生成的文件内容为 ^W > W
. i( v. R& N& F6 B, R^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号# u0 s% l" c7 v0 p/ X0 `5 b0 W$ V
& ?( q- g1 o ?9 B0 z' P5 j
27 <
4 }/ Q9 N1 i# n; X从文件中获得输入信息,而不是从屏幕上, W! }$ L1 ]5 l/ o* X: j; z
一般用于 date time label 等需要等待输入的命令* j* V! p& n2 z6 t$ a
@echo off8 @& {: V% o- Z9 e5 r+ H, ~( g0 k4 u
echo 2005-05-01>temp.txt
& t! W/ W" P+ |date <temp.txt4 \% L0 e' `' W( C' d
del temp.txt) }$ o3 @& T+ G5 _6 x. H
这样就可以不等待输入直接修改当前日期6 W2 w% W% h' z5 q' Z3 b
2 y, D; P) M$ _28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
- {& P+ D5 K5 |; E, s& ]2 G& Z命令行传递给批处理的参数+ N* e$ ^& M) a1 v* V [+ {
%0 批处理文件本身* D9 g8 i9 M4 Z5 z g+ K- m2 k
%1 第一个参数
R9 W) w7 g) @2 O% g5 l9 S: F%9 第九个参数
* x) h3 A1 f) V/ F+ V, V: T d7 o%* 从第一个参数开始的所有参数1 f5 l# i8 j0 J6 F' Q, z3 ^4 e
批参数(%n)的替代已被增强。您可以使用以下语法:
' J3 u# L, H6 C3 H%~1 - 删除引号(" ), 扩充 %1
d4 A3 N* `, }9 x%~f1 - 将 %1 扩充到一个完全合格的路径名/ a R" V6 Z0 c2 B/ ]# |) B# c
%~d1 - 仅将 %1 扩充到一个驱动器号
# P8 A& C( v% m# d7 F7 A" ~8 ?%~p1 - 仅将 %1 扩充到一个路径
. e$ I2 p1 [* L, [8 X. N%~n1 - 仅将 %1 扩充到一个文件名
3 n3 D4 L9 v, A1 I/ ?%~x1 - 仅将 %1 扩充到一个文件扩展名
- C+ u6 _! W5 u( _%~s1 - 扩充的路径指含有短名& T5 h* J5 x1 }1 c' T5 t
%~a1 - 将 %1 扩充到文件属性
, k7 ], X! b0 {2 k%~t1 - 将 %1 扩充到文件的日期/时间
6 f/ T! m( F0 }8 F+ d9 K%~z1 - 将 %1 扩充到文件的大小 k' I& \9 ]0 J
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
3 O( ]0 t& n G; }, \9 q( G扩充到找到的第一个完全合格的名称。如果环境. H6 l2 O# \' p1 U( Y
变量名未被定义,或者没有找到文件,此组合键会
- o6 T( n C! V8 ]! V% k0 i扩充到空字符串
" v6 n# N$ Q5 D+ D* K可以组合修定符来取得多重结果:1 N3 L: J$ X) t1 g
%~dp1 - 只将 %1 扩展到驱动器号和路径, E( d% S" [; N2 g) [
%~nx1 - 只将 %1 扩展到文件名和扩展名
: O2 k" j: H# l' b% h% f. \& e%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
4 x8 ^: d( ?4 c& ?, L7 W1 O并扩展到找到的第一个文件的驱动器号和路径。7 V2 w# L7 j- }% C) a- H
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。! n) P( \' K$ [1 N2 q/ H
可以参照 call/? 或 for/? 看出每个参数的含意; J+ I( T: n: {" v- Y% \
echo load "%%1" "%%2">c:test.txt
' t n+ k" @% z生成的文件内容为 load "%1" "%2"( O2 D- |! o% P D+ |0 k/ W: w
批处理文件里,用这个格式把命令行参数输出到文件( @9 W7 f7 h% Q( o c5 f4 C: ^. }
" R4 v7 K1 b& v2 G: @, O
29 if
n8 O R3 s* H% ?8 k' ~' F判断命令, w' E* {. i0 q7 j4 P( `' r1 \
if "%1"=="/a" echo 第一个参数是/a- P% R; e) Q! a6 F/ x
if /i "%1" equ "/a" echo 第一个参数是/a
+ b+ U7 l: _& S/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
' } d8 b( H6 mif exist c:test.bat echo 存在c:test.bat文件
' J* [& P! K* q& Eif not exist c:windows (# J$ F9 D d4 z
echo 不存在c:windows文件夹! h$ N4 K/ y* B
); S6 z2 c& c; i- K
if exist c:test.bat (
! o5 ^0 ]3 L- T4 Zecho 存在c:test.bat e1 a% z* ]2 R7 T! X" L
) else (# d4 y5 p0 W/ J E3 ]
echo 不存在c:test.bat
0 ], k( s3 J0 N4 m)2 A2 Y% b% S3 V# N+ j T# E
30 setlocal 和 endlocal) T; ^* g- ~ {( p) ^
设置”命令扩展名”和”延缓环境变量扩充”
% b7 M! l7 f* ]. T" x/ |0 E+ iSETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"" s9 q$ W+ Z5 o3 m$ O. y
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"( I6 C3 m7 G0 o4 R/ T5 K' V
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充", D3 ?$ l g: U
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
# D% s7 {1 a" `" Z9 `: PENDLOCAL #恢复到使用SETLOCAL语句以前的状态' D& M( Z5 d: n8 |% p# V3 S
“命令扩展名”默认为启用, o) @4 a9 k3 f1 E# M- T' o+ B
“延缓环境变量扩充”默认为停用# e# ~. P, u$ k n; Q- b$ B
批处理结束系统会自动恢复默认值! K4 B: B; C1 ?$ e' P
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程" Y0 }2 y K# F2 ?: v9 l
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确" C8 \) k) p) N
保程序能在其它系统上正确运行- o1 P8 s( E- e0 b9 H8 i+ o* `
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
# H( N8 @& N# B0 N$ I
% m |2 K( @* Y' u31 set
1 [5 |# k: h. D+ Y5 L# U! `设置变量3 z8 c7 Z( C0 S' s5 z) R
引用变量可在变量名前后加 % ,即 %变量名%
2 m( l( P$ o& H. @( L" uset #显示目前所有可用的变量,包括系统变量和自定义的变量3 ~* T+ A0 x# o& [* S2 T
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
0 O" }& Y& a Q6 Y0 rset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=12 f7 |; \) {; M
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2+ p; o' U7 B7 I/ K# [
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
: L7 n: P& m( w, P! s* N: n& @) Oecho %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2& ?$ P- H7 l6 k" U
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2) n3 r3 F1 w% x3 f6 r" ?6 {
echo %p:~0,3% #显示前3个字符,即aa17 B( A) C" l7 t2 n2 O
echo %p:~-2% #显示最后面的2个字符,即b21 q& J& O+ ]- l4 H. Q$ V% q
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b- u4 Z w! q6 Q6 \
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
% k& \0 J+ h- }$ `1 w$ secho %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
# ]+ O' y) a! k& X" Kecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
4 Z3 m+ m1 V8 b3 ?3 O: m( x* Hset p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
$ }; m3 A& w1 b0 ?' Nset /a p=39 #设置p为数值型变量,值为397 Z" t! v1 R+ Z% Q" }
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
# D$ b8 S K Q/ n1 Q1 Qset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用" c6 m: V7 H( Z0 K# l7 h* y
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?! c/ ]+ H& a2 Y2 P* F! q$ x
set p= #取消p变量1 m: k1 ~4 p9 {5 v. k. _
set /p p=请输入4 C9 H- a1 |, \& z S1 l- q; k
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p. T" S% n3 l; m5 N
注意这条可以用来取代 choice 命令% v; s+ Z4 }7 @. H3 h
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如8 y1 q7 m/ ` b9 R. A
@echo off
8 e0 [5 q% K: m( W( a& d+ fset p=aaa* B" x, g' Q; m- l
if %p%==aaa (' O$ z3 I, I, z) K8 M
echo %p%9 I* R( s, x% y7 u( X$ c
set p=bbb
9 l- @" ?$ Z4 W, e2 }" l9 k, u$ techo %p%
~3 n" J' h, ])
5 H* ^' n( B, y) O结果将显示
+ a4 a1 b0 f: C- T5 daaa/ J/ r+ A0 h5 I5 E8 U
aaa
6 C N- j) d+ n J* U( b7 e! v因为在读取 if 语句时已经将所有 %p% 替换为aaa
& P. L2 e4 y1 t! y5 A- ~# A# s这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
- F2 x' B3 N* j9 Z1 H1 e可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!8 I7 A6 U0 ]) K( `$ `; o0 c
@echo off- l' _7 W, } g
SETLOCAL ENABLEDELAYEDEXPANSION+ B& x/ b' V5 `2 }" [9 K4 Q
set p=aaa
|: @6 v7 N6 @. o' X" c* lif %p%==aaa (
# Z. k) V7 L, y; s, i; n8 A' Iecho %p%
8 ?0 H, T% Z6 Y( a; V: ~4 \* S& `set p=bbb' _' ~1 s+ L/ w9 {
echo !p!/ z1 ~5 n: k# c6 T2 a
)7 T- W9 f1 R% }, [3 X* Q3 G7 z7 K, u
ENDLOCAL+ l9 r0 B) i7 q7 T6 i
结果将显示
4 Q+ d( l5 N. S( i; oaaa3 n7 t1 q4 a; r$ E' ?6 F* E- Q4 ]
bbb
$ h l) c% p# Z' u% m还有几个动态变量,运行 set 看不到
3 E D' r2 j2 w. n%CD% #代表当前目录的字符串
% J; |- O( e" Z0 j%DATE% #当前日期
- r# L! h( D7 r8 r) k4 K%TIME% #当前时间
. j' W/ A/ d% R9 V8 E! q! ?%RANDOM% #随机整数,介于0~32767
3 N5 \1 K' G) o# u%ERRORLEVEL% #当前 ERRORLEVEL 值! L/ F& [. F# Z" a3 W, Q
%CMDEXTVERSION% #当前命令处理器扩展名版本号
6 U6 K: [' z# n* T m%CMDCMDLINE% #调用命令处理器的原始命令行; g! h; v5 Q$ Q8 q% B v
可以用echo命令查看每个变量值,如 echo %time%
& z7 W* K2 h. }注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到* {+ h+ j# u3 V8 a" I* \' e) d5 ?; i
3 D0 N ~ f% s! w4 r
32 start" y! ^3 o. }# C
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令& q5 A. }' s9 S& A5 z
8 N" f; ]5 ]+ ]+ @33 call$ p: y, X- w4 M- x
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行+ H7 o$ R6 w+ C: ~
有时有的应用程序用start调用出错的,也可以call调用8 R8 _! M0 W+ l* Q! n& I
2 R6 v9 X9 M6 u. |/ o34 choice (外部命令)
- K- Z. o0 V" d" ?选择命令
. R% v! t5 {& I让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……6 {# n0 C0 Z2 O8 [5 f# d1 m
win98里是choice.com
5 T# T1 ~. ?" m" dwin2000pro里没有,可以从win98里拷过来
@1 |9 Z- q* w' m7 G4 ]win2003里是choice.exe
6 u( J4 G3 u; b2 ~) [2 s0 n, mchoice /N /C y /T 5 /D y>nul* L$ D/ [1 }# \" F. X
延时5秒
0 V) R6 o' b7 P1 w S( _0 h [* m! L$ X
& R; f( b* R$ }4 D+ Z/ o35 assoc 和 ftype
4 O; O& }" }3 E5 K* E0 o% `文件关联
4 d9 \+ n) P: D3 F0 `assoc 设置'文件扩展名'关联,关联到'文件类型'2 c" _& ?! _6 Q! Q: w
ftype 设置'文件类型'关联,关联到'执行程序和参数'
: H& S w+ H1 I/ b( v当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
# U8 s% Z( F' v$ n而是先判断.txt属于 txtfile '文件类型'$ {' Y0 L+ {; K6 {# x
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
5 E( r4 P. s8 v. s- [0 m可以在"文件夹选项"→"文件类型"里修改这2种关联
/ n" k0 l9 P' A* C+ W# G: sassoc #显示所有'文件扩展名'关联8 ?: S" l5 C& O- G" D
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile6 d. F* x9 Z0 T9 q' S) B. S
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
$ a. @3 |1 m2 ^* G; Sassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
( E, R- s, G0 m0 z& b: eftype #显示所有'文件类型'关联9 d" S& h# k% e5 A/ c/ Q
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*) @" L- B8 c/ C
assoc .txt=Word.Document.8
G; G0 f$ e {) F% x设置.txt为word类型的文档,可以看到.txt文件的图标都变了- b7 Y6 s1 b2 Q" E0 \
assoc .txt=txtfile W0 ~; M% t' q1 `& [/ m
恢复.txt的正确关联8 ^, u( x6 y9 V/ p0 L+ W+ N% P" @1 a. P
ftype exefile="%1" %*
7 O% B1 H, I4 h# o9 o恢复 exefile 的正确关联
/ M- C4 I2 I; Y. U y& @如果该关联已经被破坏,可以运行 command.com ,再输入这条命令. c0 g' D. V7 K: P3 _
4 G' @! S/ a7 b/ h/ r( {; b
36 pushd 和 popd- O3 P% h! o# u4 p) X
切换当前目录) z3 ~; G' ?2 Z( `1 O
@echo off
& ^. J0 ]1 J2 A, J1 R6 _% F1 Z* Nc: & cd & md mp3 #在 C: 建立 mp3 文件夹4 ~" l `. s( H+ i' a
md d:mp4 #在 D: 建立 mp4 文件夹: [; i2 a: }& U" K: c- H/ K
cd /d d:mp4 #更改当前目录为 d:mp4
* y) z0 c6 N! s+ T( j$ upushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
6 J1 n) K" n6 A8 y7 q6 U$ qpopd #恢复当前目录为刚才保存的 d:mp4
/ {, e- z0 M5 I4 R6 K/ s6 a- ^/ o7 a, Z
37 for
2 m* [' J7 q) r, Q* h循环命令
) z/ e+ F5 O( a这个比较复杂,请对照 for/? 来看! f: I8 H; {: c \
for %%i in (c: d: e: f do echo %%i. M X( M# N0 X- Y) H A" ?# ~1 W
依次调用小括号里的每个字符串,执行 do 后面的命令: x S5 P' F0 a( r9 K& H$ d; _
注意%%i,在批处理中 for 语句调用参数用2个%1 {+ d2 B3 c! \
默认的字符串分隔符是"空格键","Tab键","回车键"
: g# c" K* V2 B' a/ ~" X# R2 lfor %%i in (*.txt) do find "abc" %%i
& d0 p7 c7 {, S! A2 w; N7 P, V对当前目录里所有的txt文件执行 find 命令
5 |) G( Y+ Y8 _8 ~4 n6 W9 ^9 {6 @for /r . %%i in (*.txt) do find "abc" %%i: t* B) S0 C1 L
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
' ^* _0 `$ |( J7 L ]: F8 @for /r . %%i in (.) do echo %%~pni+ p$ ^ } p' \1 ^
显示当前目录名和所有子目录名,包括路径,不包括盘符3 C+ k7 ~* ~3 Z7 _; f( P
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt+ T5 ?4 |' j! r7 @( }2 K' k3 M
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去6 u0 S0 d, v' U8 n3 P$ C
for /l %%i in (2,1,8) do echo %%i
2 T; S6 w/ x5 M3 h生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1: Q% z7 P# q; ]
for /f %%i in ('set') do echo %%i
2 V& N5 a6 x+ }对 set 命令的输出结果循环调用,每行一个! E' C# X2 t% D2 p9 G
for /f "eol=P" %%i in ('set') do echo %%i0 }) s9 I- L* T, z m2 h
取 set 命令的输出结果,忽略以 P 开头的那几行1 Y! B7 H* h( f* j' T7 p7 l; ~4 Z
for /f %%i in (d:mp3.txt) do echo %%i7 u/ W* {/ A8 O; Q2 _
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
9 j: N/ w6 u8 a sfor /f "delims=" %%i in (d:mp3.txt) do echo %%i: @8 `3 ^" m+ g* @: @2 D
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
" z4 V6 O, z' h5 Y/ H8 ^4 O9 nfor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a! b% i: u) v2 t. U( P: l
对 dir 命令的结果,跳过前面5行,余下的每行取第4列
1 B$ T: b" C' c, v, w. D每列之间的分隔符为默认的"空格"6 r8 U( M' ?9 [
可以注意到 dir 命令输出的前5行是没有文件名的1 e' e3 h! O- r+ M, C) a& `
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
: h& Z% |/ t8 A+ [echo %%a6 o" ?( G5 e! ?( v# T- }! ~
echo %%b v' ~3 r0 v7 L3 W; a9 M' c3 O
echo %%c0 A: x' q4 I' p/ g6 t, |
)3 S' [: L* v6 ]. o3 q
对 date /t 的输出结果,每行取1、2、3列9 E5 I# j4 G+ a- V; K: h1 X
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列8 p" X+ M; w4 v! W* U" M+ d
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"9 }+ ?/ K: P% U1 e3 H6 W4 [: K& O
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
8 b- {* e, L& p4 k1 xfor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b6 T/ ^5 w) p/ C+ V* W2 K g7 v
取第2列给 %%a ,其后的列都给 %%b! [9 K6 J) w+ ]7 ]4 k2 B
! Y# l {: S+ b: `( C% p
38 subst (外部命令)
]: e$ w: ]/ G7 q映射磁盘。" P+ k8 F8 R `9 h& A" ` F; d
subst z: serverd #这样输入z:就可以访问serverd了
) Q/ O/ `# d4 v3 I8 G5 ^subst z: /d #取消该映射
1 ^5 U, B: F1 ^3 ~subst #显示目前所有的映时
2 h- s3 v: G- G1 G# ? y
9 i$ G$ w$ z# @) v. o39 xcopy (外部命令)4 I9 |. S/ A8 s3 @7 p! e
文件拷贝
8 w r7 P2 K+ V8 z- ^5 Wxcopy d:mp3 e:mp3 /s/e/i/y
: _) y4 `6 `5 u* H) }) N8 `2 l复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
: H4 `$ y: E0 ^加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问' l8 K# l' K' c5 S0 U1 D
2 n0 X/ u, _9 Q+ w
常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退) |. Q: w6 _" Y j/ j
- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:2 q1 c3 H% R q* o
$ E% D$ z, X7 f7 D U; @( S
@echo off
+ I# H, u% v, h1 M; H: X: wset p=aaa
+ L* N: T0 ~: h% ?. qif %p%==aaa (
$ J; | V- i- W" Jecho %p%/ u( [2 |- a! f4 ^3 k% }) y
set p=bbb
# O# F& l7 o& R1 G+ Xecho %p%% _9 H1 V: o1 S+ ]$ u7 E- x: R7 l
)
, O0 [5 ~" P1 rpause
截图:5 a0 N4 V( {) d: Q
2.批处理.bat 文件中输出中文乱码 * b0 |) { Q7 {4 x: r- Y
- 原因:记事本新建的文件,编码不是 utf-8
- 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
- 操作截图:0 y) E9 E1 G0 w6 E# f* O
- 效果截图:
9 h* A$ S" T4 X, v! g" n
9 M; F6 w/ i3 U; p8 ~- U 9 C c! H' a+ V. \+ c" w
0 P" }4 g& L9 {9 C
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|