|
|
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!
% e; A3 N3 F0 C& \ 前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效
+ K1 y0 Z8 ^& {& C- U
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展* [; D0 S: K- N
名为bat 目前比较常见 的批处理包含两类:
- N4 v* S: ]' h$ E- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
/ ^$ {6 H1 k0 a$ n2 W
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的& r( x+ z: u" E- F9 z' r
命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
( Y+ v) v, H F$ X3 h5 x0 K8 r" b 怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
) f7 r2 v. K8 V+ T 批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set
3 {. ?1 ]; L( t* {, X# t 批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||
0 u6 Q: X6 p* m 常用DOS命令- 文件夹管理:
# \* `5 X3 E+ i; ^! N- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。! j7 \3 \2 V5 Y' |( P/ }
- 文件管理:
& L3 s) C1 U1 E# i" ?8 A/ h- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同# n8 g( _( I. d: O
- 网络命令:
6 A( t$ k/ S. @- e H& u- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表
6 u# W9 G L, g
- 系统管理:
, w/ C) X% H9 @6 ~$ o) G- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置( _+ j4 E, u7 S' e
* U& L9 K, a+ W2 ^1 `$ c" X1 c
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /? 9 k, ^) ~: _( v* z5 E" z+ |8 ~
6 E$ q, e4 O: y9 R7 G, l% qWindows Batch 常用命令3 s K# j3 Z+ u1 S, x* f% Y
1 echo 和 @
6 j* Q: L& y9 q2 z回显命令. V# E; I; o$ x
@ #关闭单行回显
' Q6 J: O6 X2 o/ g% Xecho off #从下一行开始关闭回显
) y3 V* c7 E% `( M9 h9 B9 a9 |$ b@echo off #从本行开始关闭回显。一般批处理第一行都是这个! A: e& Q6 J# H' H7 E0 G; k D
echo on #从下一行开始打开回显6 A/ q2 g8 S( {3 h8 |
echo #显示当前是 echo off 状态还是 echo on 状态2 f; t; j) K2 P0 ?( `8 m9 A; D
echo. #输出一个”回车换行”,空白行" l* x6 i9 a6 Z
#(同echo, echo; echo+ echo[ echo] echo/ echo)* V' V9 K7 L( n9 X0 a% \
# k2 r' _+ ]: S) j, u2 t2 errorlevel. ]2 k4 F! B: B9 f5 k$ \" d
echo %errorlevel%) g5 y! ?7 x# w+ u% F3 D
每个命令运行结束,可以用这个命令行格式查看返回码6 W N% @' Y( a% I- j4 b
默认值为0,一般命令执行出错会设 errorlevel 为1$ n6 N0 `* Q: Z6 i; }
- \, S7 J+ M/ U$ q8 p* h% N {
3 dir5 G4 c4 d# j* t* z; R9 V
显示文件夹内容
- {# }- D+ A& |* v2 x+ a2 N% @) vdir #显示当前目录中的文件和子目录
; ^! g7 z5 E% Pdir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
4 H1 r8 L6 }% z+ \: g0 ]7 {dir c: /a:d #显示 C 盘当前目录中的目录7 j! y3 i! L/ w
dir c: /a:-d #显示 C 盘根目录中的文件! x/ \/ R) {/ {2 M7 W/ V
dir c: /b/p #/b只显示文件名,/p分页显示
+ I6 l. h" c7 d) M5 U- V& P! l, `dir *.exe /s #显示当前目录和子目录里所有的.exe文件
9 S1 H: D1 C) _. f1 }) d( R2 I4 Y3 b: v6 G0 Z& K1 L
4 cd
" I$ G5 {7 A2 S9 ]3 p% [2 l( R切换目录
& E" a e T" I/ M. mcd #进入根目录8 D$ c; Y1 J& S
cd #显示当前目录
. b3 h; D, u' c& r/ P. {cd /d d:sdk #可以同时更改盘符和目录
7 {' V2 M* \$ n9 I' A; M: C/ e' P' S# e$ l4 u7 P; x: T, C
5 md; M3 @" h' l9 o9 \: X
创建目录
$ F( U! I7 j! C0 l' W3 N7 gmd d:abc #如果 d:a 不存在,将会自动创建中级目录- M" T3 W+ Z: X6 P
#如果命令扩展名被停用,则需要键入 mkdir abc8 s0 C- C$ z( H B% f
7 H( m0 T' j/ O; a: m
6 rd
0 v8 @ Z: N+ o删除目录
- l8 I5 N0 G$ I4 W, ~2 y& U+ f4 krd abc #删除当前目录里的 abc 子目录,要求为空目录9 J' Y$ `1 N. Y! S' W
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式2 C/ A1 Q. q4 t7 C) R% i
l5 B& x# T6 t& j3 S
7 del9 f5 C, v ]( q0 O
删除文件7 k% M$ p/ y: }- a; w* [, p. K" t
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
* u8 `) _0 G' m! f+ e4 Q: p- H& o: sdel /q/a/f d:temp*.*
' S8 a0 t) m& {7 c5 W删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
" L0 j% Q# V9 R) I) o9 Sdel /q/a/f/s d:temp*.*
$ [% P+ w' Q; @% w( |6 U- z删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
% a+ L2 v8 T% O4 E3 P+ U' ~2 Z/ \+ o' n7 p3 }+ V5 i* |0 v" S
8 ren- p, Q4 A8 E0 C) X) k
重命名命令: o0 v. D7 X6 Q. e
ren d:temp tmp #支持对文件夹的重命名
9 w3 s$ q$ e+ |% M a% c+ V- u: k! _6 f" Z4 G8 ?8 S$ S8 N. r) B( w9 Z
9 cls% N2 E" X' l, P M z, {) `
清屏
. R l! w' H1 k6 ]; b% A10 type8 w( e8 h; X3 `4 J/ ]
显示文件内容
9 z5 ^: p, F* l3 Dtype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
3 L3 b3 d& P2 X/ F7 P9 D* dtype *.txt #显示当前目录里所有.txt文件的内容
, t0 ^" n* D" k% t$ y' T+ l6 U% l* p: [+ L% m0 w$ z T
11 copy
# i9 S: o' g2 ]- v拷贝文件3 l9 l5 {; D b/ I! R8 z8 E
copy c:test.txt d:test.bak
7 N0 k3 I$ J9 q9 J* t; F复制 c:test.txt 文件到 d: ,并重命名为 test.bak2 O5 j( |8 f( W6 x- A8 X' ?0 L
copy con test.txt
[% \5 J% R- `; [: v- E* k2 D从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
! p% t S, ]8 ^. u( Dcon代表屏幕,prn代表打印机,nul代表空设备0 b8 ^ W7 ^9 U! n& N2 ?
copy 1.txt + 2.txt 3.txt+ }& H6 S4 o& t1 ]% {$ m
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件$ Q4 R. ~1 T6 @- k
如果不指定 3.txt ,则保存到 1.txt
' R, l+ u$ n: X, l& ]copy test.txt +
2 t) E- U$ g7 Y! ?' p" V; M0 B! O复制文件到自己,实际上是修改了文件日期6 M$ c& T, ?* g
# w" T$ i$ f4 ] y ~. ^6 F5 O4 v9 c; b0 N
12 title
( o& N' r& { u% P9 C设置cmd窗口的标题
* n2 A- K9 a! Y& x3 dtitle 新标题 #可以看到cmd窗口的标题栏变了% v. J6 i! L/ Y v2 ~
0 z# P& }' U6 p7 W+ s3 f3 ~13 ver
3 y6 e; Q3 M( p) F/ O显示系统版本3 f" L& b2 }7 Y6 G# k* ~ _
0 w) c% @ I: L: }. D14 label 和 vol
% |3 m: Q2 g- Z, N设置卷标) _( d) |1 l( C) ]
vol #显示卷标
1 D( n, w) Z5 f' w4 x7 Jlabel #显示卷标,同时提示输入新卷标
4 ?2 ~$ D3 x2 b. [2 o5 Llabel c:system #设置C盘的卷标为 system. X" @0 r3 A/ x
+ `3 a5 }8 U5 }1 h6 r& Z! \15 pause* f2 g5 ]' d! }3 A1 }6 r+ `
暂停命令
8 i$ k; U9 d. Z- K# z- R' ]
: h6 p7 C' T6 w) S5 `: C16 rem 和 ::( j4 G! z: l. K# w1 Z2 a8 W
注释命令
4 Z- \1 Y4 `0 f0 Y9 s0 s/ x2 t注释行不执行操作
O# K+ E: v" j% P7 w3 ?
1 \: L, q8 M2 } n17 date 和 time
( S* r. A3 y; D% N2 [) m# B% G2 ]% o7 c日期和时间, R: C7 Z: |- i3 w* l/ z
date #显示当前日期,并提示输入新日期,按"回车"略过输入6 G4 v9 Q( J: l% } O& D6 _
date/t #只显示当前日期,不提示输入新日期) H- K* Q! W! ~0 v" }8 q
time #显示当前时间,并提示输入新时间,按"回车"略过输入1 m/ {% b) O# A3 @
time/t #只显示当前时间,不提示输入新时间
5 }% ^% M8 a4 ^
7 b, @ C: J5 v/ j7 z18 goto 和 :
' p4 `* |5 C' t6 [9 N跳转命令! m7 J( k5 U. d6 D. u! o2 A
:label #行首为:表示该行是标签行,标签行不执行操作
% V3 y$ l. S3 k( L9 q6 [6 S6 [goto label #跳转到指定的标签那一行
2 O* P- Y8 ]9 |& {+ ~% ^- {/ a3 Z) R* C7 q
19 find (外部命令)2 t/ G' z% `) ~/ P
查找命令2 k7 Z, R3 L! x( S. ?
find "abc" c:test.txt& e2 Z+ U3 F3 O7 o4 R
在 c:test.txt 文件里查找含 abc 字符串的行
9 N5 T* V$ p1 W# z- r- @5 n如果找不到,将设 errorlevel 返回码为1) s) ^0 E" j; X. V; Z0 j
find /i “abc” c:test.txt
. ]6 Q p8 T- ?6 G/ x! p查找含 abc 的行,忽略大小写
+ C! {# p/ Q6 [3 O* S2 A5 ^find /c "abc" c:test.txt2 B8 f) _4 L8 n C+ y
显示含 abc 的行的行数! l0 e2 i/ ~: E6 f( w2 O' F: v
6 H$ c; I( n! m, E" S
20 more (外部命令)
; o9 A$ U/ k R+ f9 ?' e逐屏显示
$ ]. Y8 [ _+ x3 Z1 F* P* Y+ Jmore c:test.txt #逐屏显示 c:test.txt 的文件内容
# g q$ T) ^' P1 }" z
8 O1 X4 I3 }' Z9 P% S21 tree
8 g$ R$ |9 K5 F+ @2 k( J; m- J8 I显示目录结构) b# G# W6 w f8 V
tree d: #显示D盘的文件目录结构
O6 f( k' V2 }; p; Q! r+ o
. c+ J( J2 ?# t! _$ C22 &
( z* D1 ?" o5 q顺序执行多条命令,而不管命令是否执行成功
" _2 h8 ~/ V& ?1 C
; u& U p0 X* J9 ~23 &&/ h6 \& F0 a( e3 e
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
' \; A% ? f7 E9 L- Y* f/ pfind "ok" c:test.txt && echo 成功9 N' D) ]% G8 {( M, Z
如果找到了"ok"字样,就显示"成功",找不到就不显示
- B- S Q' w( Z7 s6 _2 A6 [
. U; K' E4 j9 s24 ||! a0 r4 R' B: D
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令' s2 C/ ]4 \& M' c Q
find "ok" c:test.txt || echo 不成功) {+ n4 x+ V1 S/ f
如果找不到"ok"字样,就显示"不成功",找到了就不显示5 H S$ t+ y4 W) G
/ B5 U9 ?5 d/ Q6 v1 d+ A7 U5 l0 a25 |
( p+ y' k9 q x# f管道命令0 C% E7 ^) t- g
dir *.* /s/a | find /c ".exe"
: ?( T# W$ }! `0 w5 l6 b8 |管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
0 S8 ~" z" s) c0 Q该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
6 I1 m) B$ v5 X4 Z! L' _type c:test.txt|more8 I& H& f t# u! S- n% f5 I
这个和 more c:test.txt 的效果是一样的
( _& s, F6 K$ L3 }
; M) i- v! O3 G8 d26 > 和 >>
5 ]+ K" J% c* h' v) [ a) l输出重定向命令: a8 J: h! e( q- M- F7 B N
> 清除文件中原有的内容后再写入$ Z* v: | E7 f
>> 追加内容到文件末尾,而不会清除原有的内容
+ v" W3 F" t+ t4 c. y0 q4 h) ] G主要将本来显示在屏幕上的内容输出到指定文件中. m1 e; s# G: O
指定文件如果不存在,则自动生成该文件$ t) Q. |3 x b& ]& L F
type c:test.txt >prn
4 d- Z; F& H0 _* u$ E5 O屏幕上不显示文件内容,转向输出到打印机
& P; e# j; c# Z$ G+ Yecho hello world>con' H* }! t4 ?0 S" L; b: }- X/ N
在屏幕上显示hello world,实际上所有输出都是默认 >con 的7 j' z! ~2 a$ J2 f
copy c:test.txt f: >nul
) U3 F% M. {" G拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
" \% y6 R$ o: `( [" D+ {& kcopy c:test.txt f: >nul 2>nul7 ^& W" L+ m$ d7 v# O
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息( H5 G" U/ Z/ z; L# L" e( r/ C
echo ^^W ^> ^W>c:test.txt
/ A5 q& F- f m. Y生成的文件内容为 ^W > W/ d6 w ]. |( S) o+ I0 x1 S( p
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号 ]3 e% {0 p8 e$ [/ }# c B, l
, j2 Q' b6 }, S) g9 d27 <
1 P* ^9 B, |0 o& h& H从文件中获得输入信息,而不是从屏幕上5 A" o$ A" K9 c' }7 c2 K6 v [
一般用于 date time label 等需要等待输入的命令
6 `4 q4 d V. z4 E0 S@echo off
" Y# u0 N; `) Z: fecho 2005-05-01>temp.txt
& n( _2 J2 J' O! |date <temp.txt
/ ?9 g3 w7 K6 ^4 l+ ~/ W0 Ndel temp.txt8 ^- e& G, d6 j; T
这样就可以不等待输入直接修改当前日期2 b$ `4 @+ L5 s. X& J" R, ^% j
# m# K- a) p3 ?1 d
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*, N, i/ A- e0 U* q0 O
命令行传递给批处理的参数
, c5 k; j. N2 m$ N; L# T%0 批处理文件本身( c9 }( z* p V
%1 第一个参数, u1 v4 M+ V6 f, ^$ X% \ U
%9 第九个参数
. m @4 [2 u4 F) R, Q5 H# M%* 从第一个参数开始的所有参数
) k. g4 o4 X* g' J批参数(%n)的替代已被增强。您可以使用以下语法:& |2 L2 F3 P9 r k" c: A- K
%~1 - 删除引号(" ), 扩充 %1
7 k& c0 r' G0 g0 I%~f1 - 将 %1 扩充到一个完全合格的路径名
2 l6 U7 O: K7 U- @& t/ ~8 n%~d1 - 仅将 %1 扩充到一个驱动器号
- X$ P d! }$ r% f0 k%~p1 - 仅将 %1 扩充到一个路径: u6 C/ `+ H |3 X
%~n1 - 仅将 %1 扩充到一个文件名
/ Q( e: q4 l4 O; m5 E%~x1 - 仅将 %1 扩充到一个文件扩展名
6 }; X7 p* k2 g+ Y%~s1 - 扩充的路径指含有短名
$ ?$ c3 K8 E& C. e7 u( c%~a1 - 将 %1 扩充到文件属性
% f3 [. x3 Y z [8 E3 a: Y2 c J" i%~t1 - 将 %1 扩充到文件的日期/时间) o' ] y, w& G9 B5 j8 C R
%~z1 - 将 %1 扩充到文件的大小6 d; P0 K% H/ `+ z+ x6 L* K
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %15 H6 v2 @) j4 o+ _/ x/ k
扩充到找到的第一个完全合格的名称。如果环境8 l0 p4 a5 b6 g$ |/ k) n3 \* m
变量名未被定义,或者没有找到文件,此组合键会
) I" Y& X# ]4 O0 \& X! }# t9 `扩充到空字符串
9 @, s* K- G0 e2 a0 y3 \& r- X可以组合修定符来取得多重结果:8 ~/ a- M0 x9 m' w- Y9 u
%~dp1 - 只将 %1 扩展到驱动器号和路径; g0 [ S5 h- R* V! K
%~nx1 - 只将 %1 扩展到文件名和扩展名
& z2 d9 B7 m* X9 K$ P%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,* S. L% c" k6 a9 Y, @" S" @
并扩展到找到的第一个文件的驱动器号和路径。% c# T/ ?/ C" p3 M
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。4 B3 t$ E- _' K' o0 a, T
可以参照 call/? 或 for/? 看出每个参数的含意1 ]. O: Z6 b4 J( V7 }- C! S( _9 l
echo load "%%1" "%%2">c:test.txt8 m9 r' W' J: @
生成的文件内容为 load "%1" "%2"
- \1 w* I6 ^* o" O, Y- n8 ~批处理文件里,用这个格式把命令行参数输出到文件
3 z3 \" Y- [8 j& Y5 h0 C( q
" z1 {4 B) Q9 o. }1 |* v1 w29 if
* S. l5 z1 P0 z0 u* f# u; J% l$ L判断命令; s) O7 k: s5 U3 c' j
if "%1"=="/a" echo 第一个参数是/a
4 ^+ ~/ w, h/ X% d( N0 J! W* tif /i "%1" equ "/a" echo 第一个参数是/a
* G' W/ p& s0 K& c; O4 D/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
$ V& F3 q' P- B9 d, j( \if exist c:test.bat echo 存在c:test.bat文件8 N6 e4 y3 R4 v: L4 n, a
if not exist c:windows (
. X# L' N1 P' ]# d- {echo 不存在c:windows文件夹+ S, E* Z: d! T# ~2 q" c8 `4 h6 E
)
1 H- s2 F/ U1 d5 \4 j0 Xif exist c:test.bat (
0 b4 C V. F% e; ]: N; t j4 n" C" p9 Mecho 存在c:test.bat7 R: D1 |& A( g) v3 o
) else (
6 k0 D; a) n8 h# mecho 不存在c:test.bat! f8 \# C7 F# t" t1 z V
)/ U$ A! }: H% W' ^" f/ ?3 G
30 setlocal 和 endlocal$ _5 W) Q, `% S
设置”命令扩展名”和”延缓环境变量扩充”
) U* \4 x& U$ m" z X. ~6 C4 lSETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"& Q+ U. |) ~$ @5 ~+ d
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
1 f$ G) u' Y) T FSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
3 Z+ e. Z& r6 I+ V# {SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
* |) r' M4 G8 a5 Z, xENDLOCAL #恢复到使用SETLOCAL语句以前的状态
0 x7 \5 T# J6 s8 O“命令扩展名”默认为启用
9 s2 j0 h) ]) H% G* {“延缓环境变量扩充”默认为停用
) z. B# @1 n& p- | Z" T批处理结束系统会自动恢复默认值
" F2 @8 _, [# q3 n$ {# _# \可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程: L1 ? `3 a y+ A K9 s
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
: D& q, F* r% m& X" \6 x保程序能在其它系统上正确运行9 X' P$ G8 `& o1 a. Q j
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程. E: n& S b: k! \: b5 ~( w
1 R+ \4 N. \1 B2 H9 z3 @8 f6 c31 set8 \, g) m; W4 V$ O2 p5 ]- B
设置变量
# g n8 t: T( V8 K6 x: L/ _引用变量可在变量名前后加 % ,即 %变量名%
4 _- R$ }0 ^$ z# U( O5 a8 c! hset #显示目前所有可用的变量,包括系统变量和自定义的变量
2 C9 R: h$ U& {. v0 x* \, s Kecho %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
3 N# O" w' i; m- m! C% N6 q) Dset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
8 E( D l; B5 q3 L) g: Vset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
( Q0 L' ]& a( N# m u% vecho %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
: [; X6 s" `) \" {0 @echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
$ f1 U1 [9 z- ?; C5 R9 Iecho %p:~6,3% #显示第6个字符以后的3个字符,即aa2
9 m f6 G+ r2 `; @0 f0 Eecho %p:~0,3% #显示前3个字符,即aa1
8 n3 _/ z# ?. ?& S$ Qecho %p:~-2% #显示最后面的2个字符,即b2
( y2 x: l' t" z& cecho %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b/ c/ N, `4 Q6 `/ P
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
& c" d1 B7 b% A+ g ~' P: yecho %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2! C- i1 G8 ?* }; P
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb28 n/ v1 t+ b/ f1 p0 |; y$ i
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb26 p5 U r: M6 }% I$ q
set /a p=39 #设置p为数值型变量,值为39
+ O6 k3 A) m9 z3 ]set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3; T) {6 S$ t7 Q. ?! |* W
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用( C& H9 @8 L, {8 w
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
$ C. H% D: r1 s. |* qset p= #取消p变量
_8 l2 |9 B& G* D% Oset /p p=请输入$ L/ c1 b* |- e% s/ d
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
5 o$ f1 Y& e0 J) u% D9 k注意这条可以用来取代 choice 命令
9 u& ^$ y0 x) ^ |5 ~6 q8 f注意变量在 if 和 for 的复合语句里是一次性全部替换的,如: ^5 `# i/ `" E4 T: d
@echo off1 u4 W' Y2 ~% J" o
set p=aaa" X" w3 o" j; k( w
if %p%==aaa (
F* S! t( x- q6 f0 p0 C1 jecho %p%
8 B0 d7 y/ A2 ^9 vset p=bbb
+ `5 \+ [- a/ N1 X2 h( zecho %p%) x% i5 l; x) S1 M! p/ i
)# b* E' D+ `: [4 n) w5 u
结果将显示
9 W0 x( P% e; k$ c( u) M. M/ N+ caaa
4 h% v0 v1 h/ |3 o9 n7 q4 Q3 H1 W4 O) oaaa
- s) c9 f0 S w' n0 I- @% E2 a3 P因为在读取 if 语句时已经将所有 %p% 替换为aaa
' q6 U9 p! W5 r. [. L这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"+ A4 U$ @" G) `+ O
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
, ~) c& m1 J6 N: i! }4 m2 W9 V@echo off
# ?! l$ \! J5 y9 L2 ~9 B; NSETLOCAL ENABLEDELAYEDEXPANSION
3 s8 s; k4 j, Rset p=aaa" R6 f. [: K; R
if %p%==aaa (6 t2 Q6 b1 a: K" e% q
echo %p%
" f+ v; H* R% l/ Sset p=bbb. J% b$ H( ]2 h8 H
echo !p!' ^0 H9 B9 s( l8 B8 W4 |
)9 ~) D8 K: u) G* x
ENDLOCAL( O* P. n5 E9 @9 A: B
结果将显示
/ }9 D& s. c1 ~aaa
`9 K9 E. `) ?! J% Q) c/ R6 [ [3 Zbbb$ L! A) H* Z- W8 |4 V! F9 P
还有几个动态变量,运行 set 看不到1 t }( ~5 }% j/ n" M* m
%CD% #代表当前目录的字符串5 I' s; c+ ^3 G. [
%DATE% #当前日期2 C- n; d0 H u. H0 q/ J7 O+ _
%TIME% #当前时间+ C3 h5 W% m/ h/ ]! d* r
%RANDOM% #随机整数,介于0~32767
6 W3 U, ^7 b7 X%ERRORLEVEL% #当前 ERRORLEVEL 值
1 Q3 S8 p3 ~$ K%CMDEXTVERSION% #当前命令处理器扩展名版本号+ V% J! o4 b z& n/ }8 [
%CMDCMDLINE% #调用命令处理器的原始命令行
$ C0 p) q7 N8 m6 _可以用echo命令查看每个变量值,如 echo %time%; E( T' I7 B- _9 J
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
! U0 N2 e1 i9 N& u% t/ w2 M
, c* L+ q) b/ Z0 H; N32 start
! H2 \2 z' ^+ Z9 ^批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
' O! I3 K- `! n( A" C% e; Z' e
& [$ h9 g; ` R8 _33 call
$ `8 I q( Q0 X. c; W% x0 c- `批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行$ p3 v) Y: X! i, b7 a
有时有的应用程序用start调用出错的,也可以call调用
2 x4 o2 X4 U8 C3 V1 s$ H7 N# Z7 h8 V9 a& k
34 choice (外部命令)
- I! y2 S6 G8 O# H9 H选择命令, x \. y* I* [% M
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……6 w/ A8 A! C7 N' m" A w9 p, R4 U+ v
win98里是choice.com. |4 o1 i' c6 p$ F4 V& _
win2000pro里没有,可以从win98里拷过来% q/ c5 T& p" O& ~# n( ^6 W$ M
win2003里是choice.exe
: s( W1 E$ r9 l# v! W/ d' G7 J0 `choice /N /C y /T 5 /D y>nul3 W+ @' r9 l) u0 u! H+ \* Z7 K4 S
延时5秒6 k" Z+ @- e+ ^6 C& t
" p1 h4 @5 R. S, R* k. o35 assoc 和 ftype7 i9 r3 H5 J$ L7 C' ]/ }
文件关联+ j4 v/ `- ^& s+ M ^) T; w
assoc 设置'文件扩展名'关联,关联到'文件类型'3 \) [; E1 t; T+ |
ftype 设置'文件类型'关联,关联到'执行程序和参数'. A5 i+ k' ^% n# B0 Z( w
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
1 D$ n6 }! Z4 r+ I) N而是先判断.txt属于 txtfile '文件类型'
1 X- i$ z! H# V/ z& ?1 Z$ r2 E再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1" w. U# T, J# w4 L) F6 K+ D
可以在"文件夹选项"→"文件类型"里修改这2种关联
7 D! z* R+ T+ [3 jassoc #显示所有'文件扩展名'关联4 x U, [: G1 t: j3 X6 e
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
2 e+ e0 {: \8 V0 w! }$ C: j, Lassoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
$ C7 }5 b( [* [# w& O( O1 g Y& Massoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
3 g0 f# F! h5 F8 l! A/ Aftype #显示所有'文件类型'关联
1 V3 _0 f; p- N! P; {ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %** o/ e6 O' G* E2 o
assoc .txt=Word.Document.8
( e5 k) ~# ^# b. C' {. Y+ D# C$ N8 ]设置.txt为word类型的文档,可以看到.txt文件的图标都变了( H+ C4 o% `$ M2 G
assoc .txt=txtfile1 I$ D, W1 s' f4 f. }- t. n2 ]
恢复.txt的正确关联
; X7 `/ w4 `7 s, `8 Nftype exefile="%1" %*
3 j! F( K( G' U9 f- y. j2 c: @恢复 exefile 的正确关联( a+ ]' O1 Q& V+ D
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
$ z9 k8 N- s, I- i% S% Q( P0 }) {3 F! _" t, F" N7 e
36 pushd 和 popd
1 d F4 Y) g* g f# R切换当前目录
2 L5 C H" t2 \, r$ X: W/ S@echo off: Z& S1 S7 |/ q* Z+ G* \% v
c: & cd & md mp3 #在 C: 建立 mp3 文件夹
7 `! V) w1 l: G7 B9 m$ |md d:mp4 #在 D: 建立 mp4 文件夹
2 r9 x6 N1 J3 V! K2 _7 T6 Jcd /d d:mp4 #更改当前目录为 d:mp47 u% ]4 I% \, m ]' y. Q
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp39 q: q3 E% a0 s( W1 e! G2 V; u1 z
popd #恢复当前目录为刚才保存的 d:mp4+ c& |* b1 o; J2 ~
9 {5 F! m) z% u+ H1 |& W: O37 for
. r+ ]' [/ q7 N) E循环命令- I* T7 g5 u# o6 ^! l. S* E) h
这个比较复杂,请对照 for/? 来看
! R; B/ S; ?7 Z- u. z9 I zfor %%i in (c: d: e: f do echo %%i( _2 b" d0 w1 ^7 }$ i( w
依次调用小括号里的每个字符串,执行 do 后面的命令8 l! c' v- K- S" X1 J
注意%%i,在批处理中 for 语句调用参数用2个%
F! h0 K3 f, s8 H3 p3 {" C' n默认的字符串分隔符是"空格键","Tab键","回车键"
+ E# _) U8 J0 o$ ?for %%i in (*.txt) do find "abc" %%i- F6 Q" ?4 n- b4 u. u3 E* o Q1 R
对当前目录里所有的txt文件执行 find 命令
) A) \8 v3 Z6 V$ ?8 ^* Y* Efor /r . %%i in (*.txt) do find "abc" %%i( f6 i- ]; A! O: D
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
8 l! m& o' \4 M( M3 Ofor /r . %%i in (.) do echo %%~pni" O, ^; Y8 k% v4 s0 m+ ^
显示当前目录名和所有子目录名,包括路径,不包括盘符
# o" ~- O( u) J0 J# Ifor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
8 k$ r; n; D+ }' M& k把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
! @3 A& O: Q( e( T `. ]7 xfor /l %%i in (2,1,8) do echo %%i$ q1 `) U( C; p
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加15 H0 w) j s0 E9 t7 q5 F4 W7 z7 [
for /f %%i in ('set') do echo %%i
/ {9 F1 X2 {( a# z- {对 set 命令的输出结果循环调用,每行一个2 \/ D3 y6 T2 X6 n3 `/ E& H
for /f "eol=P" %%i in ('set') do echo %%i
/ J" F4 ]$ i! [1 M. \0 I' h+ U取 set 命令的输出结果,忽略以 P 开头的那几行
# j& g$ D& y- V/ i/ B3 u! Pfor /f %%i in (d:mp3.txt) do echo %%i9 V) }6 `0 S# u$ c W
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称 S9 F- i+ [/ q# c. t$ A/ ~9 W
for /f "delims=" %%i in (d:mp3.txt) do echo %%i6 N U9 l" h* Y0 [ Q. R8 Q t
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
& ?( i1 c+ K+ X4 B: ]% M# o% V( cfor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
4 A& n$ K7 C" Z对 dir 命令的结果,跳过前面5行,余下的每行取第4列- b M0 e" G( \* ?" H
每列之间的分隔符为默认的"空格": Y) q _7 G: m; G2 j' M0 F
可以注意到 dir 命令输出的前5行是没有文件名的
& `# V: U. y; V( _" ]' a$ Wfor /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (& R2 u' H1 h5 m, D w h! Z @6 W
echo %%a* d6 ]. ]% H( X2 u4 |+ E0 F
echo %%b+ z9 N5 s" X: X8 M
echo %%c
& ]# g$ T/ a* S" W)
* i* I0 k3 p9 @; x对 date /t 的输出结果,每行取1、2、3列1 ~1 K( J' g* y' ^& }, }8 G
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列, e- [* _ k! a* f9 ]
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"2 Q7 T' c: M4 c
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的# C0 z+ W" h: H
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
4 m( K3 z( E. O2 L取第2列给 %%a ,其后的列都给 %%b# a$ v7 T, L( w3 |* g' d
[) c2 H% r2 \5 I+ D38 subst (外部命令)! [0 d _8 i3 o" z! ?
映射磁盘。
* B1 |( Q- H% s1 P W2 d* ^subst z: serverd #这样输入z:就可以访问serverd了/ s& g# e; R+ A6 T( c. A( Y
subst z: /d #取消该映射. C5 U7 V) q8 m' w* Y( v
subst #显示目前所有的映时: x% |" O8 E# m: b$ x( w% j5 m* d
$ P5 r$ {4 R* D8 t! _2 N
39 xcopy (外部命令)
4 D& R3 `9 U# ?# n文件拷贝( p8 e8 B( q! _: H2 M' ]; z
xcopy d:mp3 e:mp3 /s/e/i/y- Q5 ~$ R# B/ a' F8 i, z( b3 Z: G
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件: h6 I- |# E9 B
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
4 B" D5 C6 X/ w8 u" y1 }# S
: G, F7 C9 u/ k! Z" \% m$ h+ C z常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
) G$ N% h1 F. A6 R- M- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:, \( H! K# {) u# a$ L
# s% Q2 P8 V3 W2 k* U/ Q( f
@echo off) K3 U( b4 q1 K
set p=aaa
9 P/ P- x, e1 c/ P& C$ |$ Mif %p%==aaa (
; U1 E+ {9 W8 p2 ^+ ~echo %p%
% ]9 V% |, V# A/ e Eset p=bbb7 l4 X+ `: ^7 j, K- V7 C
echo %p%
1 P) b( h D/ Y5 W)
, u B6 d3 {9 D8 ^" r4 bpause
1 H: v. V- f; w% v) @ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|