|
|
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!$ x% ]6 L" W) S
前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效9 {3 K* ~6 q3 X5 e! e
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展9 f) e+ @' ?% S+ J7 z
名为bat 目前比较常见 的批处理包含两类:
( E# m% X+ c; Y- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理4 @/ f( _# J1 v3 ]& p* \
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
4 |. p9 |' ^" d6 ?4 ~; c命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件 * r( g' o. E+ A& {2 A) t" k
怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
4 I0 h7 e: `8 J7 g+ |/ ^: g3 G 批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set
$ E2 K/ ~6 B1 |: B; N 批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||* n' k, Q: z$ W1 a/ V5 g
常用DOS命令- 文件夹管理:8 p$ Q2 A: w# i1 @+ \4 m
- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。
' R2 K9 y0 K P4 I+ @/ C
- 文件管理:4 V" U1 r5 Y' t8 }* d( v$ {" @; l
- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同
$ G6 U, i1 l' C g9 k5 j
- 网络命令:
( k7 _% _4 `7 {5 b% l4 c3 w- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表
$ ?# e; G$ b4 }( `1 U. q# j4 M, |: O
- 系统管理: W: L0 v! V6 A) x
- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置
1 ?5 Z% W; I+ Y4 A 3 t; a( v% w% W8 ~
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /? 9 o& f) Z# L \& \; H
$ w; Q$ ]: N8 b& VWindows Batch 常用命令: i$ V- E/ J6 X& P) I
1 echo 和 @
# W5 G$ o) R0 q& g3 Q7 D& t2 P( }回显命令& ]2 L9 f# \* e* K6 [
@ #关闭单行回显
' v0 Q& o: K2 G( o$ C/ t! I9 becho off #从下一行开始关闭回显& v6 m: f/ ` _
@echo off #从本行开始关闭回显。一般批处理第一行都是这个
4 y5 g7 L5 v2 m" k, p' |& secho on #从下一行开始打开回显
3 _. `+ [7 m- x3 E1 o( ]0 s/ Iecho #显示当前是 echo off 状态还是 echo on 状态) o- C' Y- O* h! W v$ P3 W
echo. #输出一个”回车换行”,空白行
, E& R( E% ]. Q- |#(同echo, echo; echo+ echo[ echo] echo/ echo)
% t6 @* Z* v) r0 d1 S/ l; q8 g3 |
9 a3 o1 h" n/ `9 C6 I2 errorlevel
/ p9 V& E7 C0 o& G. G2 gecho %errorlevel%9 V3 H3 f" u; F9 l! Z, i% y& V
每个命令运行结束,可以用这个命令行格式查看返回码
1 f$ }$ Y/ F* `7 V/ S: i- o默认值为0,一般命令执行出错会设 errorlevel 为1
/ c1 j# Y, j7 V# c8 _! k( Y/ N# w2 \, x
3 dir
( S9 s. M9 L0 H3 f& l显示文件夹内容5 I7 B! F3 H2 c2 n
dir #显示当前目录中的文件和子目录
7 w: r( j: _! L1 o) ldir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
$ g) g& d' P( rdir c: /a:d #显示 C 盘当前目录中的目录( e/ C$ p \, B. ]: E% J
dir c: /a:-d #显示 C 盘根目录中的文件; ?3 W: G. r4 C ]( C/ F& U; g
dir c: /b/p #/b只显示文件名,/p分页显示3 H2 q/ U: f; i% e( X- e1 p
dir *.exe /s #显示当前目录和子目录里所有的.exe文件
7 f6 j3 y. D% h- t1 j% a9 |& M" j; r9 F# U
4 cd
0 V" x: e! c! \1 n, Q: E切换目录
2 l Z$ K( G/ T3 X3 N4 Icd #进入根目录
! T$ u1 w+ I9 z2 u6 O* icd #显示当前目录
3 M, E2 \. [5 B/ c* S8 ~3 V# icd /d d:sdk #可以同时更改盘符和目录! J0 A) K3 u7 ~/ ?2 \) B
) e; Q6 e& j) G# W2 C+ o5 md$ K/ F# p7 @+ M6 A4 ~" f
创建目录: j }1 s" J6 s& f% k% r/ V
md d:abc #如果 d:a 不存在,将会自动创建中级目录
. G) h5 ? V: [3 b* j9 s7 z0 S#如果命令扩展名被停用,则需要键入 mkdir abc( n7 t2 q. `9 |' @
% V8 v4 K! t$ S8 }
6 rd
7 O; H9 }8 I- l; N删除目录
! V# o3 i7 t- ]5 P3 ]8 K( P& ird abc #删除当前目录里的 abc 子目录,要求为空目录/ A& P; I# n9 N0 O, j
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式- i$ \3 o$ |" Q: ~
+ i' f5 E7 S3 c
7 del
" s" P" I# a. G1 h! H删除文件+ R- [$ f5 [/ G- ^8 u% ~; F
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件* t% H% U- q2 P7 h# T' k; x
del /q/a/f d:temp*.*! m: ] k3 U. x1 H" O+ x5 }1 Q
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录) Z; z4 y! X9 v! B; u
del /q/a/f/s d:temp*.** g3 s3 z; D2 `2 W) N
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录" P$ K3 u7 p' f; a8 ?7 X( M2 M
4 i" Q. R# I2 v- i9 M. \8 ren
& c7 C! l1 z* S重命名命令' O2 p. a1 s" k+ x3 x
ren d:temp tmp #支持对文件夹的重命名
( f/ N8 R5 |; o6 Q' }9 F$ P" u6 V9 H1 c5 r. w; {" B4 Q. D+ N
9 cls
) `& J4 k# e( x# c1 n9 N清屏" h6 a/ B- Q6 A2 Z5 R
10 type) E/ I) d0 ^5 D H+ J/ R
显示文件内容
" e4 y0 d' C: {% h+ {type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码( U7 C3 v ^5 ~
type *.txt #显示当前目录里所有.txt文件的内容8 y! i6 l6 L8 l6 s U
m. Y) C' Z* u0 B; ?8 D) X
11 copy! i; q0 d4 L8 b4 e7 R5 i6 h
拷贝文件
6 E5 {. H' ]$ \/ vcopy c:test.txt d:test.bak; a5 h$ c# @5 H; g" [- \, H9 M
复制 c:test.txt 文件到 d: ,并重命名为 test.bak
) ?3 d2 ?# [. _5 v. T- Gcopy con test.txt
$ k* s [6 i! F. c( o% A从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件9 n7 [" \) u# t% L& Y6 Z4 Y' u
con代表屏幕,prn代表打印机,nul代表空设备
+ s! c4 e& g& M5 J- b: A+ _copy 1.txt + 2.txt 3.txt( V3 A7 M. X( t! q. ^
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件: E+ ~ \. g; ~( h% I* m7 ~" ^( T
如果不指定 3.txt ,则保存到 1.txt( M- \" G: C1 r# w1 U) f- e
copy test.txt +5 w6 {4 s& i8 ]4 r
复制文件到自己,实际上是修改了文件日期4 _- E! W2 X+ E$ L5 ^ z' A
t! {7 P9 t" q$ z$ j s4 r& b) ~12 title2 \1 ~. z; ` u7 i( x6 |
设置cmd窗口的标题
* D* ]& @+ Q' x; R8 ~, W; F& }title 新标题 #可以看到cmd窗口的标题栏变了
% {$ x8 v- [6 s. E0 L) }& ~' r. b
. ~" N' V6 h. g" }. H( U& q8 }13 ver* [& Y- q* `. g7 Y
显示系统版本8 i) O6 t6 I0 n' r( r5 G9 c
# w M$ @. G( ?9 D14 label 和 vol
# |/ z A3 }; d' N, b. \9 S! J设置卷标
# Z) z9 j6 w t( {5 L2 v% pvol #显示卷标9 P Z( u( }7 [# F: ?5 a9 s3 W- u
label #显示卷标,同时提示输入新卷标7 q% _& y3 G- x( [! e9 H9 O1 r
label c:system #设置C盘的卷标为 system! Y" x7 Y+ i& }9 a) O, e* i$ \
- [+ m% K7 R3 v0 |! u. r s0 e. f
15 pause
; B [" X0 a" U3 d暂停命令
/ ^; Y( u: Y9 P4 i0 e# E% m0 e' u2 k8 P( h3 {0 [* _
16 rem 和 ::- P9 ?8 z& V' I v% q6 c* |0 |" m( G9 b
注释命令
4 ?* F7 E, B- M! |' }5 p6 {. n1 n注释行不执行操作# [& n; ?9 d3 ]# k" M+ ^+ f
2 E1 u1 j: K) Q& U5 E17 date 和 time8 I- P: R5 l$ j$ s
日期和时间* t% X2 X% M) C
date #显示当前日期,并提示输入新日期,按"回车"略过输入# r& _8 R6 S7 } E0 i0 ?9 ]$ |( C
date/t #只显示当前日期,不提示输入新日期
2 m4 ?6 z+ `1 g! J8 F7 B+ L3 Ctime #显示当前时间,并提示输入新时间,按"回车"略过输入( {' D8 x7 o8 A" A) ^, I5 A
time/t #只显示当前时间,不提示输入新时间, H9 T2 f* c& I, ?$ v$ m1 k1 G
) g, D- l/ ]* ?4 a4 I' |1 P8 c
18 goto 和 :
2 X6 k6 @, F- ]9 v- h" F" G E跳转命令3 h' }" N6 x! V0 i$ k! q# Z
:label #行首为:表示该行是标签行,标签行不执行操作
4 E( K' r4 k2 K3 e8 n. [goto label #跳转到指定的标签那一行4 u4 c3 i7 v) N$ a4 G9 y
+ ~0 Z% w, d( a z4 H; g
19 find (外部命令)- E9 X+ s6 b% e! c+ T
查找命令+ L" D9 y2 P1 L3 k, p
find "abc" c:test.txt
- h2 |2 z% L9 |5 ^4 [在 c:test.txt 文件里查找含 abc 字符串的行
5 c. l& O" K$ o& A如果找不到,将设 errorlevel 返回码为15 ~) a4 h7 R% ?8 o: w1 K! {
find /i “abc” c:test.txt
" c' `7 P/ m# ^! W查找含 abc 的行,忽略大小写' F- b. ~* U3 L+ Z( p) x
find /c "abc" c:test.txt9 E" x3 d( x2 k0 o: V8 q: @
显示含 abc 的行的行数
3 {1 E9 g: w" P; v, G6 s" N3 H0 ^1 D$ p; @% a3 p+ h- k2 R
20 more (外部命令)
9 n- p( r8 i* C7 s7 V7 f逐屏显示6 `% i0 Q% W G4 l* b4 W1 e2 n
more c:test.txt #逐屏显示 c:test.txt 的文件内容: q2 K) l1 l7 Z: S
) [9 c! W2 m1 q/ g% A! d6 d) G
21 tree, q$ ]* M7 |' f9 A s' Y( F
显示目录结构0 p* {7 r5 `6 a! c6 C
tree d: #显示D盘的文件目录结构- e4 o" G+ i( G/ |
# n" {6 Z5 J0 n& H: o/ ?0 p9 _3 I
22 &
# k8 L; a: d7 A& z2 E' h3 N0 F顺序执行多条命令,而不管命令是否执行成功
* q0 r- {$ }* o. h2 A; a" I9 q) e, b Q" h- E$ H
23 &&" z: S ^& @ A. k6 F: b" w; E0 Y {
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令/ _& `& z) h$ e3 v2 o
find "ok" c:test.txt && echo 成功
, k$ @, x1 [6 `; @6 \! |如果找到了"ok"字样,就显示"成功",找不到就不显示% c" B/ m c! }6 n% }1 J" B
( f8 c Z/ M4 M: K; K
24 ||
0 B& C6 ]) o) ]6 [0 a- ]- {4 `顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令9 \) ~2 W& r' V7 u9 V1 G
find "ok" c:test.txt || echo 不成功
. D+ q G# I, `( Y3 k如果找不到"ok"字样,就显示"不成功",找到了就不显示6 c9 E j* K, b
9 P1 b" E6 W. N$ L0 v2 O25 |
) ?* U0 P" S7 n管道命令
, I6 ~: b5 l( w) X( s: ydir *.* /s/a | find /c ".exe"
6 l( q! s9 @2 x ]( u管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令& z; B1 }0 u5 }
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
2 v* }8 ~, ~) g( x q$ G8 w; |- ltype c:test.txt|more
$ `2 ~7 n" s; O7 G g% g/ ~* h这个和 more c:test.txt 的效果是一样的
& D1 o( b) u; a! l
/ ^0 [5 i$ p, x1 B7 j2 F26 > 和 >>
/ T* Q5 U, [6 |4 G0 Y8 B3 Y! _输出重定向命令
1 \% C1 F/ O6 G; K! ^> 清除文件中原有的内容后再写入
( x) v n( @5 G2 h; A5 R>> 追加内容到文件末尾,而不会清除原有的内容 F7 y2 `) V2 |0 W+ q7 }9 e
主要将本来显示在屏幕上的内容输出到指定文件中6 \% J0 }' Z6 L. V
指定文件如果不存在,则自动生成该文件
) B' Y7 O, C' A1 S4 wtype c:test.txt >prn% b. H0 l7 ]/ z# m
屏幕上不显示文件内容,转向输出到打印机9 I X C$ o' n }; Q) {
echo hello world>con# k% R( L7 B$ \5 c" B' B
在屏幕上显示hello world,实际上所有输出都是默认 >con 的! h* Z2 i4 ]% Q# W; D3 F
copy c:test.txt f: >nul
7 [* _* _" y* u! o7 t R: C0 Q) p拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息; [! W1 c6 O0 r# S. u1 u7 q4 y
copy c:test.txt f: >nul 2>nul' A' y9 d* p c1 M2 N3 h0 t) [
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
7 Q1 e2 M, g1 Y! e- T2 kecho ^^W ^> ^W>c:test.txt
- ^% |5 x: |5 d+ A! ~生成的文件内容为 ^W > W( M1 F- u5 V. D. T& t
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
# C5 D! S& V$ D8 B& a9 T$ k s; J- e* t& \+ j% m6 X1 y
27 <
}4 g, s2 r: D2 `: L& G# q$ R+ `从文件中获得输入信息,而不是从屏幕上
: m; k" ]5 z! U一般用于 date time label 等需要等待输入的命令
; r g. v( ~1 X' a; L- Q; ]@echo off. P: g9 h3 Y, k$ T; u
echo 2005-05-01>temp.txt7 L& ~0 @1 r2 z) A6 e3 j" o
date <temp.txt
4 f1 U% r `8 C; Mdel temp.txt
. e- g$ x7 x% N9 h+ {' u6 b这样就可以不等待输入直接修改当前日期$ \) a5 l3 F3 r; y* m6 s" `
8 U; ], c" s: t- Y0 @3 D28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*4 W' M; H. d4 ?! ]- f. w7 T
命令行传递给批处理的参数
! K' n$ |$ U. q% V3 x/ H4 N%0 批处理文件本身7 S. w' w8 @# a6 E: N
%1 第一个参数
! b2 N& Y$ L: c%9 第九个参数$ t2 x& ?" l- H( j) d% _+ z$ Q
%* 从第一个参数开始的所有参数, ^: h: x+ S( ^ x, k. q0 Y8 J b
批参数(%n)的替代已被增强。您可以使用以下语法:8 J! J T$ v& {0 r, `
%~1 - 删除引号(" ), 扩充 %1: k) ^( h; f4 |2 x: V! Y; G
%~f1 - 将 %1 扩充到一个完全合格的路径名' D( I& u& v+ w/ Z
%~d1 - 仅将 %1 扩充到一个驱动器号
q7 A0 X: d6 i. T" X' }%~p1 - 仅将 %1 扩充到一个路径
% W6 H3 M8 A/ r: O. }3 G%~n1 - 仅将 %1 扩充到一个文件名- S2 G" M& k. S- z9 U$ B! _! r
%~x1 - 仅将 %1 扩充到一个文件扩展名
& n* w4 `1 n0 k: [%~s1 - 扩充的路径指含有短名* z% y1 u6 C8 {' V3 R
%~a1 - 将 %1 扩充到文件属性$ K. F7 n; R) M3 P* i+ w
%~t1 - 将 %1 扩充到文件的日期/时间' |8 }% U/ E' Q/ Z
%~z1 - 将 %1 扩充到文件的大小
6 E7 Y0 y0 E% X# z' _%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1. L/ c' S# M% H
扩充到找到的第一个完全合格的名称。如果环境
# _* T) u x7 M' R变量名未被定义,或者没有找到文件,此组合键会: b+ y0 q+ I) o4 n
扩充到空字符串2 F6 Y$ ^6 \: w: Z% m P
可以组合修定符来取得多重结果:
3 J) V) w$ u% b9 O6 h! ^& v) |! j%~dp1 - 只将 %1 扩展到驱动器号和路径
. x. `. P% W' U, u* S4 f- ~%~nx1 - 只将 %1 扩展到文件名和扩展名
! n8 O' t, o6 ]; b" d%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,4 I! {" u5 A8 k
并扩展到找到的第一个文件的驱动器号和路径。" g2 |7 v1 a# h4 t
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
* ?' Y6 x! k' [2 k K可以参照 call/? 或 for/? 看出每个参数的含意
9 `0 E, T7 `* k4 H- y/ k$ ^echo load "%%1" "%%2">c:test.txt
9 f* Q8 q2 { a: P1 g% ^生成的文件内容为 load "%1" "%2"+ M& m1 Y. K+ }
批处理文件里,用这个格式把命令行参数输出到文件
) Q! D$ h! h7 ?- [% g* B% G
# e7 T7 F$ X2 F29 if; h, R- p$ L+ Y; n& o7 G
判断命令% B( z( {. z4 f- N
if "%1"=="/a" echo 第一个参数是/a
) ]0 ^" O" B" V; Q D7 lif /i "%1" equ "/a" echo 第一个参数是/a" V9 ^, p) j" D9 K [: o/ R8 p
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?" }" I+ {9 P" O; w, O
if exist c:test.bat echo 存在c:test.bat文件
, P! p% a' J4 O+ S nif not exist c:windows (
4 L, |) E5 \/ b, O. Y- Aecho 不存在c:windows文件夹
0 Z" \6 A4 \* D3 l0 Q- {) I)3 G7 [# Q4 B. `% R- z J* |
if exist c:test.bat (
' ~* K0 l* W$ Q( Q$ Iecho 存在c:test.bat: p: ^8 F" d+ W s- J
) else (
2 E& H9 L: u. m. Z$ |# d5 aecho 不存在c:test.bat
' | g" F F% W' X# p' L# D* r5 U)
+ c# I! W1 P" W1 [% n# r7 q30 setlocal 和 endlocal, _- P2 j Y3 S4 \6 T; Q
设置”命令扩展名”和”延缓环境变量扩充”) X! t- }6 v: S" J
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名") r" d3 p9 d% E; G7 @
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"/ m' b) y9 p2 U7 ~% c" W% U
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
2 |" C- @( O3 K; E2 s4 v. KSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
+ s) w% N8 }* n6 d& VENDLOCAL #恢复到使用SETLOCAL语句以前的状态
/ n5 r8 e: W4 n' ~- C“命令扩展名”默认为启用/ ]% h. S6 B' ?8 q9 t0 n
“延缓环境变量扩充”默认为停用
+ P1 h$ T- U* G( Y批处理结束系统会自动恢复默认值
; y( s, `. I' e: |8 k( E可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程: A1 t3 V- Q& P( ~4 `
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确- d( R ` m9 D
保程序能在其它系统上正确运行0 `( U; w2 e1 ^3 ~5 R- ~ G; c
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程+ d. I* J* M9 E& Y" @, a
, C& H1 q# z2 I31 set
( j K8 R0 d# l$ F6 q设置变量
/ `! D* `; G( t4 D7 F8 }( n$ ?引用变量可在变量名前后加 % ,即 %变量名%' ?) K9 E4 t9 w, R- K, ?
set #显示目前所有可用的变量,包括系统变量和自定义的变量/ }4 | p& d4 i0 n: y& ]& _
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
6 l; H) Z3 o; u" J- ~set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
' L" G( _9 L+ N" ]- M& [5 Fset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb25 Z% L/ a$ n$ R
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2% D. P+ w- q' W& }- m
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb23 T% f( j8 S* P
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2
: m2 ~( u& ?+ U) V1 H; ^% Aecho %p:~0,3% #显示前3个字符,即aa1 h+ z( S" T- }2 a1 B/ t! s7 O
echo %p:~-2% #显示最后面的2个字符,即b2" b) e! D* c; G% A
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
: h: a% _+ W( M- ^% Wecho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
' f" B$ Q; R& T. ]4 s% h% Lecho %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb20 q* _( C. ]/ `+ b& D
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb24 S4 }* x+ e1 _+ @# a
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
% O4 q9 ~5 A' C/ ]) |1 W* xset /a p=39 #设置p为数值型变量,值为39
% P7 X* Q2 [1 l! T [3 U+ [set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=39 F* l6 g+ D; B5 s( P3 g
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用, {6 V7 r4 D) w) y6 d" P8 P) }3 |4 @
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?6 W2 M% V8 S; o& m3 n% e4 P
set p= #取消p变量& M b0 C- t9 `3 \- w
set /p p=请输入
) T( s& g7 K: ^9 n" T @( |屏幕上显示”请输入”,并会将输入的字符串赋值给变量p% P( h% [0 l; g9 L, |
注意这条可以用来取代 choice 命令9 F+ l) ]- A _3 U9 x
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如9 o. D! d m- p( R
@echo off2 b( O: [5 V% P; |" V1 a( L* \
set p=aaa( J9 x* ]: y( E1 K1 j
if %p%==aaa (
. v; D4 l5 x/ B5 D5 v' i* Gecho %p%" x8 ]+ }1 e2 E# A# H
set p=bbb& ?, J* h" G% g: @* U
echo %p%- G2 @( H: \1 x4 S' o8 H$ g0 o
)
: O! k' F4 c' T0 r) c: o( ^结果将显示* M+ c( u8 |8 o7 p
aaa
0 t' g2 |1 N$ u8 }) C; [; t$ i7 Oaaa- U& D' f2 Q1 b* _) M
因为在读取 if 语句时已经将所有 %p% 替换为aaa
+ M3 F5 S, p h v9 {4 b% B这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
. f! V5 E. V+ p可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!. Z6 E( g* {' G- A& J& ?
@echo off
* x9 b+ y6 ~3 x& M7 W4 WSETLOCAL ENABLEDELAYEDEXPANSION
% V+ s) s* D( h/ l. y' ]$ kset p=aaa$ J/ z' K/ w3 o$ D# ~$ M( V u% q
if %p%==aaa (4 s! K8 R$ D4 r" z z9 m
echo %p%
+ `. y) H, r, N2 Bset p=bbb5 X9 J1 ?; ^3 _, V3 v5 V
echo !p!) c$ J, G$ i2 I- C( q8 w4 K
)" y) V; n1 W6 U5 y4 R
ENDLOCAL
o. d, \* ?7 C% d9 o8 \结果将显示* E4 g7 M) m3 N" K
aaa
+ M+ t5 x) e6 s1 x9 P& ubbb: k8 F) t* F7 h
还有几个动态变量,运行 set 看不到
" K: {1 U3 F- D" g" P%CD% #代表当前目录的字符串
- E; D; u7 Q1 `3 ~4 N5 b. U) T%DATE% #当前日期
+ ?) ^# ~7 @" U7 M: m8 \" I* d: g%TIME% #当前时间* n$ M4 ?6 m: u/ H. n* B' ?
%RANDOM% #随机整数,介于0~32767
u" c9 t, V8 V+ B%ERRORLEVEL% #当前 ERRORLEVEL 值
/ `0 r4 q+ s4 f1 E- @) u%CMDEXTVERSION% #当前命令处理器扩展名版本号
+ `2 o$ a& |. P7 F8 C+ b%CMDCMDLINE% #调用命令处理器的原始命令行
; y+ n9 l- }; ~0 g+ m可以用echo命令查看每个变量值,如 echo %time%
I0 Z# t% U/ {注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
' W a3 ]: ] t' D. q4 `( p& u2 i9 t$ u5 E. ]9 W' ^7 p& m- \ X* j
32 start
% M; N& [3 m0 _- z) F批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
. W( y, R; ?0 t) y+ q T3 H
% I- A3 x0 v2 x& k, C+ d33 call
+ a8 s& z5 @- H: _8 }) Y批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
5 \) W! @$ ?9 h" M, F有时有的应用程序用start调用出错的,也可以call调用
. X2 f# J; d" \% @ T1 i" I
0 u: [+ D0 m9 O34 choice (外部命令)7 F- r0 C* p% _6 c
选择命令' t* T2 `7 ?- }( X/ ^
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
" K, O4 o* z; \0 \- o, Fwin98里是choice.com
* ]% O; ]# I( h; Dwin2000pro里没有,可以从win98里拷过来
" E6 V B- D2 Q- Q9 U9 Vwin2003里是choice.exe
" y# t2 u8 \% I( C7 W3 ~' Dchoice /N /C y /T 5 /D y>nul
# J! ]! F" `9 a5 c延时5秒- M U- `. S6 d5 F# t
+ `) R. c+ ~4 W, P$ y% v35 assoc 和 ftype/ t8 D8 S( t, S1 O/ ]- A0 c
文件关联
+ K6 b5 y) X a3 z( |2 v$ eassoc 设置'文件扩展名'关联,关联到'文件类型'
* d8 S& d& k4 t2 S( b- Yftype 设置'文件类型'关联,关联到'执行程序和参数'
8 ~. |- U; Q. E6 u& d' K, `+ ~- r当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开4 Q& B0 g! [5 z& l: r4 _ \9 K8 [
而是先判断.txt属于 txtfile '文件类型'
# w4 i' q; G& y7 ^' W6 {! F再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %17 p: p$ _0 k' s0 h/ ]! t1 B2 }
可以在"文件夹选项"→"文件类型"里修改这2种关联; f. {/ a V4 q F/ M- I
assoc #显示所有'文件扩展名'关联+ M2 n' W% Q' K6 j# C
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
, w% l8 E5 h6 F% @% v7 O6 wassoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.83 o# K5 x; ?3 S& A) \& h. Y& s1 {
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
$ R, y" w3 S# y# K1 d$ ?+ \7 zftype #显示所有'文件类型'关联
9 u" m4 F$ `; jftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*" o2 ^/ m( |* o9 f8 D8 G6 d
assoc .txt=Word.Document.8# P" O+ S0 M- }9 [6 C. k
设置.txt为word类型的文档,可以看到.txt文件的图标都变了- a' i1 q& l$ G- E. e
assoc .txt=txtfile' ?% b3 R; |+ x+ n8 Q6 B
恢复.txt的正确关联0 L7 R5 h1 `$ a# }, V( M
ftype exefile="%1" %*9 n3 _1 ^7 o$ P& r
恢复 exefile 的正确关联
9 k/ {# ^& K8 J) O7 `如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
9 @( i& r0 ?4 V: k
% R ^" S, T/ ?/ i# g36 pushd 和 popd
! s2 z2 } _/ V5 M# ^9 ?9 B切换当前目录
) S0 E6 q% u1 J@echo off0 s% L2 U p; a0 D1 t- X7 r2 @
c: & cd & md mp3 #在 C: 建立 mp3 文件夹
3 J: z3 u2 o" d0 @md d:mp4 #在 D: 建立 mp4 文件夹- `8 @, ~& Q. o; A% u
cd /d d:mp4 #更改当前目录为 d:mp4
; x& i7 i2 b+ Qpushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3' Z! O% U: |6 P
popd #恢复当前目录为刚才保存的 d:mp45 R( o3 P7 O, }1 v5 S; G$ H
1 z6 F* Y% P0 z
37 for' L( T# a( t- i1 d
循环命令 w+ g/ v4 q( d6 D; p
这个比较复杂,请对照 for/? 来看
4 H$ l1 I( u+ S, F* U0 ffor %%i in (c: d: e: f do echo %%i4 w. Q6 i4 J- N- B, }
依次调用小括号里的每个字符串,执行 do 后面的命令, `6 g; G2 X! A' g1 h1 \
注意%%i,在批处理中 for 语句调用参数用2个%( \- \, p r/ d: M; F! |
默认的字符串分隔符是"空格键","Tab键","回车键"
! |) V7 l/ s: D" u. dfor %%i in (*.txt) do find "abc" %%i
- E. q' e. G( M# F对当前目录里所有的txt文件执行 find 命令
0 O( U" k7 }2 f7 i; bfor /r . %%i in (*.txt) do find "abc" %%i
- d) C- H V/ b9 s+ W$ C在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行/ j- U, Z% ?5 g+ o* o
for /r . %%i in (.) do echo %%~pni7 |( ~! V: U* K, c3 F0 `, c
显示当前目录名和所有子目录名,包括路径,不包括盘符9 w) X& W8 |7 F- U- ]' b2 q, P
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
8 |4 o0 k0 P; |+ a7 B$ Q5 S6 w, n) ?2 {把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去& v0 z1 p' i$ y9 |6 i" L: n( D
for /l %%i in (2,1,8) do echo %%i
; u* Q0 q; i: @3 p* m4 A生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
4 K8 D' G' T) Y, G4 E: x4 u% Kfor /f %%i in ('set') do echo %%i
$ { w7 A V& @+ y对 set 命令的输出结果循环调用,每行一个* u! @+ l* k1 r/ }/ ]: y% S/ ~: S
for /f "eol=P" %%i in ('set') do echo %%i9 w9 @: E* Q e, N& O6 a
取 set 命令的输出结果,忽略以 P 开头的那几行
^( y- {# J& |+ M* ufor /f %%i in (d:mp3.txt) do echo %%i
' l6 J0 H4 l- K7 Y" P显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称8 V' V$ M3 ?! l+ S
for /f "delims=" %%i in (d:mp3.txt) do echo %%i
( K& F: W) f# K# ^9 ^- H" y- a2 k. c显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称$ ^% Q% x) o; R+ ? D; e6 I
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a- q; i- S- u- l; h
对 dir 命令的结果,跳过前面5行,余下的每行取第4列8 X% m7 H/ s E0 v& p
每列之间的分隔符为默认的"空格"9 ?5 [8 w$ w+ d
可以注意到 dir 命令输出的前5行是没有文件名的
8 @6 s6 i- |7 l: F, Yfor /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
# |! d" D7 K1 ^- N. F; a Mecho %%a% M+ w2 E: c9 Y/ Q5 z
echo %%b, z$ ]0 n. L+ p# j S8 d
echo %%c
+ N( C% R4 R) a2 N. ^)
; ~3 x7 P0 g! U7 f+ D2 d' w% D对 date /t 的输出结果,每行取1、2、3列
4 ?) h) z6 M* n3 P3 Q! }第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
7 B: z& L( s$ X3 M8 J分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
# q# S' w+ F" {# Z其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
& d) `( @/ a; F1 ~& Z0 J$ d. Xfor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b7 G! m' s8 F$ [% O5 l# r# x& y
取第2列给 %%a ,其后的列都给 %%b5 s3 t( ], O4 [
' o' @, {/ o4 A) O. P, Z. [! c
38 subst (外部命令)0 G& J; k4 T1 g
映射磁盘。
# e4 C M" t2 l1 Z3 jsubst z: serverd #这样输入z:就可以访问serverd了* X0 g7 O, M9 g$ `
subst z: /d #取消该映射, v# r6 a4 L5 ]7 @& o& @
subst #显示目前所有的映时" C: b8 b2 g m" F0 s
& q9 P5 r+ w1 ` A, F$ {/ W39 xcopy (外部命令)3 A6 e- p0 C) [. m9 s: f& C* Z. i
文件拷贝
3 i6 b% w- U, |4 n# |" |" mxcopy d:mp3 e:mp3 /s/e/i/y
* n# n9 v7 B7 j4 z4 d. O复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
6 C# |* C2 P3 i8 j2 {7 ?加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
" f# @ Y4 w% q9 Q' r j; n/ @ Q( W& `) ~
常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退' v+ o0 A2 O& i3 M' j! A6 |+ i
- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:8 a9 i$ {9 V; n# X+ n# G
8 y# a0 O! N, v4 W
@echo off: c$ Z7 ^, B3 w& q
set p=aaa5 G% H. Y5 n3 Y% M0 ]
if %p%==aaa (/ {6 {0 k+ R y- A
echo %p%
' y5 i z) l8 gset p=bbb
% u1 U6 j4 j9 ?( Q# a7 vecho %p%
3 u5 O# t3 h2 g/ j# E5 q4 O* c)! w! {; _' F; [8 q
pause 9 J6 Y' Y& L" P+ Y1 c+ r; k
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|