|
|
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!% L- l; W6 h9 s9 y2 m O
前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效6 @% j8 u4 \# F( u% O. o2 H
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展$ N+ X' G9 M2 u; a2 Y
名为bat 目前比较常见 的批处理包含两类:
9 p u) y' r$ c! W% ~- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理) ?8 O- L; A$ v$ m9 ?- e+ j" ^- W
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
3 e% b2 M9 V* v( A5 b命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
6 t) N- g8 x& T! r+ m" j 怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
# F4 n- M" ]3 s* p; j" P% t6 q 批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set
; O$ v" J9 C7 w p/ X 批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||4 N! Y; j; v: P, E" k+ R
常用DOS命令- 文件夹管理:9 I2 s# \7 Q7 p4 R; ~
- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。 {- s" m) [) Q
- 文件管理:0 j2 R( g6 b2 v
- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同
% t' {9 |' a s) n2 H2 G% |
- 网络命令:
& n& z; @: q3 J- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表, o, `6 |) N! q' Q, s/ ~
- 系统管理:: d! Z& r9 _4 M. E, I! g( U! I! a
- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置" y6 A( ~* Q+ K0 c8 i
: C6 I( N1 V9 R% r. [1 R7 T
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
5 w& k0 q! \" l+ C9 G: s: q p5 D {5 a" F8 S
Windows Batch 常用命令 l2 m ~. d* u# I
1 echo 和 @ Z: ~2 j! q( X) M. n5 a
回显命令9 |( ^5 O+ X' q6 R2 ]
@ #关闭单行回显
; V) `. H( l) y/ H- r- h. I- @echo off #从下一行开始关闭回显" G3 h$ @. Q. e+ C
@echo off #从本行开始关闭回显。一般批处理第一行都是这个
1 M, b, r G8 a' ]& h; Yecho on #从下一行开始打开回显, I2 l6 o$ [4 E6 ~0 d+ V. F
echo #显示当前是 echo off 状态还是 echo on 状态3 e6 h0 d( w/ w! {! [$ _
echo. #输出一个”回车换行”,空白行5 v! @) R( Q( m& U/ V$ u4 f4 M
#(同echo, echo; echo+ echo[ echo] echo/ echo)# \& p$ Z( @! A b
# c4 G& ^, R/ K9 i& z2 errorlevel6 l' o, P! G1 e1 e& ^5 `7 v
echo %errorlevel%/ Q0 Q7 I$ t7 V' p8 x8 T8 I
每个命令运行结束,可以用这个命令行格式查看返回码
/ a& ~ ?3 l1 u0 }# Z; Y7 W默认值为0,一般命令执行出错会设 errorlevel 为1
. b9 r$ t. h+ m J; N3 @9 w4 ?% E6 x6 Q2 p6 a
3 dir* ?2 f6 h) N( H: N- `5 x" B
显示文件夹内容" `# i- _( `/ w- z( o( r* J/ n
dir #显示当前目录中的文件和子目录" J7 ]! w2 T# ]3 W: p
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件$ n* e1 W- P: k6 W7 ]: p
dir c: /a:d #显示 C 盘当前目录中的目录
; y' V5 ?1 A1 o0 O1 ?3 [dir c: /a:-d #显示 C 盘根目录中的文件
6 s8 U6 w$ ^+ D; tdir c: /b/p #/b只显示文件名,/p分页显示
7 q# D: R3 N- f- D0 Y/ u2 z. w2 idir *.exe /s #显示当前目录和子目录里所有的.exe文件
/ z3 @; L2 P3 J! ^+ X2 v1 d. E' r# U4 X- c. G. m9 n
4 cd/ h+ m% l: r7 B( y: Y
切换目录1 w- a- u* c% O& t) |
cd #进入根目录
. g6 t2 d7 x. F4 Z+ Dcd #显示当前目录 e* _: m6 V. X. C
cd /d d:sdk #可以同时更改盘符和目录, g) h3 q. A& p& R
) C; z) t4 _: @/ u* K! o# T
5 md
0 {! Q# K6 ^* t创建目录3 [! e, Y4 u/ m
md d:abc #如果 d:a 不存在,将会自动创建中级目录% D) G+ E c" r7 B
#如果命令扩展名被停用,则需要键入 mkdir abc" U) ~7 o$ V. t: p4 A% ?
1 s) G& ^$ H2 X# M
6 rd E( }7 k/ T& @. s4 |, R
删除目录
" d R9 Z! R3 Z* W# D0 |( a& Yrd abc #删除当前目录里的 abc 子目录,要求为空目录0 R2 z- j" r6 l
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
" i2 l7 ?' C; R# Z& r( s
1 e: W' {6 U# z7 del8 y( i& H. \) D' B* ?2 N8 Y& p
删除文件6 @3 Y* l7 p. [2 A: Y9 `1 ~6 I5 C
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件, ]) h3 x: _" l" i; y; @
del /q/a/f d:temp*.*8 N; s$ h7 ~) p3 Z) d3 i9 k/ z
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录* q( F T6 ^) y
del /q/a/f/s d:temp*.*
$ P! e+ L# |: r ]1 k* d( c% z删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录3 `6 J. y$ x# e9 d
. U U9 H, G1 y F* I8 ren: e+ D: P ~- Y1 i
重命名命令
4 O, e* ^/ ?; C+ M) G. n5 Pren d:temp tmp #支持对文件夹的重命名
7 Y! [/ W) m6 [- L& G- \2 h g6 k
4 J2 h3 o8 K) ^- y S! H9 cls
3 k3 O. `0 t" N4 v5 G清屏
2 y' @5 C$ U% n5 ?! x10 type
( l/ k7 a9 A( h7 P! A* \% V: W显示文件内容* T i- H: @9 A+ h6 ]" V, S" Z6 H
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码+ }3 W9 S# J$ c0 `4 r" W
type *.txt #显示当前目录里所有.txt文件的内容. L" B, G2 Z. }# n
6 `$ ]3 j# M7 R* `! E5 L% M11 copy
# U& ^$ f1 E2 {2 l4 f- }! W& r拷贝文件, d- }7 k; b( [! f
copy c:test.txt d:test.bak
! [8 ]) d" q6 u3 j5 a+ F" b6 ]% `! T复制 c:test.txt 文件到 d: ,并重命名为 test.bak
7 M! N- d" f8 Xcopy con test.txt
. j, g6 p- T; Z1 p从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件! G5 {0 h2 @ e" X! B& H# y7 v
con代表屏幕,prn代表打印机,nul代表空设备4 m/ d' G4 t r2 t
copy 1.txt + 2.txt 3.txt2 y& `# S/ h8 ~* m2 O
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件+ @5 f8 E. _6 c7 o% e
如果不指定 3.txt ,则保存到 1.txt
! X. ]) i/ o5 @9 R* x# jcopy test.txt +, v- j9 j4 R/ J$ j* j8 d. q
复制文件到自己,实际上是修改了文件日期5 K" j' x9 T; j& @2 X
; l" W+ E+ f' d. }" k5 Z
12 title
) Z5 `1 y5 H; N3 q2 C! Y0 Z设置cmd窗口的标题0 `- E, i# n$ F* y9 J! {
title 新标题 #可以看到cmd窗口的标题栏变了- p/ v# g8 \+ f5 W* e G/ `* P4 ^- c
% k) N3 |; x& x6 `5 g
13 ver
9 r3 ]4 B3 K/ F显示系统版本
5 o) g; ?/ ?/ T- X! E/ o( j9 E! e& P% g O! Q9 f# P! F4 G
14 label 和 vol
! v7 @, K) g+ @, G" I w设置卷标8 b5 B- w( F2 F9 y) a4 M
vol #显示卷标
& V. w/ \4 k% a) u& E5 a. plabel #显示卷标,同时提示输入新卷标" g& P2 x: R2 V8 z. ] v: b9 _
label c:system #设置C盘的卷标为 system
" k6 A/ u1 l9 V) Z/ B
* h# l, ]* k8 v0 ], Q1 \15 pause) A" A( m" s3 g G
暂停命令
. t6 ^. K T; ~/ ?4 G4 i- s1 n2 a- m2 s) F2 c% Y( u( a/ G" N! M
16 rem 和 ::
! x& ]6 U$ q4 v9 p/ q/ [& I注释命令
# W' r0 J1 g; b# R$ }/ r注释行不执行操作
W& t" U( m4 q1 H; l, t
: x) A* b$ A' L7 F17 date 和 time
! ^5 s9 Q: p- J1 h( a) c+ \日期和时间4 D& {* L8 I2 g" e. D" }
date #显示当前日期,并提示输入新日期,按"回车"略过输入2 A1 M. n) B. U5 g7 Y
date/t #只显示当前日期,不提示输入新日期3 q& S% L! t: L9 H1 q- [+ G
time #显示当前时间,并提示输入新时间,按"回车"略过输入
* A- j D" O9 etime/t #只显示当前时间,不提示输入新时间+ F& d& z; P6 V% n. D5 e8 b2 ~5 z
8 Z% a; L2 R: g4 Q( J. W18 goto 和 :
1 m2 p' i0 z% L* x: Y2 X跳转命令; V0 A, S9 B* M5 W) @
:label #行首为:表示该行是标签行,标签行不执行操作1 L/ G0 c7 Q8 n/ S
goto label #跳转到指定的标签那一行
3 w1 z$ X8 Z1 k( S# W
; l) q2 d7 r. J/ Q, R- Q# J, m; K19 find (外部命令)) D! H! Y* i+ C! H0 G" C5 n
查找命令
' p9 k0 b0 b$ b: ufind "abc" c:test.txt
" p9 E8 G5 B: c' t' }8 T! d在 c:test.txt 文件里查找含 abc 字符串的行
! y# F& ?4 P, q# D9 `如果找不到,将设 errorlevel 返回码为1
0 b1 E; R9 O @4 j" \2 @find /i “abc” c:test.txt8 J8 h" n2 e( x, A+ s
查找含 abc 的行,忽略大小写
2 g1 B4 J" j* [( Ofind /c "abc" c:test.txt' C7 [0 D' \7 ] c- ^" S5 t4 j- s
显示含 abc 的行的行数
k) ~0 v9 s0 D+ e; R: l
/ t5 X- O4 e4 R7 ]# x( }$ \( F20 more (外部命令)
5 s6 Z3 {. @! B7 I9 V" T逐屏显示
2 M, U1 f2 C+ ymore c:test.txt #逐屏显示 c:test.txt 的文件内容( t8 L+ U' p, w- I7 \1 v7 {
* b2 }2 K. L) D, [/ m5 o
21 tree, u& S( {5 U/ k+ z! ?
显示目录结构0 h; |5 \# u( W8 x4 o
tree d: #显示D盘的文件目录结构
+ I V/ z; I m; R! v9 y
# o) I& a4 K& {" [22 &, t/ K4 U; q J9 N: Z9 K1 j
顺序执行多条命令,而不管命令是否执行成功
0 Q; C6 H2 ^! d5 E
4 y; L# S% m2 S3 l3 |; m- b4 q23 &&
, B# S: v' P, U4 {" U) k- `顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
* R6 b4 H( }3 Q% Efind "ok" c:test.txt && echo 成功
1 ^* D+ J9 v5 X# i% |如果找到了"ok"字样,就显示"成功",找不到就不显示9 ~$ V( o6 N! F
x( \- \) f M1 l: q24 ||
4 S6 I1 B R) n2 ]顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
6 k' u! G0 `( y" J4 S S: Zfind "ok" c:test.txt || echo 不成功
/ P6 Y: y1 K; C% z如果找不到"ok"字样,就显示"不成功",找到了就不显示
8 ?" B2 ]7 m7 Z) T: e6 r# q6 N. Q1 b7 u3 X9 J1 o9 J; t; X
25 |
/ F+ P( ]2 N- ^9 K管道命令
* s( S4 e# q0 z7 u* g! Cdir *.* /s/a | find /c ".exe"
$ h; y- n; E8 T. ^7 i* K( z' l管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令( x3 w9 t% z& i
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
# ^, J w/ I5 B" n0 F5 P' S0 Ttype c:test.txt|more; y$ U+ }4 n5 z+ W
这个和 more c:test.txt 的效果是一样的
8 {) B8 u% `3 `$ g y# D8 M4 `( }: T, C# F. J. R
26 > 和 >>
% Z! ~$ j: ~6 [& j: S输出重定向命令' `# K- y7 A) A4 L8 W- r, d- \; C7 r/ o
> 清除文件中原有的内容后再写入# R& q% l( S% j0 K) I
>> 追加内容到文件末尾,而不会清除原有的内容
" V% D# R/ D1 x7 r; A |3 n- z主要将本来显示在屏幕上的内容输出到指定文件中5 k6 |$ @8 S7 t& _; e) k6 \
指定文件如果不存在,则自动生成该文件
, F6 @& G0 p9 }' i0 ~( y% `type c:test.txt >prn
, b7 n1 ^+ ?: R% Z; p8 _+ R& S! H屏幕上不显示文件内容,转向输出到打印机! b; {; ]4 b" D& J8 H7 P' i
echo hello world>con
- N$ D7 P! {! d* G, P/ F在屏幕上显示hello world,实际上所有输出都是默认 >con 的" f9 b: h% O- P' T7 h1 x
copy c:test.txt f: >nul9 n7 z0 \, k/ c1 i' I/ T( P1 v
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
+ W0 g7 _4 ~0 _. X- M& Rcopy c:test.txt f: >nul 2>nul
2 o; b7 d+ r( h$ O2 q. ~! Z不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息 b: Y ]4 z) u- _) H2 B
echo ^^W ^> ^W>c:test.txt0 Y0 D4 v' T* p, C+ N6 }
生成的文件内容为 ^W > W2 l+ c9 u* | u$ I+ F! q
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号3 r, X! w3 P; t; P! X: _
: D$ |8 n! h" |! m& t' b0 t# v$ N27 <) A" n3 P# Q9 G4 p9 X5 u9 u) C8 T
从文件中获得输入信息,而不是从屏幕上
- }& T# D7 G3 I+ a* R6 v一般用于 date time label 等需要等待输入的命令
* o' I( p, [. Y& {9 R: Y@echo off* }% J# @: B8 x9 l5 r2 r
echo 2005-05-01>temp.txt
]( T! S) F1 t; Z3 qdate <temp.txt
. ~5 E- G' R2 N+ sdel temp.txt9 p$ F- E( v2 e. n: n3 u3 D
这样就可以不等待输入直接修改当前日期
/ s) p/ y3 W6 X1 i) {1 r. Y0 ~3 Z% ~6 _" k9 h5 p% n+ i) C
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*! v" P9 w% B8 K
命令行传递给批处理的参数, ?0 v3 K0 W- K( w1 E
%0 批处理文件本身
6 S8 ?; \ t/ d# d) F9 {%1 第一个参数1 a. q4 j A: P( J" x' @9 v; U) F3 w
%9 第九个参数
. ^7 Q% c7 E% k1 Q5 U6 @. C( x%* 从第一个参数开始的所有参数
3 m/ {1 }9 @7 E5 d$ V- T+ Y$ c3 `批参数(%n)的替代已被增强。您可以使用以下语法:: k! S5 X) Q/ { Z) n- P
%~1 - 删除引号(" ), 扩充 %11 i8 G4 t9 {9 D& O8 x1 r
%~f1 - 将 %1 扩充到一个完全合格的路径名
) Y4 C! x+ }7 \# U# z3 b p%~d1 - 仅将 %1 扩充到一个驱动器号
7 h& ]: f! C E5 Z4 K/ T%~p1 - 仅将 %1 扩充到一个路径
+ a3 e3 x; q7 G* }%~n1 - 仅将 %1 扩充到一个文件名* @0 Z& H, g; _
%~x1 - 仅将 %1 扩充到一个文件扩展名: X4 \; {/ ~/ P4 m; _9 c5 e
%~s1 - 扩充的路径指含有短名* }4 j* V2 l5 ~" Z/ H% m- F1 {
%~a1 - 将 %1 扩充到文件属性
! h# y- y# ]# Q- d6 H" `%~t1 - 将 %1 扩充到文件的日期/时间/ f' f0 k' l1 J
%~z1 - 将 %1 扩充到文件的大小# k' H( Q' L% u7 `7 t7 r
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %18 w6 d# C! w: N* D" i
扩充到找到的第一个完全合格的名称。如果环境) o5 w& E6 @9 ?0 h& ^
变量名未被定义,或者没有找到文件,此组合键会8 {! O! K) m0 W) D
扩充到空字符串; a8 u- ~: B2 }& \5 p1 i+ q
可以组合修定符来取得多重结果:
& ~: q6 q1 `. O: j. g( p/ P%~dp1 - 只将 %1 扩展到驱动器号和路径
3 h4 `/ g. A. R J9 o%~nx1 - 只将 %1 扩展到文件名和扩展名2 u& j5 r+ i) I. M, ^% f8 `
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,) Y: Y4 {& ?. Y/ {; C$ V4 C
并扩展到找到的第一个文件的驱动器号和路径。
- \8 x) t9 O, P5 u%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
+ _* r" h3 z( Y# Y1 P可以参照 call/? 或 for/? 看出每个参数的含意
9 y2 d4 h& z+ y0 N( W9 R& Decho load "%%1" "%%2">c:test.txt
$ U( F l$ _# ]. T, l ?3 @生成的文件内容为 load "%1" "%2"
) I* c% b% }* `+ Z6 x/ w! H批处理文件里,用这个格式把命令行参数输出到文件 d) a5 M5 v9 f; L
. h. F9 _- @0 M. X# p* C2 L29 if
; o9 E; M9 U; W+ p9 V3 l, \5 m判断命令
' K- S" h9 C; l& i1 U% Tif "%1"=="/a" echo 第一个参数是/a
$ Y7 q/ N# z1 Z5 O7 g/ p/ g3 Iif /i "%1" equ "/a" echo 第一个参数是/a6 O- H1 G0 r) r
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
8 `; h' a5 H: [$ uif exist c:test.bat echo 存在c:test.bat文件: _9 M4 t5 s& t; m
if not exist c:windows (
7 ~! U5 F, |* w- ^/ X3 K9 `echo 不存在c:windows文件夹5 ]+ [9 q6 ?+ i3 c. a0 X$ B
)
9 d5 x6 V7 ^/ [7 i _if exist c:test.bat (' b/ P& K1 _4 x# n+ M# U# E
echo 存在c:test.bat
2 O8 Y, I( ^1 g) H& i* l# V: [& r$ q) else (
) t9 \9 |: J8 z1 p) {echo 不存在c:test.bat
7 _/ s+ u, P: R1 d)1 v: ]( |9 ~1 |9 T1 K ^0 g# a$ j
30 setlocal 和 endlocal6 N6 |, _2 c* G% E9 a8 n
设置”命令扩展名”和”延缓环境变量扩充”
2 J+ W& m% }+ E, Y. K, H8 uSETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"( E( _( C- D% R4 E9 e- a+ I
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
9 }# _ \' k# v% G; ESETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
+ `* K( l& O! V/ w1 u/ D& hSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充") G* s1 b; v- l: o1 b) C. }) G
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态0 G7 U& u0 c. ^3 ]
“命令扩展名”默认为启用( K3 `$ e. D' m! W
“延缓环境变量扩充”默认为停用
& P* m1 P* N, _/ ~ I" r批处理结束系统会自动恢复默认值! Q \9 a8 Z% }6 Q
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程! F2 U; Q: h+ F- ^6 X( M# v: x
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
" J) W: Q! v7 M/ ~- o4 c8 ]保程序能在其它系统上正确运行
# A; _3 S- `+ Q7 t Q% K. d"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
' c; ^: _6 ~+ R; u0 S
0 F+ ~% T/ N2 q" l" T31 set
! b0 R& b: j4 d: K设置变量
+ E" Z( v# k6 q' K; @$ q/ ], D引用变量可在变量名前后加 % ,即 %变量名%
" x6 J/ Y$ w3 E/ {1 u" Cset #显示目前所有可用的变量,包括系统变量和自定义的变量
0 {. q0 k3 D- p% f; G' techo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
. `% C4 C/ F9 }0 z# Dset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1: i8 z/ s, B6 O/ H0 O
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
" P8 n$ L2 u' ^; ^7 `echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb21 I) O3 L+ q7 {5 s7 w F
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
5 U. r) f1 ^; j! M7 Lecho %p:~6,3% #显示第6个字符以后的3个字符,即aa2( I4 C+ B4 |1 G
echo %p:~0,3% #显示前3个字符,即aa1
4 r! b, N1 r& T1 x% D/ mecho %p:~-2% #显示最后面的2个字符,即b2; s2 n4 I1 w6 C; N) Q& X
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
+ k' U) Y) h; ?1 k$ yecho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb27 _! b' \1 X9 l! w& G
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2' k3 P, r( }8 G4 q6 @
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
- K' B- q; O- X! _8 A; w- g8 `set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
& Y, @% p* y N: e6 |$ f! Tset /a p=39 #设置p为数值型变量,值为393 z; W, }% U6 g& O
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3* _: M( [. C) H- Q
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
& W# ~- r0 Y# B ?7 kset /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?/ K% N. Y( z% H" }
set p= #取消p变量
* S0 {* ~) c' |' {" q$ y% k5 Xset /p p=请输入% v# b+ Z, \9 w7 \: B% D3 q( H# P: W; j
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p$ ^$ m( z3 W7 A5 o8 D: s3 y
注意这条可以用来取代 choice 命令
# u' g; n M2 x+ o注意变量在 if 和 for 的复合语句里是一次性全部替换的,如, m& K2 f$ |" l( B' y# y; y
@echo off, ?! b, V9 @5 U7 h$ ?
set p=aaa) Q6 X0 l; k$ c
if %p%==aaa (
& _) Z- I o: becho %p%- w9 b; o; b. Q- N$ ~
set p=bbb
8 v Y* h7 ]- s% w1 Lecho %p%
, q, K' K- M2 L3 ]1 D) z); j- D& m7 H5 W, U
结果将显示4 q9 e# E+ l, a7 _# s9 O
aaa
- B# D+ w" ?) [5 Q" B) e1 Faaa* @1 F) k; y9 C8 N. [& q
因为在读取 if 语句时已经将所有 %p% 替换为aaa
, h+ t2 T- q; G7 J3 _这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
' e% Y( r) J( g6 d! ^可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
+ \* F3 Y/ v' t: n5 M" x) p@echo off
+ Y# v" K P4 O8 K0 R$ Y7 g, a2 {SETLOCAL ENABLEDELAYEDEXPANSION
' Q# k0 g9 \6 Z( v" Iset p=aaa5 ^; ^$ z. b0 I
if %p%==aaa (1 v5 u1 m# X" |( q' Z, b
echo %p%* ?1 c$ v* ]+ ^. J5 P, K
set p=bbb
' h7 c( S+ e( H8 M" O* lecho !p!
8 l/ U! i. c, w" v1 |)
4 F; {; z7 j1 g9 @3 m; t0 e5 _ENDLOCAL
f) m, p2 _% D J+ V结果将显示% \3 [1 Z6 I# z
aaa, x9 d+ e- a" r: s$ o: H. H4 `" K+ `
bbb
7 y$ r, g' ]5 F O/ s* E还有几个动态变量,运行 set 看不到8 m5 y8 M2 |9 I& C
%CD% #代表当前目录的字符串
& T$ i/ M" g# N%DATE% #当前日期! Z0 [7 ~& ^# _( z1 k2 [+ I h' c; f
%TIME% #当前时间
" u; ?" X! K2 N9 a# w+ n%RANDOM% #随机整数,介于0~32767
* U" p' V6 [! ~. @( r: _%ERRORLEVEL% #当前 ERRORLEVEL 值 n/ c4 ]' O; S" H
%CMDEXTVERSION% #当前命令处理器扩展名版本号
2 R+ p3 }' d7 m- a%CMDCMDLINE% #调用命令处理器的原始命令行' W5 n3 N5 G6 g& T. {2 J
可以用echo命令查看每个变量值,如 echo %time%2 P- I c8 {' J; G ?# v
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到5 S) n8 g1 y2 H1 d
+ d! @& W2 o. I9 ` I i! a
32 start6 r* G5 b; b% r9 z) g
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
% |1 e. Q$ O. k7 j
1 a/ W# ]5 O& r# \: c5 h& J4 g33 call$ b( \5 O% ^$ {* S* r
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
7 k" f4 w& \$ x9 \& T: Q) a- {) z有时有的应用程序用start调用出错的,也可以call调用
) {6 x1 @+ _0 \( l' Q
4 o) e- H4 |, p: R; ~, h# p G7 \34 choice (外部命令)5 k m7 U/ u9 k% Y
选择命令8 `9 G% \5 t. ~ o9 r% F% K2 H+ J
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……+ r: G& p6 [: v) Y
win98里是choice.com& g! E, p Q1 S
win2000pro里没有,可以从win98里拷过来' T& p3 Q3 L$ {! W* M
win2003里是choice.exe6 p7 X. g; q: A3 V( M5 T
choice /N /C y /T 5 /D y>nul
% j, u6 M7 D( ]( i7 m3 t' d延时5秒
( W& X2 X2 D8 |7 ^! k4 R: u, h. A6 k: n- ?' w8 e
35 assoc 和 ftype
; K+ F7 x9 j& w9 T* W文件关联
) u. k; |4 m" Uassoc 设置'文件扩展名'关联,关联到'文件类型'- z! N6 h; Q1 V. X
ftype 设置'文件类型'关联,关联到'执行程序和参数') Y+ F" W' c/ z6 K7 \3 w3 e5 w8 Y
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
, i+ G1 q# ?! U而是先判断.txt属于 txtfile '文件类型'' `" q' D% J+ M) [+ t
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %19 q$ H7 z, B' s1 m1 l
可以在"文件夹选项"→"文件类型"里修改这2种关联
8 J: m- B. p2 eassoc #显示所有'文件扩展名'关联
, r+ n5 G- r1 D- Massoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile! J2 J2 O; G' c8 J: J1 R7 n6 y1 r* q, F
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
5 v+ X( f% D* m6 }- H9 ^assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile* T& ?9 l: d# K9 D, t# u X/ o& A
ftype #显示所有'文件类型'关联
' m: k6 d* k+ [7 yftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*& B3 k: w& f5 e1 o
assoc .txt=Word.Document.8
2 n$ p( _0 O4 [1 b1 |设置.txt为word类型的文档,可以看到.txt文件的图标都变了
# O2 Y& n- l# k4 X1 zassoc .txt=txtfile
" l* S4 T+ A A6 r. U恢复.txt的正确关联
7 ]/ o c8 f) Mftype exefile="%1" %*2 m& l# D4 [: o! F. C9 k6 R# q" L
恢复 exefile 的正确关联
& }* h: k5 @0 g8 S如果该关联已经被破坏,可以运行 command.com ,再输入这条命令3 {& K% x, D7 K, j% K: n2 B
8 e0 h- ?+ ^; D/ ? V q6 ^( O+ s36 pushd 和 popd: J# M6 a U; k" R2 W4 z$ R2 q- Z
切换当前目录7 _! N g; s2 t$ A! M# h* J
@echo off
! A) s# T' @4 x# i0 {c: & cd & md mp3 #在 C: 建立 mp3 文件夹/ r1 @+ |8 ^1 Q' T
md d:mp4 #在 D: 建立 mp4 文件夹$ j4 m1 U$ C6 T3 X- `
cd /d d:mp4 #更改当前目录为 d:mp43 D$ j c5 ~0 z' m) K) ^
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
: V2 g% L5 L: Gpopd #恢复当前目录为刚才保存的 d:mp4
' n! _- c& ~! T. o% J
9 @# j' U3 |6 A) [! q37 for
; H9 @, O5 ?% V! o循环命令# h* S6 {0 T, v5 y
这个比较复杂,请对照 for/? 来看
0 N9 d2 u/ N) J! R# m1 Y4 gfor %%i in (c: d: e: f do echo %%i3 f$ E8 n! {4 x3 b3 V5 y" {& w# e
依次调用小括号里的每个字符串,执行 do 后面的命令4 I" j: \! a x% ~" B
注意%%i,在批处理中 for 语句调用参数用2个%
6 _- E- y/ ]1 M% k9 i5 T% }' [) p& ?默认的字符串分隔符是"空格键","Tab键","回车键", v# w2 l* r: R# N* Z
for %%i in (*.txt) do find "abc" %%i
: L' }9 m# }% G" e# u, c* X对当前目录里所有的txt文件执行 find 命令% P( z+ n9 J1 c) W5 }% _3 d5 I
for /r . %%i in (*.txt) do find "abc" %%i+ Y) W+ `3 [; Y9 [, i
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行! N+ x+ U2 F8 U
for /r . %%i in (.) do echo %%~pni
+ l% i( H6 n# g显示当前目录名和所有子目录名,包括路径,不包括盘符
' \$ f" l8 n* Z/ t, `- B5 D1 Ffor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt; M5 B: l) f7 R# a# B" Y! l$ [% Y
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
. c+ n+ G% z0 @( U! Y1 C+ jfor /l %%i in (2,1,8) do echo %%i
/ h7 E2 R5 h V$ A; o( j4 D生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
) E0 |% [4 P7 D {# tfor /f %%i in ('set') do echo %%i
, m6 [3 c6 b w: k# j对 set 命令的输出结果循环调用,每行一个/ k2 t! |) M. s/ l& N3 Z1 d
for /f "eol=P" %%i in ('set') do echo %%i
+ v4 U% W% l: _取 set 命令的输出结果,忽略以 P 开头的那几行. c4 _9 J! w! |3 y4 _8 G
for /f %%i in (d:mp3.txt) do echo %%i
) a$ j d. D% f% b( s3 R- s显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称$ g4 t) B2 d" n0 k" P* v8 x
for /f "delims=" %%i in (d:mp3.txt) do echo %%i$ e+ Z( f$ p: {0 G# y' G9 H
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称! K* @- S7 z+ `1 O9 z
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
3 M1 V' |( x% f( N3 B$ H对 dir 命令的结果,跳过前面5行,余下的每行取第4列
! P+ Q% ?; D) B) ^3 L* [* J每列之间的分隔符为默认的"空格"9 g% h% b' K% J6 @# ^
可以注意到 dir 命令输出的前5行是没有文件名的
3 d* ?! i$ w- j5 S! Rfor /f "tokens=1,2,3 delims=- " %%a in ('date /t') do ( v; i. E8 @7 v8 {1 A8 M
echo %%a. r- F9 Q* b1 b+ l" }7 P
echo %%b
/ q# m( a# o& o; F& _: Yecho %%c
, l( j8 G7 ?1 P; t w) W& u& C. C)( t/ ]; L% \) X7 ]0 N. d1 _
对 date /t 的输出结果,每行取1、2、3列2 P. Z; Y/ P0 U+ Y
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
. J) V7 P6 |6 L& m# h) h分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
3 [; G q) h9 F, Y' d其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
0 o- {0 j8 {7 L- d& gfor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
% t$ T( F' v) q R8 u3 k* [+ `+ B取第2列给 %%a ,其后的列都给 %%b! A- v5 X S5 [; N! j' ]+ R) g* m
9 b& F' \/ L [) i
38 subst (外部命令)
6 P- E" J" B" H2 U3 \1 H: f1 U映射磁盘。
6 F6 S- N5 R- h. ^subst z: serverd #这样输入z:就可以访问serverd了" h# d4 E8 t5 W5 n3 z1 H4 `
subst z: /d #取消该映射
5 T6 W* \6 a% l1 K6 H1 @subst #显示目前所有的映时
$ ^7 n% G% R4 @' ~3 l4 x+ j5 G; o8 j- ?
39 xcopy (外部命令)
5 a8 L. S* U% d- E文件拷贝" G) V. ?$ G. T! N) z# f: Z
xcopy d:mp3 e:mp3 /s/e/i/y% A0 ?( b/ L' X
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件4 x- v t. ~4 q- q9 W, @( y P
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
7 g: t' C- V9 b7 i* C
$ G! p+ K9 j+ l. s" L6 ?3 L常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退2 B- F) H9 e- f& R7 G% G# a! Z
- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:, U3 C4 C7 e* V7 `0 q
" F9 u/ w6 S2 P- H: a
@echo off3 t7 Y1 D/ t2 w& e
set p=aaa
( K% \+ f' j5 xif %p%==aaa () J! p1 e9 r- F- v
echo %p%
- @' D/ B! I7 a" {: b# S7 Wset p=bbb
+ J+ s4 I1 S; n: u, q0 K0 u2 jecho %p%
! M0 d8 W: M/ s+ h3 H/ a1 f)! S Q+ e C7 E
pause
0 S" z8 z7 t1 [; t( M/ e |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|