|
|
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!
; c* x1 i5 o4 X* ^- w 前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效& l7 P9 p( I1 I* `2 B
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
8 ?5 q5 ~, ^) B名为bat 目前比较常见 的批处理包含两类: 1 v: L2 {: P- [. ^5 U8 x
- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
* Y( |: g7 E! L/ R4 q% J
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
h G; }9 @( X# ~6 p$ m命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
/ ]# H, }7 z( j' e r 怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出4 C7 J4 {5 C" H; T% X1 @0 f
批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set
3 Z5 ?3 R/ z- c" F) V J) L 批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||
" i% t) f2 O5 @+ b$ i 常用DOS命令- 文件夹管理:
2 b, q( T: [& E- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。; x! u! A+ B* q: k% J9 t
- 文件管理:
8 t4 u+ X6 n- G& [' B6 B; x x- C/ s- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同
. f+ M, F$ \9 Q- d4 b) Q
- 网络命令:
; P2 |4 i, V6 V- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表
. ^' L2 q6 r; F" x
- 系统管理:1 a6 |: t; t0 q l
- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置5 {+ t8 W- W0 n
" H$ r z& z4 {
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
6 T0 w' n! O3 Y b7 d
1 Y! k. q3 f L; C/ mWindows Batch 常用命令) E0 i/ W$ N% i# p) M
1 echo 和 @" `/ r. z- t$ ^4 Y" G
回显命令
+ {0 T! a# Q8 _@ #关闭单行回显
) L9 ^( J# b. g* `# Z* Eecho off #从下一行开始关闭回显
: l( O9 }! d9 c@echo off #从本行开始关闭回显。一般批处理第一行都是这个; E- ]; z) G/ q' y+ U0 x+ R: W
echo on #从下一行开始打开回显
1 N0 z/ @2 K! ?: r7 secho #显示当前是 echo off 状态还是 echo on 状态
4 \5 p+ B/ K% n* T+ s; M4 m7 I4 K+ fecho. #输出一个”回车换行”,空白行' A8 h" J% W5 t
#(同echo, echo; echo+ echo[ echo] echo/ echo)
9 M' j, r, ]! b& s2 P8 d. E0 O5 d* v u( B" G R# Q2 W& e' O
2 errorlevel
- r/ R1 y0 M/ H1 u( ^, Cecho %errorlevel%
" F. P: l# k5 ~每个命令运行结束,可以用这个命令行格式查看返回码, A) Z7 s3 W$ p: A1 S
默认值为0,一般命令执行出错会设 errorlevel 为1
6 B6 b- V) ^* E" ^& }3 p% N \1 Q$ P: k
3 dir
; u# K; n6 d8 J; n+ C0 h* i; C显示文件夹内容- [) i) t X& I7 g! i
dir #显示当前目录中的文件和子目录
( J/ o- W' F( L9 Q: rdir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
3 ^6 u3 y( j4 M' U Hdir c: /a:d #显示 C 盘当前目录中的目录1 g/ a; q/ N& Z% g/ t+ {. J' G2 k6 [
dir c: /a:-d #显示 C 盘根目录中的文件
1 ?+ a4 z+ W- b$ g) Z, jdir c: /b/p #/b只显示文件名,/p分页显示
' r" c/ s3 y7 v1 X/ C% d0 K, odir *.exe /s #显示当前目录和子目录里所有的.exe文件
/ W4 ]* S; D* a G$ _ |8 u* F) B3 u! ]1 f$ a
4 cd2 \& B0 X( M8 D) L! ?( ^
切换目录
* ^) a/ w5 g! _8 W( F, v8 Ocd #进入根目录
2 A7 k0 U# v$ h4 A$ rcd #显示当前目录
9 Z* a+ e5 v3 z) _7 Ncd /d d:sdk #可以同时更改盘符和目录
8 e3 l9 i8 Q8 g6 ?5 ?; F- k$ v3 }, P
5 md2 D: u) K' G4 r: o
创建目录
- }7 Z" w! G9 P! wmd d:abc #如果 d:a 不存在,将会自动创建中级目录
1 o; Z3 b/ \/ Y. M3 ?! k, ?6 W7 g. F#如果命令扩展名被停用,则需要键入 mkdir abc! [, c4 H" V. i( `$ v8 E
6 V2 w4 i8 f+ P
6 rd# L2 |& N0 P3 g& z L8 J4 o4 r
删除目录
5 T! ~0 Y" n. F5 [; Rrd abc #删除当前目录里的 abc 子目录,要求为空目录' }% O& Y1 ^7 {, g) y" p: X
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式: {1 u1 l3 D1 K7 w t
$ j' t6 D7 H D( t
7 del- I p. _0 _4 l% @, y1 E
删除文件# ^) g* `- ]( S! i2 K
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
9 P% D# j' Z4 B9 x0 F$ zdel /q/a/f d:temp*.*
, O: w; H9 H Q h _删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录+ O- n/ L J o# r
del /q/a/f/s d:temp*.*/ r8 V# {" ? l) f* I+ b5 I' q
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录! }' S+ g# F4 i6 ^$ c5 y. e0 k
1 p' a( R4 Y+ @2 c8 ren# n8 D9 v- W0 F: |
重命名命令8 ]+ s7 @: g6 e3 J/ ~/ a
ren d:temp tmp #支持对文件夹的重命名7 i6 l; y( H: W: s
, j+ ~) x; h- P" \, e, Z9 cls; S! t8 s) F5 l: X8 V2 o+ S' Z
清屏# M, m/ A7 K$ a
10 type
" e% k' U' m2 w8 S! d显示文件内容
' ?2 @% G& ]( Y& a- f( t$ _type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码0 }/ Q+ G: `/ J$ g r
type *.txt #显示当前目录里所有.txt文件的内容
! }# i5 d% x+ Y6 _+ s
& b6 q1 b& W4 d; {11 copy. S( n$ i, E! n" y. u& y
拷贝文件
L' T% m ?5 r1 ecopy c:test.txt d:test.bak
: u" j+ B" V) c4 e j& H复制 c:test.txt 文件到 d: ,并重命名为 test.bak
; ~" G- s& G3 zcopy con test.txt% M$ r* |. Q+ R/ c" a
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
4 H; F4 d: K3 i. f0 n7 v% jcon代表屏幕,prn代表打印机,nul代表空设备+ ~8 y4 _: x( ?& A- ~% D3 D4 ^
copy 1.txt + 2.txt 3.txt7 {2 T! J9 S% x
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
+ o9 W( u9 f) E7 X3 @- {1 L, O如果不指定 3.txt ,则保存到 1.txt
5 L' l1 A8 u* A" \! t* n& J6 _copy test.txt +
. r* T+ Z, b* [! P) p' M6 X复制文件到自己,实际上是修改了文件日期
' n. w# j4 n( m1 z, ^# L5 [
' v. p T+ |9 k9 T, u12 title& i( T8 Z6 G6 c; y5 C3 h
设置cmd窗口的标题! M/ } ^% R5 b9 m) V
title 新标题 #可以看到cmd窗口的标题栏变了
v/ B) i/ x& Z
; s& O9 P9 U1 V% d x! y; H13 ver
: D5 d2 x& x) C0 K显示系统版本
& x( r- N, @- }# u1 h8 }1 k. U7 A3 m/ W
14 label 和 vol# P2 T$ D4 M; ]
设置卷标
% Z* d6 a/ H& ?0 ]1 Svol #显示卷标
6 C1 i6 B7 B/ [2 a/ zlabel #显示卷标,同时提示输入新卷标3 Z& r- f$ M1 z+ ^+ I! R
label c:system #设置C盘的卷标为 system) d, _! {' Q1 e; p
: L" p( S4 e% e% D15 pause2 c& T/ E$ i0 E) Z: m
暂停命令$ G8 W4 r- M* |( K) y/ U
- Q( b1 p1 b# u( W
16 rem 和 ::! |* Z+ a U# i$ H0 u' r9 f
注释命令
! Y4 F- s' `! n" |2 l注释行不执行操作2 e1 y& H* P0 u8 I% @) V
0 t" R$ v. r# P) @* ^
17 date 和 time
# t$ H6 `* b" O7 o& \: f5 E日期和时间: G/ u! ]+ f, l8 |/ o- V' L: g
date #显示当前日期,并提示输入新日期,按"回车"略过输入4 X- h4 T" k0 L2 j; g$ `. n/ z
date/t #只显示当前日期,不提示输入新日期+ K9 t* p, r% ~1 r8 O
time #显示当前时间,并提示输入新时间,按"回车"略过输入
# n* l' B2 p$ r5 _- }9 v( J- r: m" Xtime/t #只显示当前时间,不提示输入新时间
a1 E# j# }6 ~& W7 C% ]" e* j# G+ g; b3 a9 c
18 goto 和 :: V1 s! i* ~4 i1 ~$ \
跳转命令3 F" Y$ ^, L; j1 x2 u: j, G, Y
:label #行首为:表示该行是标签行,标签行不执行操作
t% B3 R& z3 I7 h3 sgoto label #跳转到指定的标签那一行
7 e# j+ B+ j2 k* A/ D" S! t
9 s8 E5 H$ z, C% j. A1 U19 find (外部命令)) c+ C. \4 H+ {1 |- r d w
查找命令7 h0 c' F' p9 V; J$ _2 [
find "abc" c:test.txt! ~: u$ g5 o2 `
在 c:test.txt 文件里查找含 abc 字符串的行
) @0 i% o. E5 X4 o/ p% w Q: M9 w, l如果找不到,将设 errorlevel 返回码为1+ n! m- C; ?! r; `7 a) K f- N
find /i “abc” c:test.txt
% P% m8 z( Y& e) K查找含 abc 的行,忽略大小写
: k& o6 ], |: }2 dfind /c "abc" c:test.txt* x# W& Q: B: T$ N8 ^7 X. V
显示含 abc 的行的行数
; x; ^; v+ ]/ \ u6 R0 z2 Z2 m N; K/ h# \+ q& P4 I! Z
20 more (外部命令)
m& [! k* X! w- Q) M$ _+ a逐屏显示
: n: V* ^. U, r) E. }# t) Fmore c:test.txt #逐屏显示 c:test.txt 的文件内容
6 t- v& }8 q) h5 K/ H A' _- P5 u6 L p
21 tree
- {5 R4 E. v2 K5 y! f L显示目录结构& e9 ^) J& f# B" l# X
tree d: #显示D盘的文件目录结构
, R! z% r6 n6 R, G, r/ t6 z" S# ^4 o' _4 X, _7 y
22 &# c0 ]7 u1 A! w5 U- n2 ]/ V8 ^( X
顺序执行多条命令,而不管命令是否执行成功 D% b+ b# Z, u6 [$ d, f
# d. N: J! u( Z* p! y- W: z
23 &&# m7 N+ r V# }7 U, ]( d
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
9 ? A3 `% ?; y' K" dfind "ok" c:test.txt && echo 成功, e, p# N. E8 f6 y
如果找到了"ok"字样,就显示"成功",找不到就不显示
9 B* D: S5 O4 K; _- b3 n8 _8 \) P* X5 I" Y& ?* |. u0 ^
24 ||
0 ^3 x% E+ } d6 m' l" j顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
/ n5 l' ]& b2 C( G+ {! _& z4 `find "ok" c:test.txt || echo 不成功
8 F9 E* h9 Q* c+ ~4 O3 e L% g如果找不到"ok"字样,就显示"不成功",找到了就不显示
# k6 z& W7 G) i2 C5 V& O
) V. o) M# d( W3 ^' @25 |
. E. c) Q5 ^4 F' {3 h管道命令
& n, i0 q4 C6 H5 l- c7 E0 ^dir *.* /s/a | find /c ".exe"# i" r4 D! S+ f. o" S. J( w
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
" s1 F% B) C+ h& W/ z该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数9 |: _: U( ~6 `
type c:test.txt|more/ e: c A* o/ b$ w* M: x. }
这个和 more c:test.txt 的效果是一样的
* J6 I, F6 ^9 a$ C% _0 @& K7 I8 ~+ x8 S+ ]) I' M' w& n
26 > 和 >>
+ E/ [8 T3 h: i: ~4 z1 }输出重定向命令- Q2 Q% O; i V5 [
> 清除文件中原有的内容后再写入6 F+ \$ n1 s* e$ C! m0 t* |2 b
>> 追加内容到文件末尾,而不会清除原有的内容
, T/ G$ ~& e4 v: a" S主要将本来显示在屏幕上的内容输出到指定文件中
2 s6 H0 }. E$ D指定文件如果不存在,则自动生成该文件
0 B: m$ F5 r5 N: ^" t. s5 q1 C0 btype c:test.txt >prn& J8 H5 x5 v6 [! ^3 f' y9 A
屏幕上不显示文件内容,转向输出到打印机
. u$ t& N3 Y! ?; N& T8 H8 Becho hello world>con
% X. H4 Z# g& L1 `在屏幕上显示hello world,实际上所有输出都是默认 >con 的1 Y4 A" a& C" @. W! }+ @
copy c:test.txt f: >nul
9 D- S1 F" I. j拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息) V( {) r0 p3 O; M0 X
copy c:test.txt f: >nul 2>nul b) [) f9 p3 M: M- T5 Y
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
6 u) w- n4 a c7 ]echo ^^W ^> ^W>c:test.txt
: t- }( a! C. z6 M& S2 P1 H" p- z8 Z生成的文件内容为 ^W > W
& e- c# d4 f, e! u^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号2 U6 j+ i/ p- K/ S
# f* `! f/ t4 b* z: G
27 <* I* E1 ~. S5 m+ T
从文件中获得输入信息,而不是从屏幕上
6 \, o, S. }! N. Z一般用于 date time label 等需要等待输入的命令. v A( @- A) ~0 C
@echo off
5 N0 S* E6 X5 t7 P8 hecho 2005-05-01>temp.txt
# ^! v: K% V5 g3 R* d$ O8 jdate <temp.txt0 d- H3 C7 X% P0 n
del temp.txt
9 Z8 m- m& ?; f" ?这样就可以不等待输入直接修改当前日期% z! ~" y( k, r, N T/ M7 @
$ k/ b. l: I6 p# S28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
0 z; _. e! L* y) N+ l8 C命令行传递给批处理的参数, F! [& V( q! m: K
%0 批处理文件本身$ [$ R9 h' n" v% G* m
%1 第一个参数, u. s' g& ~; Q5 W( ?* t$ `; I' e
%9 第九个参数7 S, u$ W2 S! G/ } ^. a, L& v
%* 从第一个参数开始的所有参数, {% ? ^/ `8 u7 E; q2 P5 t
批参数(%n)的替代已被增强。您可以使用以下语法:+ ]( j1 o% h1 S: y% x3 K
%~1 - 删除引号(" ), 扩充 %1
, B+ F+ s$ l1 O+ Y! T%~f1 - 将 %1 扩充到一个完全合格的路径名
3 \/ t+ S& z: |4 n' P8 E* u%~d1 - 仅将 %1 扩充到一个驱动器号$ v4 m1 k1 S2 i! V
%~p1 - 仅将 %1 扩充到一个路径 v; U3 {9 o9 r* [
%~n1 - 仅将 %1 扩充到一个文件名7 {/ h6 K5 h! m/ G
%~x1 - 仅将 %1 扩充到一个文件扩展名
, L& @* j/ @) W%~s1 - 扩充的路径指含有短名' i" w# M7 G0 B$ z; ]: H- p/ a; z- F
%~a1 - 将 %1 扩充到文件属性" _' {7 e2 W- s h
%~t1 - 将 %1 扩充到文件的日期/时间
; T4 Q! C& Q4 d1 S: X/ y%~z1 - 将 %1 扩充到文件的大小
: F9 w0 q8 P6 e' s%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1" F) H e1 t% H2 T$ C u3 G
扩充到找到的第一个完全合格的名称。如果环境6 l% J1 _' F" }7 i+ o% V! _
变量名未被定义,或者没有找到文件,此组合键会' u2 e4 Z/ Z& Q2 [# T9 v1 S
扩充到空字符串
$ w! Z. r$ @0 q) {" w可以组合修定符来取得多重结果:
- Z* B& l/ ^$ ~7 c3 k/ d0 {%~dp1 - 只将 %1 扩展到驱动器号和路径
0 ?- [2 W) f6 x%~nx1 - 只将 %1 扩展到文件名和扩展名
. x' l4 G' I4 m. Q%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
& E: k* c/ k3 I# J2 f) X并扩展到找到的第一个文件的驱动器号和路径。
7 y5 Q5 ^! @ \2 S%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。: _) C+ ^0 |' q5 M Y
可以参照 call/? 或 for/? 看出每个参数的含意; m8 w' X w; f7 m- t
echo load "%%1" "%%2">c:test.txt) E r# L1 g0 @( C8 b7 V
生成的文件内容为 load "%1" "%2"
( t" B5 E' l' q8 u批处理文件里,用这个格式把命令行参数输出到文件( a9 m, Q6 V1 z' T( t n( ^
9 d+ G( q( T1 \+ k2 k
29 if
" Y& \( r; Y+ k% u判断命令
9 ^- g0 @# R7 I2 C8 Xif "%1"=="/a" echo 第一个参数是/a
) [. o5 \) W; z# R. oif /i "%1" equ "/a" echo 第一个参数是/a X/ f1 ~4 M2 o5 Y0 h
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
) d5 x* A2 R; Q; c& eif exist c:test.bat echo 存在c:test.bat文件
6 p* z( s; p1 p% n( }if not exist c:windows (2 r, \' ~7 H1 F. V
echo 不存在c:windows文件夹: U) {' m! R% X# j
)
5 `3 |6 U' r+ y- X$ S5 [' aif exist c:test.bat (& B) t4 O7 r, k4 T0 y/ C) g
echo 存在c:test.bat" W4 G1 ^$ u, r, g# A" ?+ h
) else () z8 b) X# L1 ^. | Q
echo 不存在c:test.bat
. S1 f4 H/ G1 X4 r, z/ |)1 g0 i4 U: t5 R) g# |0 R
30 setlocal 和 endlocal
9 G0 K; n$ M, a+ N* m" x设置”命令扩展名”和”延缓环境变量扩充”' b% ]) t, O- m( G3 X6 v) B
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
' j7 V6 M- z8 N/ M# M& D. k/ Y b4 c3 gSETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
/ ~5 F! w* ^- _1 \SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
3 J+ j0 d$ S0 v6 r2 w3 @SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
* B6 e" F, R/ ]' b) i' w" NENDLOCAL #恢复到使用SETLOCAL语句以前的状态; p) {. Z1 u5 E3 x
“命令扩展名”默认为启用
- Y, s. p6 t) t: M( Q, ~, N“延缓环境变量扩充”默认为停用1 k9 |2 J; K5 J' t/ Y# i' N
批处理结束系统会自动恢复默认值/ w) W# a, {0 V
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
/ B# M) S! B7 \( K8 ]序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确! ?; `0 D9 c1 w0 U; {
保程序能在其它系统上正确运行
4 n7 u. y9 C8 ]6 ~/ ]5 R"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
9 B: y1 `" j/ b9 N4 A, o( y9 k) C) t
31 set1 `2 q/ M, ^) Y2 A2 s
设置变量, s6 Z, I) s6 c7 y7 ~) W: t$ o0 Z# A
引用变量可在变量名前后加 % ,即 %变量名%. E% E) D! I" J' |0 [- U+ F4 r
set #显示目前所有可用的变量,包括系统变量和自定义的变量- `2 f# Z7 `# E S6 K
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用$ H, a) P( ]& T; T
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
% T% F$ Q9 q2 `9 S# v% p Dset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
; l8 s$ _6 [7 T! Z' E& f) |echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb25 [/ ^& R) t8 Y( [1 H" y# m7 n
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
9 }" U/ S3 ^" r8 C! h Decho %p:~6,3% #显示第6个字符以后的3个字符,即aa2
8 p3 B; t( `% X/ C/ P0 X1 y7 R* ]/ Gecho %p:~0,3% #显示前3个字符,即aa1 Z. `# j8 _0 D, @% i4 f
echo %p:~-2% #显示最后面的2个字符,即b2+ @0 Y5 O1 f9 N5 w8 h) N; a0 }
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
' ^- h' f l1 h& yecho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2- N- X3 K( o! h! A$ Q
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2- f, i( H; V6 d0 Y
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
! f: H& n3 g/ @4 t9 s, Uset p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
( i- A/ t' l/ P5 G) h$ Q) k) oset /a p=39 #设置p为数值型变量,值为39
6 t6 P* A2 ^% G9 K7 g) B6 H; Cset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=34 v' M6 {% {/ H" ~) m8 d" D
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用! y* r" U/ y" X: g7 S
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?7 p+ Z7 v9 J2 r
set p= #取消p变量+ l& \ m X3 q3 V
set /p p=请输入+ x Z, O+ B* ]$ Z# m# s
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p* j& R$ z) `4 c1 [! }+ D: \& P
注意这条可以用来取代 choice 命令
$ ]! P$ H8 |. I% F9 ~注意变量在 if 和 for 的复合语句里是一次性全部替换的,如1 w' U1 Y" d" `6 j" r
@echo off `5 \0 o4 |: G
set p=aaa
4 [5 y' z+ ?' R, X7 eif %p%==aaa (' W9 A# `; |! F5 E
echo %p%) D( o- @2 E2 ~6 i, }5 x% o6 ]$ s
set p=bbb4 y( K/ n* r4 A9 w) R" {
echo %p%* h: X3 F0 J: D6 j
)
6 ^9 m5 n: s) A9 N: r结果将显示
" ?; i6 K& L8 X8 q; S2 h; \; V- vaaa$ L2 I. h" `& K' U- L! F1 R
aaa/ x1 ~3 x4 y& e6 F6 B2 s) ^) p9 H
因为在读取 if 语句时已经将所有 %p% 替换为aaa: Q. s7 H9 H6 i! X3 y6 w5 V
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"% o% I% W6 o$ z, D e2 a
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
9 ~, b6 i" _- E- i! q& ^6 |! d$ {@echo off
5 O/ [# T! J" B2 A# G% ASETLOCAL ENABLEDELAYEDEXPANSION0 b( j; y+ C! A5 \" [+ B9 R
set p=aaa% O2 D( \/ F$ M
if %p%==aaa (
$ j8 l# g" t9 Z& D- C/ R; f; h3 Vecho %p%* P; V! d: S5 G4 i) P, h
set p=bbb
d$ o# ~+ t6 k, Y3 H* P6 }echo !p!
0 P8 W! T/ r1 b. g' _+ I3 Y$ J)* l2 D: n* G8 T3 A
ENDLOCAL$ }; q/ |+ D$ O
结果将显示6 z* L8 q; M1 `2 j. K
aaa+ B0 ]7 N/ O# ?7 n4 M1 a
bbb4 Y5 Y, f# Q$ p3 m3 z5 ? Q
还有几个动态变量,运行 set 看不到
" S; }$ t; z! @& Q! G3 A4 P%CD% #代表当前目录的字符串
5 [3 f6 r- g1 i! E%DATE% #当前日期6 q$ O- R. Y/ \7 B* L+ L& a. R# I
%TIME% #当前时间
; t5 i$ A2 T P7 N8 |9 f% u! l5 A%RANDOM% #随机整数,介于0~32767
! K% V. p5 v, F4 C4 N%ERRORLEVEL% #当前 ERRORLEVEL 值7 K) A( B. U; k% n
%CMDEXTVERSION% #当前命令处理器扩展名版本号
9 ~/ k" G/ N* p5 n%CMDCMDLINE% #调用命令处理器的原始命令行" X. g- X6 f4 g! m# Y- o
可以用echo命令查看每个变量值,如 echo %time%) }/ i. |" Z* T, A6 N: F! _
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到* P) g9 ]0 U& d' y) B
7 x1 E( x# S+ B+ E- }32 start# z1 i6 ~& K2 U: ]0 @9 H9 [- q
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
2 {# \! ]: q q4 q' {6 r+ }
1 d1 C4 V7 Q* l% v9 _5 {; i( O33 call
% P& Y9 B3 x6 b. r$ y2 B5 }批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行; V( p u2 B2 y
有时有的应用程序用start调用出错的,也可以call调用
* ?: @; I z, c; o; k# Y! L E" ^ V1 F8 \' i/ W
34 choice (外部命令)
0 l- E2 P! r' V1 m6 H选择命令1 c/ w; d6 i/ H3 D
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……! G2 f2 F! }! d/ r
win98里是choice.com4 j A/ k9 o2 \8 b+ ^( y
win2000pro里没有,可以从win98里拷过来
9 X' N1 B& l1 Q( T9 m" U. c% |- ?win2003里是choice.exe4 a, j& ]( z+ |7 X
choice /N /C y /T 5 /D y>nul( ]3 ^ y9 W3 z$ t' o& @& q
延时5秒3 d+ A! P# A" h/ k
4 l3 O+ N: c2 H+ h- R! w5 h35 assoc 和 ftype
* f$ A, z+ B; O3 K/ o7 A文件关联+ n; i' U5 h' W( M, k6 V
assoc 设置'文件扩展名'关联,关联到'文件类型'
. p* r1 o; w r" g- S, d& fftype 设置'文件类型'关联,关联到'执行程序和参数'
9 Y* G8 T$ P& a! W3 I. C. k" h当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开' L6 U; B' l+ Y0 O" B7 w
而是先判断.txt属于 txtfile '文件类型'
0 P2 S5 c8 g/ A再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1: t! \, i' c j7 B6 a
可以在"文件夹选项"→"文件类型"里修改这2种关联
* E/ O" S$ N) gassoc #显示所有'文件扩展名'关联& [# L9 K3 A2 s
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile1 b/ w& ^! Q* @) F' l1 w
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8- ?$ C; L; v. \1 c g
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
1 ?& T& I: P" S/ g' b$ ?ftype #显示所有'文件类型'关联2 D2 v3 q; X6 k/ j- f9 {" [
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
, M* ^; c5 C6 ?% B+ uassoc .txt=Word.Document.84 K0 A1 M1 O$ B/ Y1 \( f* ~
设置.txt为word类型的文档,可以看到.txt文件的图标都变了
6 p9 B' X: \4 E" v7 J2 vassoc .txt=txtfile
+ k; c! j8 @! A7 }& ]2 y& h恢复.txt的正确关联
7 K4 D2 s. j3 N# W# H; Cftype exefile="%1" %*
( h7 U, _; o) O6 Q# }9 J0 H恢复 exefile 的正确关联' _4 g; w6 D& N) @
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令+ [# |+ h. j! x8 M7 K1 M
" f: k& M" P! D; D$ l5 W0 b+ n
36 pushd 和 popd
7 r, a4 g9 F/ z. m: ~# B切换当前目录
0 i, h6 T* j$ R% _* P2 w1 ?@echo off& G- G& `) `* E6 E) x8 R
c: & cd & md mp3 #在 C: 建立 mp3 文件夹
) U. \3 Q$ X- b, W, wmd d:mp4 #在 D: 建立 mp4 文件夹( `5 G$ o$ k& _* b: Y8 ~
cd /d d:mp4 #更改当前目录为 d:mp4% I Z, `# b7 f$ |
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
* z3 X) e( t( _. b+ T5 F4 ypopd #恢复当前目录为刚才保存的 d:mp4! G1 @' D, B3 u. d6 G
0 G8 `+ X" O/ O& X; I( u# F
37 for6 l% i6 p' g' S: a2 L' G
循环命令" H7 v& T1 c" I1 }5 b
这个比较复杂,请对照 for/? 来看; q5 l8 w4 p# M
for %%i in (c: d: e: f do echo %%i
0 ~. R" r2 L5 o/ O8 w依次调用小括号里的每个字符串,执行 do 后面的命令
4 g% w6 _( } ]1 ^注意%%i,在批处理中 for 语句调用参数用2个%
0 E* v S! L$ I0 D默认的字符串分隔符是"空格键","Tab键","回车键"
- N" o @/ Z/ M# W7 L% J4 D: Zfor %%i in (*.txt) do find "abc" %%i( G/ N3 R$ K" L) u0 F
对当前目录里所有的txt文件执行 find 命令, j, y7 }" Y# C9 s9 d, o
for /r . %%i in (*.txt) do find "abc" %%i; B) W* t# ^, ^$ _
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行 c8 {9 d0 v7 Y, e- K
for /r . %%i in (.) do echo %%~pni, ]1 d1 A9 h, {' D& T
显示当前目录名和所有子目录名,包括路径,不包括盘符: q% P) i- a5 z( @' `7 f$ n: g+ N
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt4 D I. w2 R3 O0 G# p
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
, @; @' t, m8 g! J+ s! m9 dfor /l %%i in (2,1,8) do echo %%i
+ n& A( o: q' t& z: Y生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加10 K: d8 o8 M+ |6 `) s; o7 [& a, z
for /f %%i in ('set') do echo %%i% f" ]; g. Q8 h4 e. n
对 set 命令的输出结果循环调用,每行一个
0 ?0 n3 K3 A7 K6 H* Z7 t' Ufor /f "eol=P" %%i in ('set') do echo %%i2 u' B+ N5 _3 B3 _' k7 W4 m6 c# H
取 set 命令的输出结果,忽略以 P 开头的那几行; z9 A1 D5 e0 t @; ^# b
for /f %%i in (d:mp3.txt) do echo %%i4 V y- A& P1 }6 Q/ b" g1 A% ? g
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称9 l( T; s/ _% J9 c7 ~
for /f "delims=" %%i in (d:mp3.txt) do echo %%i6 z1 d1 F4 ?3 b6 B3 c+ V6 K
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
) G. }) n( \1 k9 {( nfor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a! K0 _- A) j2 t: ~: |$ b
对 dir 命令的结果,跳过前面5行,余下的每行取第4列% l# F9 W/ M3 b \5 ]- ^5 e% ~! X' J, o
每列之间的分隔符为默认的"空格"
9 x4 n8 Y Y+ r! K0 v3 h可以注意到 dir 命令输出的前5行是没有文件名的- I+ R( q, `; m8 X7 b( f( X
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (: t# Z5 e! j& i7 p: e, ?& T Q# _
echo %%a
/ M t3 R! y- M, Uecho %%b8 w4 ^1 i1 h0 F( [& O$ i
echo %%c f) t+ D3 _8 j8 p$ }. J) H, c
)
/ w* {/ V5 G8 ~3 w8 d* h" o对 date /t 的输出结果,每行取1、2、3列
) p- H" q/ @1 M第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列0 ?" e% H0 I6 @& p
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"" b7 R' {# l' D% a
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的" C2 W/ p5 Q+ Z) a+ o# t# W- k' y* c. m
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
5 f( k6 T; x* \取第2列给 %%a ,其后的列都给 %%b( S+ j' r# V6 f: r* W2 I/ X+ ?
5 @" u. x9 P+ r* A
38 subst (外部命令): _/ ]; A; @& s
映射磁盘。. o# ~* f9 ]! z( g! T' h, Z
subst z: serverd #这样输入z:就可以访问serverd了" k& c- K/ w8 } t8 w9 l
subst z: /d #取消该映射. e; t1 [: t7 ?0 Z
subst #显示目前所有的映时" E1 C! ]$ C+ l6 p; t
$ r# c$ l1 a8 ]0 n9 P+ B+ }
39 xcopy (外部命令); u) Z! _4 f3 R1 H6 z" V
文件拷贝0 W: B/ |! |0 O3 x4 ^
xcopy d:mp3 e:mp3 /s/e/i/y8 \# ^- W1 r' b* @1 B* z( {
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
" K8 c5 J! \' q- j加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
; P/ i9 m8 @) g% X7 K+ c' h+ ^& A4 H) u
常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退; u; d# c. N& `3 O0 }
- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:$ l) F5 g% l; r+ i' ]4 p4 [ G/ q
2 H! K* a+ Q& g& w
@echo off
8 ~8 A0 T w k+ x! @' Rset p=aaa
+ m/ M2 b; w7 h5 a& q+ h1 Sif %p%==aaa (% N( q6 Q# w3 q. }7 a- X0 f
echo %p%3 ^% }3 v8 j+ @) h4 v1 d
set p=bbb4 I; ~( V: F! \7 ~
echo %p% T0 u( A8 { m+ ^6 ?$ I+ n
)# Q! m" c7 o' X
pause
& S% u$ w y6 A6 E" ?% [" \; w |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|