|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!
& `1 F: [5 [8 g$ w0 K6 k& x 前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效% r8 {8 w. ^* _- {* V6 l" m
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
% A) u: X; {) u# O名为bat 目前比较常见 的批处理包含两类:
7 j( `; [ w5 D- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理 ?- E1 @8 i* _4 A- y% o# o/ h
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的& o! \6 c4 c8 u5 ^- R& y
命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件 6 U7 R+ c6 a: z! [* M
怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出$ t/ h6 G+ |! X- o3 p
批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set+ o# ]7 w6 P* I
批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||
. R! w0 _- W, I& W M0 s" U 常用DOS命令- 文件夹管理:
3 h c4 n8 o2 L! _* r( T6 |8 j- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。7 d+ G ^; E/ |" v, A9 t) L- b
- 文件管理: J5 j; E( a% P
- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同4 y$ g2 `7 N# K
- 网络命令:4 H: G# g8 q$ t3 o4 i* R4 i
- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表
" S3 E m. h1 l, V- d1 L
- 系统管理:0 a' J1 \5 F( E- Q. S% E Y1 s
- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置7 P% k; n; L) X1 @3 b; `. W
/ q; o; Q3 l: D0 g% }& E
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /? - S0 ]( _: x% R5 k4 d$ z+ y
% C, I1 x* V! Y: N: v- F4 f
Windows Batch 常用命令6 j- M' ^2 S( c7 V7 q+ n
1 echo 和 @
2 J- v4 X$ Q! [# ^" I; Z& j回显命令! L! _6 t8 _0 @: h" n# x& v
@ #关闭单行回显
+ p: O5 @: O' e9 B- Mecho off #从下一行开始关闭回显
' @* [8 B' ~8 ~3 _) a) a@echo off #从本行开始关闭回显。一般批处理第一行都是这个! P4 l, j0 x5 W/ o: j M
echo on #从下一行开始打开回显
6 Y( D/ J% b; r* `0 Mecho #显示当前是 echo off 状态还是 echo on 状态
5 Q' d- r( s) r1 m* {+ fecho. #输出一个”回车换行”,空白行
! g0 V ?6 |( O#(同echo, echo; echo+ echo[ echo] echo/ echo)! c0 Y( F" i$ o6 M* k
8 A. J- i! |4 f2 X! C* k, q7 ~2 errorlevel
# y3 K+ {' O7 a# |echo %errorlevel%
. e* R# s, v1 o: c* q1 A! y每个命令运行结束,可以用这个命令行格式查看返回码
! i) K: I6 |5 T, ~默认值为0,一般命令执行出错会设 errorlevel 为1
; _5 B2 W! o) H y! C$ s, i. G" h& D( O) @3 K$ c
3 dir
# w; J' M1 S8 T5 T$ Q8 @9 P8 s- Q显示文件夹内容
/ ~: P2 p9 G! {3 T+ q4 hdir #显示当前目录中的文件和子目录' L$ I) n' Y* m" w: a0 Q1 S0 l$ O
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件( R: A$ R" J! T! [& i" i1 p
dir c: /a:d #显示 C 盘当前目录中的目录: | S$ `- I' w, O: y" X" S6 N
dir c: /a:-d #显示 C 盘根目录中的文件
8 n, I4 i, P+ e8 V+ j* W- Jdir c: /b/p #/b只显示文件名,/p分页显示
3 ^4 U+ o' H) T; T T Rdir *.exe /s #显示当前目录和子目录里所有的.exe文件0 k4 }4 g9 b4 p# ~
6 T ?. N7 B( n& c. E: w7 f! A2 Y$ `4 cd
3 Q+ x" V$ X+ ]切换目录. P# |; e h' v/ L8 S$ S! {. J
cd #进入根目录% w- J. `: \; u( E
cd #显示当前目录
3 C" G5 n2 w2 D9 v9 {5 S9 I. A ~- Fcd /d d:sdk #可以同时更改盘符和目录% w9 |, K; ~( N; G' G2 N
9 u4 i3 X' o9 Y8 h
5 md
" Q+ A' Z g2 S( l9 y/ X8 K5 l创建目录3 g3 G9 R! Q& t2 B* o3 @& ^- o
md d:abc #如果 d:a 不存在,将会自动创建中级目录1 N! |5 f% I' O- @7 A% V
#如果命令扩展名被停用,则需要键入 mkdir abc8 l/ g& I+ z$ N: y* y# H3 o8 b
# a" @5 [' k8 e& C d' m
6 rd
$ B$ C8 S# H R2 l$ B0 s) G删除目录 M( f2 L/ y5 I# I C2 @3 b
rd abc #删除当前目录里的 abc 子目录,要求为空目录, F/ {* X. n7 m7 O
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
# h0 |) E2 s4 ]
) R1 d4 U% Z3 s7 del
8 A1 s+ h/ _ f1 C- X$ o删除文件' S, T2 ?" q; {# G: C# A
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件8 {: \/ ~& p$ R9 e1 {' m, x, O& j
del /q/a/f d:temp*.*7 I6 r2 g$ y! x9 V' M9 w+ p
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
' e: \# ]' a5 D) [, W; ]" p5 }9 Qdel /q/a/f/s d:temp*.*
) P k( ^' n7 Y! q6 C+ I删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
; G, D/ z, c6 E1 Q' |1 c2 ^ g6 K8 A4 B* _( ^2 r; T
8 ren% _$ {% D) L' q$ x7 v
重命名命令
+ d" @; H- c; C% Sren d:temp tmp #支持对文件夹的重命名" K! j$ x- j* o( U* V
9 M7 y& i& F8 V1 _& {" ?
9 cls$ [ d9 X+ L" c: ]9 M
清屏
6 _8 r& R2 V: L3 o; ]& C% N10 type
: P9 o: g( x5 n& u显示文件内容. u, G1 ^4 ] q4 n# t
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码8 h4 w, x5 K- ?( `" w
type *.txt #显示当前目录里所有.txt文件的内容
) v3 ]& c5 v1 _+ ]0 z; e
( l# D/ v* Z; {4 h& d8 T11 copy
' H: r! g/ x! v拷贝文件+ Q! J7 k1 @% D; k
copy c:test.txt d:test.bak
7 D2 ?* ?: I0 w) f+ L5 }复制 c:test.txt 文件到 d: ,并重命名为 test.bak
0 M3 d7 e* B% [# k0 [9 `& Q- |copy con test.txt
' P6 M' L6 R( x# S% |: `+ h从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
9 F. I& ^- N# `$ U* \4 j9 T$ l5 [con代表屏幕,prn代表打印机,nul代表空设备! q. {3 m3 e; O4 U% S/ e f
copy 1.txt + 2.txt 3.txt
0 q: U: f. n% m+ w合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件! q/ e4 K7 q9 y, V' w
如果不指定 3.txt ,则保存到 1.txt# V0 e" r( K/ O9 o+ m! y4 L' c
copy test.txt +5 M- w+ k+ A% n. W& ?6 b8 [
复制文件到自己,实际上是修改了文件日期0 `! m2 t: C' u) F: Y4 d% e E& q
1 z9 w X3 Q+ Z* y! j4 C% V12 title
6 v7 F2 v* o/ e& V0 t设置cmd窗口的标题 }" c$ w: N x$ V( @6 g0 I4 a4 p
title 新标题 #可以看到cmd窗口的标题栏变了
! o! A7 S8 I+ A- a4 W' e8 |" {9 ]9 b' G% q y8 A K) t
13 ver6 _ L% p _, p7 |0 c3 ~- h0 X
显示系统版本
9 T* A" ?0 Q1 Z: Y% D9 Y( ], x$ g
" G! a5 O8 }( I9 m- @0 d f14 label 和 vol
8 q0 k, }+ ]# x5 W; C设置卷标
# x7 m8 ?0 H1 g4 Svol #显示卷标
* B& {# `- g% p- Elabel #显示卷标,同时提示输入新卷标
% ?1 |2 h1 m, }6 ~9 }) U+ blabel c:system #设置C盘的卷标为 system
% x" D/ z5 {. a. j
8 r+ R- a- ^# M- m; w" R15 pause1 y! n# q F- t/ F Y5 z
暂停命令
( S2 q! E1 n% j) e, A. W z
8 }$ @) d( _2 J& U16 rem 和 ::2 _# b8 r& |. i
注释命令
5 \" s$ u5 \9 s* x- Z注释行不执行操作
D( k/ K; ^) R/ _2 Z$ C* K% a
/ J# Z8 V1 ?" F1 Z17 date 和 time
$ G9 k" F6 a. B* s- B0 y$ x; R3 g+ k日期和时间, N0 k5 X! W, {/ J/ L7 {2 r
date #显示当前日期,并提示输入新日期,按"回车"略过输入
; n; R1 H5 I2 _date/t #只显示当前日期,不提示输入新日期
3 @$ {; R- j, v! c% h; u' h# Ltime #显示当前时间,并提示输入新时间,按"回车"略过输入
2 p o6 V; ^7 i8 l3 E* k( b; ptime/t #只显示当前时间,不提示输入新时间
- U0 o6 U9 j; ^9 e/ x- v5 J2 i# r3 D% p9 _4 v( s
18 goto 和 :
2 q+ C2 T) C; Z) Y1 k: X/ y3 I跳转命令8 m( f7 c! ?- E$ e! S
:label #行首为:表示该行是标签行,标签行不执行操作
. f* b" ~& H! `8 Agoto label #跳转到指定的标签那一行
3 k. r7 P& M" j+ n/ J* [! ?& Z. y0 e" S2 @
19 find (外部命令)+ Y. s7 {$ @, P" ?5 z; O4 N
查找命令
/ h9 [4 j: {3 ~4 U) B: O# e& xfind "abc" c:test.txt
' J# |& X2 O2 [* F0 h! C在 c:test.txt 文件里查找含 abc 字符串的行
+ k2 s$ w6 T, _& J如果找不到,将设 errorlevel 返回码为1
6 g, z& I( S1 C" u& L! Gfind /i “abc” c:test.txt
6 t. m; ^$ k2 m0 c: T* s |查找含 abc 的行,忽略大小写
1 C/ g$ I! b0 K2 s; a* f3 Afind /c "abc" c:test.txt3 Y, Y6 D1 Y7 v6 J
显示含 abc 的行的行数1 E# j* {. P$ M4 r7 s, A2 X* E7 ^
8 f1 ]0 U+ e0 r6 i D% h" \
20 more (外部命令)
$ |* M- N% z8 w3 I7 V7 f; \% C逐屏显示
9 T$ s0 g: C6 C* omore c:test.txt #逐屏显示 c:test.txt 的文件内容
) n) C, K* _; j/ b: L4 Z; C2 v5 ]! s6 h5 A+ _; G$ }& J( }: S# J
21 tree" b* t& m, R; x& V
显示目录结构
0 X8 d. @/ A# o3 ~tree d: #显示D盘的文件目录结构6 k! ?9 Y! n. o! o/ u" I# R; y
* P2 C9 [5 X& @" i# Z9 ?- r$ s, n22 &
( x0 I' W4 G( Z. U+ w$ ^顺序执行多条命令,而不管命令是否执行成功
4 \5 l9 ?; X$ j6 ?9 R$ D2 Z, {: H5 s( E+ F' e# V
23 &&( W6 C7 L4 G, w" \1 N
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令: H& t6 ^8 I5 D% w) w
find "ok" c:test.txt && echo 成功: B0 N* [# X2 C+ H9 c, i0 V
如果找到了"ok"字样,就显示"成功",找不到就不显示& d: S6 ^8 G3 [
1 V& r. x% J! P; @3 l
24 ||8 U! r( ~ ]" A% e
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
# i. K2 d4 U8 X- p$ B' ~7 P3 \find "ok" c:test.txt || echo 不成功
/ V4 z3 C, W4 ?+ r. T; Y" F1 Y4 `6 z如果找不到"ok"字样,就显示"不成功",找到了就不显示
2 K' B5 y p; s4 |& t* H; n
/ R \7 s4 ], L7 N, I9 L' q4 ~25 |" v+ a: I7 q; x, t6 }" ]% n' v
管道命令8 h9 |- j5 W. N/ Q
dir *.* /s/a | find /c ".exe"
1 g7 n! M) U5 [* C管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令, [5 S4 S+ _5 P# Z6 i1 Z
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数 I& `8 D* ?3 N' F: {, k; O% c
type c:test.txt|more( B8 f5 ]% f- a. r9 m
这个和 more c:test.txt 的效果是一样的
- H3 @: z/ ^: u/ {, C
: Z5 v9 T& s3 c26 > 和 >>( H- u% ~" |6 c; c% c" n* k, d
输出重定向命令
# z9 W! M4 `+ {> 清除文件中原有的内容后再写入
0 s9 X4 q# _, e+ d+ Z>> 追加内容到文件末尾,而不会清除原有的内容
& X$ E- Y! e8 n1 y+ @# }* U# M7 n主要将本来显示在屏幕上的内容输出到指定文件中
$ i* P: q4 o: v! X! s, K0 T/ h+ A指定文件如果不存在,则自动生成该文件
' b: S; v, H9 n8 O" Jtype c:test.txt >prn8 O$ \1 n; N; Y$ o7 }
屏幕上不显示文件内容,转向输出到打印机
& u. ]; {7 y$ ?$ ~echo hello world>con2 v3 _& \' R! X* D
在屏幕上显示hello world,实际上所有输出都是默认 >con 的
/ l4 |8 J6 q# D' N) a5 Ecopy c:test.txt f: >nul' L# ^( a1 o+ p
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
; t7 I. T1 x5 \# J" dcopy c:test.txt f: >nul 2>nul
6 [& G& a& a: O不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息. H% J/ S( l' H/ X2 Z
echo ^^W ^> ^W>c:test.txt
/ b9 V; x$ k7 T7 F, o0 u生成的文件内容为 ^W > W
" a r* V7 j P8 Q2 P^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
2 M6 T, H" n0 m1 A$ [+ b2 ~, v m5 a6 ]$ X7 b
27 <
3 Z7 F/ X7 B) L4 M- v \从文件中获得输入信息,而不是从屏幕上 U2 Q. C- G j/ }$ g+ G
一般用于 date time label 等需要等待输入的命令
9 Q: f5 w5 y7 w: b# o4 ]: F@echo off2 n3 M. d0 t$ y9 f; c
echo 2005-05-01>temp.txt* B$ c( T3 N5 I% e
date <temp.txt F C0 e8 ]6 r+ E
del temp.txt! r. k! w4 `+ l1 h& D
这样就可以不等待输入直接修改当前日期
* q& f9 y/ m5 ^' F* b$ J1 V6 k& q- t! M- {8 r7 F9 W- n
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*/ w7 V0 j5 p& h6 `' C
命令行传递给批处理的参数0 m9 @; C7 F- r8 a0 P
%0 批处理文件本身
4 d5 k7 O4 G& T3 f7 Z" B" R%1 第一个参数: f3 R7 p3 C8 c
%9 第九个参数" r. G4 u: E, y3 g" `
%* 从第一个参数开始的所有参数 }! m/ R# T5 e
批参数(%n)的替代已被增强。您可以使用以下语法:; a: R3 o+ O/ S8 X& G0 A1 z7 f
%~1 - 删除引号(" ), 扩充 %17 D4 [4 x: C: j/ l) u8 @
%~f1 - 将 %1 扩充到一个完全合格的路径名
" f2 n2 O& A1 ]8 [5 m%~d1 - 仅将 %1 扩充到一个驱动器号
- t$ Q0 S4 X' q+ J: l%~p1 - 仅将 %1 扩充到一个路径
8 Z$ L# X" {! @* B) R, { H$ F1 N2 n%~n1 - 仅将 %1 扩充到一个文件名
) d- l( ]) q+ U; `) H) E2 ~%~x1 - 仅将 %1 扩充到一个文件扩展名
4 N+ _8 V c, t" {4 s0 b9 P%~s1 - 扩充的路径指含有短名' f, u5 g9 @" W' X8 Z& Z
%~a1 - 将 %1 扩充到文件属性1 w- _$ |( ~1 G( d2 S1 H
%~t1 - 将 %1 扩充到文件的日期/时间
% f1 E' J6 I1 S$ s6 G%~z1 - 将 %1 扩充到文件的大小
6 \: `" n8 \5 N/ s6 B3 A) x%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
5 v4 T* h/ l; t3 g扩充到找到的第一个完全合格的名称。如果环境
( T" R6 i) V8 J# z% M变量名未被定义,或者没有找到文件,此组合键会2 s' g$ N3 s: a# w
扩充到空字符串
: g& I. \. u9 d1 F可以组合修定符来取得多重结果:8 V, ]! r. H) P# z6 Z1 q. Q
%~dp1 - 只将 %1 扩展到驱动器号和路径6 n$ ]1 V, L2 u1 t5 X, s
%~nx1 - 只将 %1 扩展到文件名和扩展名7 t: y; a( ? y# K6 Z, m
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,4 y( q% z C! n. P5 X: E
并扩展到找到的第一个文件的驱动器号和路径。+ b1 J* Y- Y& K. L4 _( I- H
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。2 I4 h3 d- S- H2 J
可以参照 call/? 或 for/? 看出每个参数的含意
( A3 y# K! B% Q( Eecho load "%%1" "%%2">c:test.txt
5 M# T. T0 s. _9 l& U9 `生成的文件内容为 load "%1" "%2"- e2 W, t- Z# } J3 x: o1 C
批处理文件里,用这个格式把命令行参数输出到文件
$ F- S# F7 D( ^3 P4 ?0 a s6 {8 C5 d
5 N3 |1 |# B6 r% ^29 if
6 t5 I4 w! V8 b2 M- K判断命令
3 o( {$ W3 m, i2 c4 xif "%1"=="/a" echo 第一个参数是/a
( j; L/ @. N# B/ r; j8 |* o: @if /i "%1" equ "/a" echo 第一个参数是/a
W3 ?' B, F5 S6 \" e+ d! G' j- o' Y$ l/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?/ M) p; W: s$ m( Z
if exist c:test.bat echo 存在c:test.bat文件
; q. g9 T) v3 j. p/ W" s+ eif not exist c:windows (% ?. T8 [2 v' c \; x# S, F# u
echo 不存在c:windows文件夹6 d. \ @8 ~: D
)
1 Y) u- M, A. B* ~' E: cif exist c:test.bat (2 A. Y2 p2 b* p a, q; Z
echo 存在c:test.bat
$ U9 K! G3 x: H) ]4 t2 g) else (5 i$ }" x: }$ S0 B( d
echo 不存在c:test.bat
* A5 ^' z6 o5 K9 Q# r. O( p)
4 p& P* D- i/ r+ H% [30 setlocal 和 endlocal6 J7 q/ p3 f6 |! |1 V
设置”命令扩展名”和”延缓环境变量扩充”7 m1 {" I6 C$ `+ [9 x1 W( s
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
1 H- `5 }" R9 sSETLOCAL DISABLEEXTENSIONS #停用"命令扩展名" ^! K3 p ~6 [% A3 Y- E
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"" t9 Q! h4 n- v4 u; f% x h
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
+ A1 ]/ s- C1 N8 d4 L( ~. F2 QENDLOCAL #恢复到使用SETLOCAL语句以前的状态: G G4 y4 P3 H! `3 M2 |' Q) o
“命令扩展名”默认为启用7 }- _/ z9 J! [0 L9 H
“延缓环境变量扩充”默认为停用
m& {9 T9 ^0 O批处理结束系统会自动恢复默认值
8 m% `1 X0 t% `可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
/ F% z& A. } K& G! s序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
" H$ V' n) j+ ]; Q1 D保程序能在其它系统上正确运行. h# Y# r# a( O: g2 H
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程5 `0 X/ S6 u8 s3 c% i/ p
/ F, j; K! q1 d+ e# _* g/ J' d/ W
31 set
2 B f8 M* ` m" V- ?! b+ F设置变量
; o' O% k3 p# K, m引用变量可在变量名前后加 % ,即 %变量名%' z0 |/ Q3 {& N: {6 `* v
set #显示目前所有可用的变量,包括系统变量和自定义的变量/ Y& ]9 C0 d% s. N+ {3 U0 w
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用1 ?2 ?$ U% a6 ~1 `/ j
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1- Q( g; h. k6 z# |
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2( b/ q3 M* T/ w1 e T4 O
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb28 g, Q3 x7 r ]( t. q
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
( G$ _" |+ {! k( X7 u3 |0 F) Secho %p:~6,3% #显示第6个字符以后的3个字符,即aa2
9 Q- W9 C- {! s* v3 m* techo %p:~0,3% #显示前3个字符,即aa16 x# I% n E) E3 |4 B
echo %p:~-2% #显示最后面的2个字符,即b2
) m/ R, y8 u; C9 a( y, eecho %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
4 J5 X) P: J V1 G6 Yecho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
7 p2 V, n: v0 \3 f! Recho %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
6 S" C n7 j ^3 Jecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2. U" s1 `. V% W5 x1 [8 U
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2) c* p; q9 _% Z# U( ]' z4 u& L
set /a p=39 #设置p为数值型变量,值为39
3 l6 k! H% J4 pset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
8 g% A& j+ u2 {: I0 c) G1 tset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
0 T$ k; |' a2 Q9 x A3 ^, o6 K( q1 Iset /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
$ L5 f0 I0 ?( J [" bset p= #取消p变量3 t3 [1 o; Q; ^4 S8 A0 p9 ?
set /p p=请输入
( W9 z8 \/ j. o! ~( u. X屏幕上显示”请输入”,并会将输入的字符串赋值给变量p3 e: r5 i7 p% G/ a& b
注意这条可以用来取代 choice 命令
. e. q" J7 c+ F. x* T注意变量在 if 和 for 的复合语句里是一次性全部替换的,如& V% E; M) O; Z. z7 h/ t. J$ O; a
@echo off& n1 c* i" X9 L1 ]
set p=aaa
( c3 F( h# E9 ~! P3 B! i* W ^/ m# Sif %p%==aaa (
# B3 R. N- I6 W" ~$ @echo %p%' p& n( n3 q1 P8 W1 u1 K
set p=bbb
% `" x/ s2 }) Decho %p%5 T' t0 C% X; p4 B
)
% j: y3 S# o; u9 S2 `1 @结果将显示
8 {* a: l8 v; ?% S: `aaa6 g; S ?4 p, N9 e+ K$ c
aaa
6 j0 l& X: d" U8 M0 d- s因为在读取 if 语句时已经将所有 %p% 替换为aaa) w! r; r8 D7 }6 H$ L* I d
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
* a. i0 {# {; L h可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!: h! W! \! s5 ]4 H
@echo off% d7 K% B/ n1 t3 x" ?+ v
SETLOCAL ENABLEDELAYEDEXPANSION
' J' u7 p, n5 K+ z4 D5 @set p=aaa2 l6 s$ [7 U# V0 o4 s
if %p%==aaa (
& d' ~ Q0 e& H( s. P# k3 u: z oecho %p%2 t) o( \7 @( B$ e: |
set p=bbb6 h# Q0 L: {9 h. L& F$ E) |/ H
echo !p!
: ~1 g! X7 w# H. K" Q)/ {9 U) k& l0 N8 V0 I0 ]
ENDLOCAL
$ i5 g9 p5 y( y0 Y" W2 a' [: @结果将显示0 V) ]3 w; Q: L4 s& {/ \' X
aaa, t# w1 O5 K4 {9 J
bbb
, N' M) m6 {4 V4 g( @还有几个动态变量,运行 set 看不到
* a: b ?, U9 M: R6 R%CD% #代表当前目录的字符串
& J4 j4 R$ l& @4 ^8 W0 I+ V) R; |%DATE% #当前日期3 k1 y& s4 J4 B. {; ]
%TIME% #当前时间' A& k1 M6 N& T6 x4 q( D& v
%RANDOM% #随机整数,介于0~327670 L+ U4 q5 v3 D/ ?
%ERRORLEVEL% #当前 ERRORLEVEL 值
5 T7 M& o( {6 K0 `1 L8 u6 c' r' h%CMDEXTVERSION% #当前命令处理器扩展名版本号, T6 y6 A6 q V. f
%CMDCMDLINE% #调用命令处理器的原始命令行
) ~6 T2 N3 q9 h可以用echo命令查看每个变量值,如 echo %time%0 T% ^/ z4 Z! O# H6 c
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到& g% m8 k0 u' }/ F: r4 H
+ H" x8 k( z& X0 _7 y
32 start
5 I8 B! K& u* i批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
6 j) ]# n3 E" F( k, {! `+ G
* s x- Q. X% m$ F33 call
# F q7 v) d- Y- G! a$ ^. V/ q. [批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
5 y- C7 \. q. b9 c1 _有时有的应用程序用start调用出错的,也可以call调用* ?- Y7 s* u' u8 b" f# N
* m" F1 l0 k8 C
34 choice (外部命令)! ?9 G% i1 K: t7 q ~
选择命令
1 \9 w, `4 p. `: g让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
- l i) i7 _# y- S5 v# C0 [win98里是choice.com
1 L! u6 w/ m/ L: |7 iwin2000pro里没有,可以从win98里拷过来$ @: P! D2 ^6 r" I$ A
win2003里是choice.exe0 Y6 G: u4 Y8 b; }$ s- g
choice /N /C y /T 5 /D y>nul
; F( s: w9 ?, H k延时5秒, Q O. m, R. x# D) p: t
( x: m6 }6 d8 U+ L. @9 u6 u35 assoc 和 ftype
/ g9 f* H# ]% R$ m% u文件关联/ s3 B; M$ t( S4 [
assoc 设置'文件扩展名'关联,关联到'文件类型'
0 w: B2 e2 P9 r# uftype 设置'文件类型'关联,关联到'执行程序和参数'
# a* C& E8 ?& @% q! V& s1 U6 I当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开# u, p( R+ U& P- X/ z
而是先判断.txt属于 txtfile '文件类型'
2 _; c( h: D9 k再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
; w% \2 U# r ~0 T; c# L- q可以在"文件夹选项"→"文件类型"里修改这2种关联
) _: }$ a, o1 Z7 E1 V% Z. Eassoc #显示所有'文件扩展名'关联0 K! r+ i) Q2 l+ y6 F/ r* ~8 v2 m
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
3 {& c9 F( k" J3 ^9 T" ~7 Wassoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8) n5 g z4 e1 _% @
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
1 H) W g* r( Z F* \; vftype #显示所有'文件类型'关联( o) r( v+ y- F) ^0 s% ?8 C, r! R+ Q; [
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*4 E- Z+ [! ^. d7 v1 M x
assoc .txt=Word.Document.8
5 K+ f \4 w' r/ t# F, v# d设置.txt为word类型的文档,可以看到.txt文件的图标都变了9 p6 t( g4 X) i( }
assoc .txt=txtfile3 D. n* r3 `. z0 m
恢复.txt的正确关联. _! m2 c' t/ A0 V" M" o* D; U2 ^
ftype exefile="%1" %*
' D8 y1 A2 ^8 x! ?9 W恢复 exefile 的正确关联
9 `# o* N( R) }如果该关联已经被破坏,可以运行 command.com ,再输入这条命令4 g" `5 d* f8 \3 e% G
) R g. u% d$ |. T. r
36 pushd 和 popd% ~ Q& S8 C4 P Q
切换当前目录: L$ |6 j2 i! V7 |! ?2 G7 H" w
@echo off! T. V' v6 V3 W! Q. j5 J+ ~1 k
c: & cd & md mp3 #在 C: 建立 mp3 文件夹
" K. m U9 H8 w: ?) R, kmd d:mp4 #在 D: 建立 mp4 文件夹. K) G2 H: ?' b* j
cd /d d:mp4 #更改当前目录为 d:mp4
" C7 P" h9 S+ F1 Tpushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
; Q1 s+ D2 h1 R7 k: J8 I" Hpopd #恢复当前目录为刚才保存的 d:mp4
" d# E$ V' ~2 O- r4 d% u7 d" m/ Y( u7 j4 j% p- J
37 for. `7 d) P4 E% z
循环命令5 y' ]" P2 O! i } o- E) \3 ?" r
这个比较复杂,请对照 for/? 来看9 L6 D3 j% X+ g$ C; [* B
for %%i in (c: d: e: f do echo %%i+ q' x: D1 K/ \. L5 X" l, [
依次调用小括号里的每个字符串,执行 do 后面的命令
( z7 k3 C0 X3 x* b: D注意%%i,在批处理中 for 语句调用参数用2个%
8 B# O3 a n% o默认的字符串分隔符是"空格键","Tab键","回车键"* K' O5 q9 r5 f, h
for %%i in (*.txt) do find "abc" %%i7 V% W: ~, O" E V, ]
对当前目录里所有的txt文件执行 find 命令9 I) s; T$ B8 b" |2 |- h& [/ m
for /r . %%i in (*.txt) do find "abc" %%i
/ F- @; n* a( ~" f在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
# s: P6 j- O* G8 J. ?& [for /r . %%i in (.) do echo %%~pni
7 M! ?! K4 H% \# x/ E显示当前目录名和所有子目录名,包括路径,不包括盘符* y: { ?2 w9 c% |, Q5 D: w* c
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt" i- ~7 X6 ^( z/ H+ H
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去& u& O- Z" Q! y( J8 k8 `
for /l %%i in (2,1,8) do echo %%i
6 ^9 K5 d6 t( n; U" E+ h1 q7 G生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
q+ \8 X6 Z. c; [5 Afor /f %%i in ('set') do echo %%i
( U; M- |6 x/ P& z) X7 y对 set 命令的输出结果循环调用,每行一个
2 p% X" R, Z! ~% L( Ffor /f "eol=P" %%i in ('set') do echo %%i1 h% K4 A, T% ^3 E, U
取 set 命令的输出结果,忽略以 P 开头的那几行
( k+ o: o4 t& U |9 K& ?for /f %%i in (d:mp3.txt) do echo %%i# S2 T; @! W. ]+ Y# o& l
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
% @* S% d& I @3 d3 z8 Dfor /f "delims=" %%i in (d:mp3.txt) do echo %%i
8 [; [" O8 B: E) g( Z* i2 u c显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
& s* x& n! h0 [/ H i8 ]* Nfor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
7 e3 s. `( `* [! n0 c6 R对 dir 命令的结果,跳过前面5行,余下的每行取第4列$ u: g0 g/ W1 {5 \8 T8 ?& ~
每列之间的分隔符为默认的"空格"
/ x0 R6 y0 u k! R- b可以注意到 dir 命令输出的前5行是没有文件名的/ j3 j: L- R/ I5 g+ O& g5 y
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do () i9 |7 Q: C3 m' \ {- Z7 @
echo %%a) m8 t: o! }( G9 A" b, o( i o& |
echo %%b6 G1 G- i8 v0 w# }( D
echo %%c
3 b7 w- L& A/ q3 w6 `5 g) q)0 \ n+ B9 ]1 I/ N* b
对 date /t 的输出结果,每行取1、2、3列
$ I) V) k1 D/ a7 G# _4 [' z' Z2 S5 j) K第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
$ n% n6 W1 }5 V5 C* ?2 ?0 d6 A- N7 J分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"3 a4 c) J1 e$ H4 i9 A" b, L
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的( ?- r/ T, X5 \2 ~) E. W
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b' M$ Y, k, n8 f0 Z
取第2列给 %%a ,其后的列都给 %%b2 F+ @4 X& j3 {" F( P
. {, q& Z( Q, n% n38 subst (外部命令): _) r% l4 b( }* l9 |
映射磁盘。
) Z6 y7 p7 [' g/ [, Usubst z: serverd #这样输入z:就可以访问serverd了4 ^) X! s' R7 j# r
subst z: /d #取消该映射" l9 @- ` ], ]' y% q3 f
subst #显示目前所有的映时
% T5 A& W. d) F3 S$ `8 q" [, [
: C0 S; K9 A( \6 F) f39 xcopy (外部命令)
5 K' t) K: e% K# R1 A, h文件拷贝; V, y& U- q$ x
xcopy d:mp3 e:mp3 /s/e/i/y
8 Q3 H9 u; A6 I( V7 D5 [0 O9 X复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件7 q5 w- N9 w. B
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问- i6 G3 b) K! j% D( @: L- L
- Y% J- s+ W5 p# X& R/ l常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退. r# ^$ M/ g4 H& Y0 [8 W) M4 _
- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:
; ~6 r4 V% j5 P. I0 S+ u 2 p( R( x# Q: E& I
@echo off& m6 W, c" g' R
set p=aaa
- T8 ^6 T0 _5 E1 Tif %p%==aaa (; D4 z2 V0 \1 U
echo %p%5 Y# \0 Q% @3 J. x
set p=bbb
! L) g" Y5 Q+ A2 `( iecho %p%
! Y* J# S j. W/ y6 t- o9 U' P)
) F/ F1 z5 d9 H ?3 z& M8 ?pause
截图:3 ]7 X, z8 _# K* V6 I
2.批处理.bat 文件中输出中文乱码 & s4 j) o8 l. v# p
- 原因:记事本新建的文件,编码不是 utf-8
- 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
- 操作截图:- S+ i) R7 h# q5 b0 w5 n
- 效果截图:+ T1 ]4 S, b0 a& r1 s7 n" n
/ K6 D' k, e2 w& R
+ j# O% t- j8 R& j ' R: V3 x Y5 n+ [! ?
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|