|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!
$ L9 q) h, n0 E( c. `$ e 前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效* N3 _2 V# i/ u5 j; e% Z9 |( I+ `
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展0 ^% N* j6 Z8 r
名为bat 目前比较常见 的批处理包含两类:
; ], T7 x0 l+ y+ q, b' ~- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理* U. P A0 r' ?* l% W
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
^& |1 }4 [4 d. E命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件 * [7 A* \- w6 F( c# g
怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
6 [$ P$ h( M6 o! ~7 A9 V 批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set. ]' `' ]- |& c" I2 t4 I
批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||
9 n. Y- U9 z; z2 @ 常用DOS命令- 文件夹管理:/ \& ]4 `% I4 U( w$ ^0 ~
- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。
' a/ L2 H( J8 V( |$ V" e: |
- 文件管理:
5 z7 }7 O* c) y+ H* d' O' \+ [6 n- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同
' |, v+ |9 h& h
- 网络命令:+ d/ K. ?, T4 p+ E
- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表
% s' p6 V$ v* |; H5 S$ j
- 系统管理:$ a9 k6 m" N* G6 i! T6 S
- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置
e9 R0 Z1 L$ v& j0 g + F& F8 ^* H: b0 i+ R* n
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
% x* x# }$ s6 M. u$ @/ R7 Y% q4 ^. C" j+ v
Windows Batch 常用命令8 z* Y/ ]4 t. T3 r, k
1 echo 和 @
+ h) q& i& v- D$ s# ]回显命令" D j4 l) H/ r* z# Q$ P
@ #关闭单行回显 Q4 Q8 E6 v1 ]0 H( x: a6 c
echo off #从下一行开始关闭回显
) V& n# \% r8 R& l' t; Y@echo off #从本行开始关闭回显。一般批处理第一行都是这个
! a; w0 _9 O: i9 {: p1 q- j+ Fecho on #从下一行开始打开回显
5 V* [ a3 T+ U2 m+ P& jecho #显示当前是 echo off 状态还是 echo on 状态- y2 Q8 _: r1 ]4 c, O X2 `
echo. #输出一个”回车换行”,空白行 |* e$ q2 a- \. p! S( J' t
#(同echo, echo; echo+ echo[ echo] echo/ echo)
5 M: k3 N2 O& C
# W5 k$ R) D$ I& u$ l% V2 errorlevel+ }. a' e: G, e- }9 o: L1 S
echo %errorlevel%
2 t) c* m9 D5 J+ d6 [每个命令运行结束,可以用这个命令行格式查看返回码, R' ]+ T9 h) L' X8 `* u, y s0 b
默认值为0,一般命令执行出错会设 errorlevel 为1! \7 ^% Q/ w& H1 L4 H' t. E
( x2 M1 F. x# [$ F9 B3 dir0 H& q' I4 @) E
显示文件夹内容' `- G: O, Z" T3 R5 ~
dir #显示当前目录中的文件和子目录
4 `$ e7 y4 O6 L! v% a# G# idir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件0 @( u! e* @$ m# [: s" b; I
dir c: /a:d #显示 C 盘当前目录中的目录; \9 i8 d$ V7 o {# d9 M7 U
dir c: /a:-d #显示 C 盘根目录中的文件
+ L: W" D: L- X B2 udir c: /b/p #/b只显示文件名,/p分页显示
: G* z# c0 o2 d" U { _" I' ]dir *.exe /s #显示当前目录和子目录里所有的.exe文件* p G0 ?8 s' y! c) m/ w
5 z* C' s1 K- t, ]# V4 cd: { n' [ O$ ^' m. T/ b
切换目录
* d$ l8 H9 i0 o8 }1 @- B/ Z- ycd #进入根目录% W$ ]- A" |. ? U6 i# E, E; ^: r6 v
cd #显示当前目录
( G i, C1 o* T- w! C( ?9 v5 a+ Gcd /d d:sdk #可以同时更改盘符和目录
) t; m3 y2 A7 y* e
1 z* r C7 I z+ t6 d! i5 md$ V% J( _1 i# |5 P r, R2 N
创建目录) o' Y) d9 v' K4 _6 P/ U6 X
md d:abc #如果 d:a 不存在,将会自动创建中级目录
6 h! t& N ]1 \& h) O; n2 {3 Z#如果命令扩展名被停用,则需要键入 mkdir abc: d" t( N% ?8 I5 O
* V) ^& M% w* d: L9 r- J/ [6 rd' M/ L2 `. K K, j4 H, D
删除目录 `0 ~) u4 @- `* @' \ ?4 ]
rd abc #删除当前目录里的 abc 子目录,要求为空目录
' }& }' T$ ]3 I0 G$ b$ A' jrd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式$ I0 v d. y+ I7 G
* t' N5 W1 T* p9 G3 d7 del
* h* h* r" }; f7 t, Y$ j$ I删除文件
: \0 Q7 ^+ O1 S8 b tdel d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
; V- _9 w/ I; edel /q/a/f d:temp*.*! d l) q5 Y# k$ J* ^! X" n: k1 ]
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
( a1 o" I, s$ R6 @) g5 udel /q/a/f/s d:temp*.*
, f% `, T0 R# T* m/ @删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
& E$ B8 Q' r/ ?3 {& u. g0 v# n5 d% g0 r5 @( `6 E
8 ren' t, v, R! {6 \6 o
重命名命令
C( I5 n; ^- v Z7 V6 B5 I9 y$ {ren d:temp tmp #支持对文件夹的重命名
2 e5 O: E0 D( t: W: _
5 D. i, Q5 q! z* v! m# P1 ?" M9 cls
$ T, [2 _% h( i) a- z* o9 f9 |/ ^清屏
& c1 L2 ^& d: x( R- M1 c- N10 type& \$ [2 u: o2 Z' v% }- }" B {. P& D
显示文件内容
9 x7 u% o1 B, Q. w- w+ ~type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码0 \( y' ^5 x" n4 y# _
type *.txt #显示当前目录里所有.txt文件的内容
6 Z$ ]7 b9 @" f4 B
7 Q, d( l- [2 ^* H& K n11 copy
$ [ R2 h% N1 F& o$ F+ M拷贝文件
# J/ u+ Y" |& e" |: I Gcopy c:test.txt d:test.bak
% E- y# k+ o, N& d* n. A2 }3 Q复制 c:test.txt 文件到 d: ,并重命名为 test.bak, i z( n6 I7 {) G5 {3 i+ `& O2 {
copy con test.txt. M4 e1 O/ [0 M& D$ x
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
4 ~6 z4 N' k4 ]' ~con代表屏幕,prn代表打印机,nul代表空设备
- ~' P" `) z8 _$ Pcopy 1.txt + 2.txt 3.txt u6 H) G- }* l- q
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件2 u q1 @+ e/ ]3 [' p/ ^3 w8 M; a
如果不指定 3.txt ,则保存到 1.txt
& z2 h, `( Z% c2 H% |copy test.txt +. A L" L" [" Y9 M$ Z
复制文件到自己,实际上是修改了文件日期
! Y4 [! x; ~! H* r7 o6 j
( m$ V$ r% Y4 C h, }' F/ F12 title
8 S2 |- m7 E, Q* x8 U3 o# i$ |/ G设置cmd窗口的标题
- X# i7 B) P# ?! }5 z6 h$ o; T' `8 ctitle 新标题 #可以看到cmd窗口的标题栏变了0 o7 D# Y2 r# C' z
. ~1 t/ i, M; T/ u
13 ver& T0 d1 C# V& n; c6 i; a: }8 S
显示系统版本
" h8 l7 V" R: N/ F! ~) ?$ t* T) X5 | I# ~
14 label 和 vol
2 g: h8 R/ n$ F4 A J设置卷标. g0 ]% A# i9 G
vol #显示卷标
3 U- t- q' P M. x; `# M/ \label #显示卷标,同时提示输入新卷标
7 P5 K) q+ ]5 n! F& L; B5 ?/ ^label c:system #设置C盘的卷标为 system
1 S3 k* Y3 k; T* Y: ^, Z; k& c G Y
% H* X' }; H' V- U# @. [8 o15 pause. S( ]0 k9 Z( J# y9 d0 m/ _
暂停命令) r8 z- s/ j* B# U7 M* E2 o
$ Y+ L( E' N4 z# n7 G- H0 t
16 rem 和 ::4 q" G' S3 O, k; B4 s1 C2 a) ?) M% E
注释命令" O- v# _! J7 _" y; m' w% _+ J
注释行不执行操作+ P8 \8 O; e, L+ }& d
0 f1 \. t4 c* f1 f8 T \
17 date 和 time
. b4 n* O% o8 j6 v' z5 K日期和时间9 ^. {0 `6 u7 H) T' n: x Y" x
date #显示当前日期,并提示输入新日期,按"回车"略过输入
; t9 @, v( j" l5 ?6 R0 s$ Qdate/t #只显示当前日期,不提示输入新日期
9 v/ a& q: u' |" p" ktime #显示当前时间,并提示输入新时间,按"回车"略过输入
7 Y3 X% m* X( w* [! s# F0 Ctime/t #只显示当前时间,不提示输入新时间4 ^8 O1 {' u! S' O1 j: o' D
) c9 \+ A8 ]2 }8 w18 goto 和 :* b1 d9 \( L$ a. j G& G
跳转命令 } E7 h( j: _6 U& w, r
:label #行首为:表示该行是标签行,标签行不执行操作
: ~( j9 X( L' F! k. M$ ?' P: E% w; Egoto label #跳转到指定的标签那一行+ F4 }) L# P" n _/ j& s7 c
+ @ G: m9 F/ t9 [( Y: G" ?19 find (外部命令)2 z( ~0 @5 f& ^7 ]
查找命令+ K* N0 m$ \, _' q; ^
find "abc" c:test.txt- C; b& D& e' F% H. L, b; B
在 c:test.txt 文件里查找含 abc 字符串的行
* k1 v1 l9 }% q( B1 F+ Q+ S如果找不到,将设 errorlevel 返回码为1
* Y6 Q, y) o8 ]& T. Kfind /i “abc” c:test.txt
6 A# H: i7 ^3 [4 J0 U查找含 abc 的行,忽略大小写
( d: V4 x; T6 \. z7 d; z; Vfind /c "abc" c:test.txt8 W7 }& K* B- x$ K1 Z
显示含 abc 的行的行数, N/ q9 t* k' @& ]4 [
& Q7 a. E7 V% R( D3 d+ Q( A20 more (外部命令)
8 U. a% g8 [) P* V6 k5 i逐屏显示6 l5 r* Z9 {5 V9 f) Q' Y9 m
more c:test.txt #逐屏显示 c:test.txt 的文件内容% q( o8 Z3 ^5 G# }& i2 T
Y6 |, a3 h1 P
21 tree
& }$ `' E% D: J显示目录结构
7 ^2 v9 r9 H. j+ G5 Gtree d: #显示D盘的文件目录结构4 u! k6 p+ ?+ c% Q' `
; e* b2 v/ B6 {1 |( f+ Q
22 &
9 x! _& J! r, `) v9 ~# G顺序执行多条命令,而不管命令是否执行成功
7 ?: K1 s1 s% N3 R; t% K$ Y4 L" a0 ?
7 U: Z/ q p4 M23 &&
1 g3 O; O+ e# K" K, l; w# N顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
7 _( B! L5 I) p; |1 yfind "ok" c:test.txt && echo 成功8 T! h4 e3 E. u1 {/ S
如果找到了"ok"字样,就显示"成功",找不到就不显示2 `, Z7 p+ F. c2 ^+ M
/ h1 P+ l! T- @. X& H) @24 ||
% S! t" k! s) K( }' K5 @! D顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
]9 Y5 |" z3 D! c1 k+ ofind "ok" c:test.txt || echo 不成功
% z, E2 V4 A6 C/ o如果找不到"ok"字样,就显示"不成功",找到了就不显示& G" B" K1 G- h3 S }. N! D
! f$ e+ R# R. T: ?3 @
25 |4 \, X0 X! I! Q8 }
管道命令
& ~6 u& G9 u j# gdir *.* /s/a | find /c ".exe"' l- o- E2 y1 A
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
( y+ a0 ?) D1 ^: c: H; g8 @1 ~. }该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
+ p) y, g0 o2 Utype c:test.txt|more9 L1 x K3 Q, _ N
这个和 more c:test.txt 的效果是一样的
3 U+ P' o( n- V, ?9 Y7 m, ]0 U
2 V) i: ^: f" w; i$ Z" x0 u26 > 和 >>$ J4 x3 R% S" \+ |3 z, k* p
输出重定向命令
. g/ s9 M" s X6 t' r> 清除文件中原有的内容后再写入
& [ w, z( q/ I0 h/ v4 H t>> 追加内容到文件末尾,而不会清除原有的内容
% r) h+ [/ S5 n+ ~& B主要将本来显示在屏幕上的内容输出到指定文件中
6 S9 @4 G. S( i8 c a2 U: b指定文件如果不存在,则自动生成该文件: L! p& H1 Q7 i" r5 f" U
type c:test.txt >prn# M1 X0 Y9 f7 a, {( h& J8 @
屏幕上不显示文件内容,转向输出到打印机- {" l5 A8 S' a: Z, `! y/ _% t+ f
echo hello world>con
" G* ?9 q9 C; K" ?( }: L, m在屏幕上显示hello world,实际上所有输出都是默认 >con 的
6 f5 S* J: J6 T5 @5 pcopy c:test.txt f: >nul
4 @4 w- P* T- z5 B2 Q H6 {3 @拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
% S2 S* S. O* Z: tcopy c:test.txt f: >nul 2>nul
# Y4 i/ A1 [ V$ z0 j2 A不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
/ _% I/ ^6 a; @' }0 r8 T; r* }$ techo ^^W ^> ^W>c:test.txt" ?) J; x3 [* ]7 }/ i2 Z' i* `7 B
生成的文件内容为 ^W > W" j- k+ ^! M, m: X
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号' V: a& L; H7 X2 N, I
C$ b! t9 X- a! g1 A* O27 <5 I# T8 I# a8 x( y& {) c$ X0 T
从文件中获得输入信息,而不是从屏幕上
" G9 \3 {; w5 v _8 V( F% q一般用于 date time label 等需要等待输入的命令! Q7 ]; b: h* A$ z; b! z
@echo off0 ]7 b5 K7 O8 z! V9 d9 J+ h
echo 2005-05-01>temp.txt9 [" V; ~; ?* A. `4 D
date <temp.txt& ^/ H( Y2 j2 u' |- \5 H2 d
del temp.txt
3 w% d5 h# [& a) v0 L7 f这样就可以不等待输入直接修改当前日期0 b# v" q# k6 g- _3 J
- T7 {) n, |+ a: T+ U. }
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
4 \- _- D6 D+ c; M3 B, v% s命令行传递给批处理的参数
. T/ X3 q0 L" r( z4 b%0 批处理文件本身
: o7 t% i% C- n/ q) _, K8 \" k%1 第一个参数9 P! X6 B' K' N1 l8 g1 p
%9 第九个参数
2 B0 o1 y( e9 p. l4 k%* 从第一个参数开始的所有参数
! D- }+ A' p* X; P' a批参数(%n)的替代已被增强。您可以使用以下语法:
+ m/ G# }& [* y5 t1 q%~1 - 删除引号(" ), 扩充 %1
; ~1 r8 M2 }+ |$ j) N%~f1 - 将 %1 扩充到一个完全合格的路径名
1 m- K8 T$ |* T1 y1 q8 Q/ [9 M%~d1 - 仅将 %1 扩充到一个驱动器号
, E4 o( z& i3 D+ F; x%~p1 - 仅将 %1 扩充到一个路径2 ` b& U8 ? y
%~n1 - 仅将 %1 扩充到一个文件名
& b/ x, y6 n5 H; q* Z. q% c%~x1 - 仅将 %1 扩充到一个文件扩展名
$ H; D7 {+ b- e! q" I) D: Q. I, n; o%~s1 - 扩充的路径指含有短名6 o! a( ~- t& I
%~a1 - 将 %1 扩充到文件属性
( c7 n. Q+ p. H) W%~t1 - 将 %1 扩充到文件的日期/时间$ T- v: a$ d; s. ^- x
%~z1 - 将 %1 扩充到文件的大小0 f2 i# S8 Z( ~6 _
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
7 U& T) |3 e0 m; l- F扩充到找到的第一个完全合格的名称。如果环境+ J2 e, D i4 B/ Y( M& i
变量名未被定义,或者没有找到文件,此组合键会) b+ u9 S6 X y% Y
扩充到空字符串+ }: n( X/ P5 P. E. X3 w" P
可以组合修定符来取得多重结果:" r4 r8 f. y3 b( n, G
%~dp1 - 只将 %1 扩展到驱动器号和路径; c( ?4 B3 y/ [5 z! u
%~nx1 - 只将 %1 扩展到文件名和扩展名
/ q' l5 {$ Y) I% H" Q( |%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
7 C, W2 G/ F/ U+ b2 ^并扩展到找到的第一个文件的驱动器号和路径。
0 W7 U$ a Z* ~%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。$ N9 B# A0 h: b# K- D- v
可以参照 call/? 或 for/? 看出每个参数的含意
. e( p2 ]7 T t# p. V3 ?echo load "%%1" "%%2">c:test.txt
% A: n: o* O& I Z& y生成的文件内容为 load "%1" "%2"1 @ ^8 R; C X9 \# R& B4 A
批处理文件里,用这个格式把命令行参数输出到文件
( Y) W" _" X8 \' N8 _4 b v9 B9 l o. H! E7 u( e6 U. C
29 if
# ]% }) C( u) `# V判断命令8 k# N1 z# l7 m/ D/ t4 s
if "%1"=="/a" echo 第一个参数是/a
* j0 s" _3 `; c. n6 ^; bif /i "%1" equ "/a" echo 第一个参数是/a4 U# y& x: q, i5 G# [1 M
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?4 d4 d! j; g" E
if exist c:test.bat echo 存在c:test.bat文件
3 e1 p: d7 t; f/ x6 ]3 [if not exist c:windows (# i) O- p6 r; B- W6 o4 w
echo 不存在c:windows文件夹0 W# V: R* [, _4 ?9 ~+ ^
)/ I. A* b/ `8 E4 y8 F5 q
if exist c:test.bat (, l; a% Q9 {3 E4 w+ @" z1 P
echo 存在c:test.bat ^8 U$ f8 z4 a4 }% b7 I
) else (
. ?. Z1 s/ h+ b% M! e: M# b/ Lecho 不存在c:test.bat
* n* m& P: J0 S0 y5 r% K1 N$ h)1 X5 c( |) h4 ]! t; }
30 setlocal 和 endlocal
2 ~4 ]" k1 S. Q# Y( h6 u1 Q; i设置”命令扩展名”和”延缓环境变量扩充”
+ t3 f/ C5 T2 B' p4 `- p5 `0 N% jSETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
- g& ~( O* Y, Q# c* J6 q5 s4 hSETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
1 O: |0 E- {" VSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
; o" c9 s( K: l0 X' {& e7 ]' eSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充" q- L0 ~$ \+ T0 c% e
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态
) i1 e/ z, x$ x: |& @“命令扩展名”默认为启用
$ e* T: E: ?& {" K8 s& M' b“延缓环境变量扩充”默认为停用* O8 u5 x, @- z1 q, R
批处理结束系统会自动恢复默认值
6 J: Z; ^- h" @9 s; R, m7 M" F可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程5 |: T6 w* x( I3 g" y
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确1 | ?; G( V; E4 f
保程序能在其它系统上正确运行
' U( T7 M' E7 C* G! Q( W$ N9 ~"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
% j+ p ?' P& b& P2 C$ z! A
" i$ r: G* u" c: q. F$ R31 set3 h4 D; j5 Q3 g/ e( V
设置变量
; V# y& X8 ?9 P引用变量可在变量名前后加 % ,即 %变量名%* v. z, u) i* Z3 o( [! o* q
set #显示目前所有可用的变量,包括系统变量和自定义的变量
5 a) b( L( G; Xecho %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
+ v: U9 `9 i5 w' b6 r4 i# Qset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
. b+ Q( v8 e' g: I3 u5 x5 c4 Nset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
, ~+ E+ n \2 Cecho %p% #显示变量p代表的字符串,即aa1bb1aa2bb25 E" f* g6 J: F6 b1 z
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
# P3 }9 u0 r+ c. l/ J# f+ [echo %p:~6,3% #显示第6个字符以后的3个字符,即aa28 D6 |) g, N# T1 ]
echo %p:~0,3% #显示前3个字符,即aa1
9 P* D4 `( K1 L& Xecho %p:~-2% #显示最后面的2个字符,即b2
! O( c1 z2 d& t3 m- pecho %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
4 w& a" `+ O! K0 Decho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb24 _' }( _: S, n9 b5 |$ }) ?5 [
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
+ e( _4 u( X# C; I% w( lecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
4 r, M9 U* p) h/ F4 Z/ Mset p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb26 F5 _& z7 U; D
set /a p=39 #设置p为数值型变量,值为39
& }2 K7 k0 S. z. ?8 A, Kset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=35 C, X- ^; x3 y
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用0 o1 O+ j9 x4 A% f, J7 C) S
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
' X7 `1 h0 X) l% \set p= #取消p变量% _0 Q# `, r' z' d3 j# |* {
set /p p=请输入
1 q2 B3 d' r( ?3 M3 ?6 j' r& A屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
+ Y' ~; n+ X8 ^/ b6 O注意这条可以用来取代 choice 命令
9 _: `' z2 Y& v; K5 K4 C注意变量在 if 和 for 的复合语句里是一次性全部替换的,如; }; }) f$ m# I, l
@echo off7 a& P2 d8 ~7 Q6 X
set p=aaa
1 x) e, N/ \) {! u6 o+ t G) Vif %p%==aaa (
% o- @4 A5 D; y. h, }. q& S! Fecho %p%$ y# N9 e8 I) G& ^- o9 @- s. g
set p=bbb
) C# T( l$ v, M# @' i$ ~echo %p%7 [" c$ b8 ]' T y1 ]7 x
)
+ A8 H7 i0 V; L! c$ p2 c l; F4 y结果将显示1 y- Z# L' Z4 v, k
aaa
4 a" C3 V, V) W: c5 }aaa. S6 v- l N( w
因为在读取 if 语句时已经将所有 %p% 替换为aaa
* z! u8 |+ k. @* ?这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"/ Y# h9 ~6 h! [# T0 [
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
! W7 H/ Y( Z; }@echo off8 R" b4 I# T5 G9 @
SETLOCAL ENABLEDELAYEDEXPANSION
* t x% [6 p7 h' D, z& wset p=aaa
0 \( W! ?7 D3 d5 i. Lif %p%==aaa (( w/ \0 [9 r) U6 C9 a S
echo %p%3 P. M. n2 D7 x* u
set p=bbb
- A' F6 X! p1 y6 cecho !p!
& K; u. I! u* k8 `$ t)
, k. @0 ?6 u/ t* h$ o# eENDLOCAL" R" P `9 @8 k! X
结果将显示! l7 e% O$ x g) Z4 N0 g+ k' }
aaa D+ e; x! h: K3 c# a; j
bbb
, ?$ d- Y r" T& N3 I( ?% r( |还有几个动态变量,运行 set 看不到. ~ L' g5 U4 d, p
%CD% #代表当前目录的字符串
) h8 w) j$ R3 B1 i8 L# k%DATE% #当前日期) Z+ d; m* u8 L1 N* i. |; G
%TIME% #当前时间2 ^, p) ^5 k& O) a! M. R6 Q2 e5 ^
%RANDOM% #随机整数,介于0~32767
- n2 s/ ^+ w) N S( H6 ~) a/ J; E%ERRORLEVEL% #当前 ERRORLEVEL 值$ w0 f) w1 d* D) ~& v
%CMDEXTVERSION% #当前命令处理器扩展名版本号# r4 D2 X$ v5 r v, E4 C
%CMDCMDLINE% #调用命令处理器的原始命令行
2 m1 C$ |- Q1 p0 H可以用echo命令查看每个变量值,如 echo %time%
, U* G% P. Q' u/ T# C9 [注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
( r* x/ Z& y6 B8 }" K ]
?4 [& O! K, M3 B$ a8 \4 L5 o32 start% \+ P' w5 h7 @' ~* U: ?$ V- O1 S
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令% i! m2 }2 {) ?7 ^
) K0 ~. g' j' i9 V
33 call! j0 y$ R: d: m2 E
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
9 i3 @) n. ^6 D1 k有时有的应用程序用start调用出错的,也可以call调用
" }) a. K# r0 U$ Y$ D' q2 \3 D4 n; R0 D/ ?/ v" L' U. j
34 choice (外部命令)
4 X$ @: p; m5 r7 M% Y# L/ c选择命令
7 L3 O9 Q+ m* z3 ?# z" S让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……6 O: X: T' v( ]
win98里是choice.com
5 s t& S# F% c+ W5 y- x0 F9 ?; H: Gwin2000pro里没有,可以从win98里拷过来) Z, R7 \+ G7 t- g( R( D4 u
win2003里是choice.exe! Y2 Y- } Y* m% v
choice /N /C y /T 5 /D y>nul* I# r( \. K1 P7 q9 H
延时5秒3 Y& S% Q7 }+ w5 d2 L
8 }: X8 l4 l i% n* y35 assoc 和 ftype
+ j, O4 Z1 C8 j; [+ _5 V# H' M( n文件关联
$ s; O( A V- ?+ Sassoc 设置'文件扩展名'关联,关联到'文件类型'
, ?1 _( \5 S* [( @# @/ aftype 设置'文件类型'关联,关联到'执行程序和参数'
6 D" L. ^8 l0 P- ~/ ` b" b& f当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
( S ~# V I* z9 l0 L3 N" V而是先判断.txt属于 txtfile '文件类型'
. F& O1 Z% O( S& F再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
2 \& [8 S" l5 B- Z* Z5 `( {可以在"文件夹选项"→"文件类型"里修改这2种关联
6 u- i9 d+ x* S. yassoc #显示所有'文件扩展名'关联
3 u3 {0 n z( Bassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
; ]4 z5 \# u6 U8 r1 @assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.88 }( s; k0 {) e6 Y& b0 ~" Q) ]/ ?
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
8 N6 C8 l& z: w1 L1 B9 I. S: Mftype #显示所有'文件类型'关联/ ^" L9 ]9 ~8 A4 p x1 V& {9 |
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %** Y7 z7 V" J4 w6 I
assoc .txt=Word.Document.8
2 _9 d) [1 L$ q; i* H设置.txt为word类型的文档,可以看到.txt文件的图标都变了
& F1 ]! F) l r4 T0 zassoc .txt=txtfile) S9 o, }2 }* S. k6 _. X. |0 a
恢复.txt的正确关联
9 Y5 t0 `& d& W3 J0 u8 M; Z$ Uftype exefile="%1" %*9 d6 O5 {* i. m! N& p1 v4 x
恢复 exefile 的正确关联* u! _. a# W: t6 K1 v0 I& s
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
4 {4 W; u! l Z% w' L6 W O7 z( z) b0 d% E3 l! |
36 pushd 和 popd" W: p7 K7 B+ E& W5 G' g4 J9 r
切换当前目录9 f" ~- |% q) b5 Y- @
@echo off
6 e. D( T- J4 ~6 J1 B* e" G1 Tc: & cd & md mp3 #在 C: 建立 mp3 文件夹
7 J2 |. n' G. mmd d:mp4 #在 D: 建立 mp4 文件夹+ Y7 m8 q6 _1 Q; P
cd /d d:mp4 #更改当前目录为 d:mp4
u: u% ?% N2 ?" }pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3/ U/ Q6 W# d& { z9 v
popd #恢复当前目录为刚才保存的 d:mp4- T) q. d, o9 K% O2 q
& j9 y. f" z6 ?! i" o: I* o4 w, L3 T37 for0 ?) A4 Q) w4 x% m4 C
循环命令
! \' z# U) \* ]3 O9 f- d这个比较复杂,请对照 for/? 来看
' ]3 Q; H3 f1 t$ _( m# Ofor %%i in (c: d: e: f do echo %%i
' ?4 H4 S! o7 H* z依次调用小括号里的每个字符串,执行 do 后面的命令. |3 F( S0 q5 Q- l
注意%%i,在批处理中 for 语句调用参数用2个%
, U4 f1 D" [1 y默认的字符串分隔符是"空格键","Tab键","回车键"% c' b) t' T8 G: V5 H+ h- o
for %%i in (*.txt) do find "abc" %%i) ~( _2 y3 m5 G% z
对当前目录里所有的txt文件执行 find 命令( G+ t3 S4 d$ c& n# E
for /r . %%i in (*.txt) do find "abc" %%i! l8 T# c0 b5 }# s1 }
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
/ P8 Y# o( ^8 T7 ^" k& Wfor /r . %%i in (.) do echo %%~pni
$ s' m4 K) @5 e: W: f+ V0 t9 P+ e显示当前目录名和所有子目录名,包括路径,不包括盘符4 X: m2 V0 G0 U# M5 j
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
6 A1 _- [5 j. D" E) B6 q把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
- a/ l9 }* _: O4 [5 i8 F: Ffor /l %%i in (2,1,8) do echo %%i2 T% q" n2 q9 U0 k
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加12 x, ]+ S! ` e3 \" d& o1 _( `+ V
for /f %%i in ('set') do echo %%i
6 q D; u3 W4 }对 set 命令的输出结果循环调用,每行一个3 D2 @( _, T9 i6 }$ r( [
for /f "eol=P" %%i in ('set') do echo %%i3 ]. r' v* C6 S9 i; m i
取 set 命令的输出结果,忽略以 P 开头的那几行# L ?+ i) _4 `3 B2 b1 p
for /f %%i in (d:mp3.txt) do echo %%i" R0 c8 u5 O5 a
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
* m+ {0 a( d8 c# K/ T' l+ R `for /f "delims=" %%i in (d:mp3.txt) do echo %%i, M# D3 I# Q- u' j( b# q
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称& K1 n: V, \; u& D+ T
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a/ B8 |: S8 d7 u) R0 i/ g6 c9 b
对 dir 命令的结果,跳过前面5行,余下的每行取第4列0 P5 t6 Q. ?+ c/ B
每列之间的分隔符为默认的"空格" m1 f1 u. W6 Q+ z2 T/ }2 u( p
可以注意到 dir 命令输出的前5行是没有文件名的
. F( y# i# Z% Qfor /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (' T+ E8 L6 {" ^- j" ]
echo %%a
. s& e; e7 Q7 Jecho %%b
8 [2 P" _, [3 Cecho %%c
r& G9 g+ U# z4 i' {2 x)8 `: E. J' L/ {4 S
对 date /t 的输出结果,每行取1、2、3列: u' G# i8 T9 _ M1 s8 P0 ]
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列 ?. f( q3 C: I6 z8 n
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
" z! ?) {+ |$ b) e p其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的% X& O$ z. j, Z
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b4 S( Q+ j6 V+ E: h1 I
取第2列给 %%a ,其后的列都给 %%b
9 a+ ^) F: y4 t [- I& ]% j. m( t g5 `9 }9 {9 @) m# N
38 subst (外部命令)
! a, X9 i' w" {5 K5 }7 U映射磁盘。
" [: I* ?) \; l" [; g+ G* I* Vsubst z: serverd #这样输入z:就可以访问serverd了
# T1 ]5 ~& w. E/ tsubst z: /d #取消该映射
~( `; n5 t! xsubst #显示目前所有的映时
0 ?9 T$ j# D9 j$ ?0 y0 Q# p6 b! B( U* N( P# T' ^6 F* H- J9 s3 @8 \
39 xcopy (外部命令)9 w, \# m, z5 u8 U: v v. m
文件拷贝9 X7 O# l4 h( H, e) |4 L& r
xcopy d:mp3 e:mp3 /s/e/i/y
. d' L4 P) F8 l复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
* {+ u O. Y9 C5 _9 @1 w加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问7 r0 G: F7 ?9 |" }2 }
9 U* {/ {9 i' P" A/ O* k0 s9 M/ J6 i
常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退* a+ n# U x4 i( Z
- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:0 V" h; S% f8 s9 ?+ ^
/ v0 I9 l, }: k( T7 j6 F- q
@echo off
3 W) h: U ~1 r' i7 m3 n+ Qset p=aaa8 Z' r7 h7 y8 k# s3 e, p& s5 v- h
if %p%==aaa (
2 i5 S+ K+ o$ V. H! yecho %p%) i' E) @4 X% {8 C/ D. K+ D! Y
set p=bbb
% T( M: V v1 i' m' jecho %p%
; G- _! X* _! [* b5 e( N2 C)9 _ W5 J7 ~1 L
pause 3 U0 A% ~" k( w8 x J
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|