扫一扫,微信登陆

 青浦修电脑 青浦笔记本维修 青浦手机维修 青浦电器维修

搜索
查看: 1472|回复: 0

Windows批处理(cmd/bat)常用命令教程

[复制链接]

307

主题

335

帖子

1897

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1897
QQ
发表于 2021-6-25 19:48:12 | 显示全部楼层 |阅读模式
Windows批处理(cmd/bat)常用命令教程
简单详细,建议收藏
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
  • 2.批处理.bat 文件中输出中文乱码
  • 解决方法在文章末尾!
    / i6 d! p0 B9 Q
前言
  • 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效
    / M+ B/ w# `# @+ E8 @
在Windows中善用批处理可以简化很多重复工作
什么是批处理?
  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展9 S" ^. C* D" _- B! U) K3 C% K
    名为bat
  • 目前比较常见 的批处理包含两类:

    # x- m2 t& Q* C, c% V  \
    • DOS批处理和PS批处理。
    • PS批处理是基于强大的图片编辑软件
    • Photoshop的,用来批量处理图片的脚本;
    • 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
    • DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理& _7 W- {- q3 ]* z
  • 批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
    + M2 c" Z1 p9 m; w  M- b5 E! {8 W命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行
  • 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
    1 t# T' {1 J) s
怎么创建批处理文件?
  • 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
  • 一般情况下,每条命令占据一行
  • 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
  • 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
    & d/ D' K- }1 v( x
批处理命令简介
  • echo
  • rem
  • pause
  • call
  • start
  • goto
  • set
    . X& E1 @* i9 m/ ~0 a" d
批处理常用命令总结批处理符号简介
  • 回显屏蔽 @
  • 重定向1 >与>>
  • 重定向2 <
  • 管道符号 |
  • 转义符 ^
  • 逻辑命令符包括:&、&&、||
    0 N) z7 ]8 y& m' O: y/ o; l
常用DOS命令
  • 文件夹管理:
    9 {7 c( ]6 ~% |. @" |+ D
    • cd 显示当前目录名或改变当前目录。
    • md 创建目录。
    • rd 删除一个目录。
    • dir 显示目录中的文件和子目录列表。
    • tree 以图形显示驱动器或路径的文件夹结构。
    • path 为可执行文件显示或设置一个搜索路径。
    • xcopy 复制文件和目录树。* {( Z1 A$ m2 s% E+ b( ]
  • 文件管理:4 G5 r$ L0 r' f1 k0 i4 F
    • type 显示文本文件的内容。
    • copy 将一份或多份文件复制到另一个位置。
    • del 删除一个或数个文件。
    • move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
    • ren 重命名文件。
    • replace 替换文件。
    • attrib 显示或更改文件属性。
    • find 搜索字符串。
    • fc 比较两个文件或两个文件集并显示它们之间的不同# M* u' @! s3 A0 Q) ?
  • 网络命令:+ b5 z6 ?/ ~: a9 d
    • ping 进行网络连接测试、名称解析
    • ftp 文件传输
    • net 网络命令集及用户管理
    • telnet 远程登陆
    • ipconfig显示、修改TCP/IP设置
    • msg 给用户发送消息
    • arp 显示、修改局域网的IP地址-物理地址映射列表, a8 c) q; Y! |
  • 系统管理:* p( l$ V  _9 b# w! A  b. j+ P
    • at 安排在特定日期和时间运行命令和程序
    • shutdown立即或定时关机或重启
    • tskill 结束进程
    • taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
    • tasklist显示进程列表(Windows XP Home Edition中没有)
    • sc 系统服务设置与控制
    • reg 注册表控制台工具
    • powercfg控制系统上的电源设置: s; s5 v/ [9 J% }5 m
    & C5 |" `+ z* \% q& r* y
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?

% i) {& w0 X; ^$ }/ A' C: ~- P; S7 k+ q+ K, g# D% _
Windows Batch 常用命令9 L2 ?9 s" p; E; D: ]1 \
1 echo 和 @+ d3 V  c  @$ U1 }; l
回显命令7 I( R; C" m9 \/ ?9 Z3 C
@  #关闭单行回显
, `5 \  k( l4 K* }: F. }echo off  #从下一行开始关闭回显, m  h( Z* ], A1 ^. s* f
@echo off  #从本行开始关闭回显。一般批处理第一行都是这个
* ?* T: a' Y2 ~$ wecho on #从下一行开始打开回显' }8 ^3 B6 T* O/ g' w7 n
echo #显示当前是 echo off 状态还是 echo on 状态- f8 o! u' L) G- ]# f! ~5 n: C
echo. #输出一个”回车换行”,空白行
3 K5 X; I: j1 q' g# S( {, H#(同echo, echo; echo+ echo[ echo] echo/ echo)
7 K: w0 V; ?2 F- q5 A: j7 S: A
5 u8 m5 k5 Z3 U, ]  n$ y2 errorlevel: l% M) Z4 X! U1 x) ~( s  c
echo %errorlevel%
) S  r; c8 @  S每个命令运行结束,可以用这个命令行格式查看返回码3 S  r) A! o' R# L) o/ }* A
默认值为0,一般命令执行出错会设 errorlevel 为1# a5 B2 @3 G' H. E1 i6 P+ c
/ H* G! M) M6 ~  y( ~3 g. \9 ~# l
3 dir" s( {8 `7 d4 I& x- U/ j1 @' w3 G
显示文件夹内容
% R4 L$ d4 i% M9 pdir #显示当前目录中的文件和子目录
0 j$ g+ @% s$ l6 Xdir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
: ^8 r9 A; a( h& Y9 jdir c: /a:d #显示 C 盘当前目录中的目录
5 k0 }( i- d, ]! Z/ L, V0 A* ydir c: /a:-d #显示 C 盘根目录中的文件( A1 m* h; R5 W* M5 t9 O  ]- a* C' C
dir c: /b/p #/b只显示文件名,/p分页显示1 c' y9 D( b2 G; [6 o
dir *.exe /s #显示当前目录和子目录里所有的.exe文件
4 Q) }: W- G; j5 j, M% `7 t" M+ K9 V* G2 M' q: z+ l) |' B
4 cd& f3 W4 N+ I1 D. E  l
切换目录
1 }6 m% Y3 _1 G; o+ Fcd #进入根目录
& N$ V$ X; _9 A2 j8 H3 W9 P8 j2 Z& O% Jcd #显示当前目录
# u. j3 ^; ~/ N' W& Hcd /d d:sdk #可以同时更改盘符和目录) Y+ H3 {2 a: i. a/ ]& o% u0 h% ?

5 A0 o6 @2 r) s6 t5 md6 d. f( G( ~7 h1 l
创建目录6 Z* h+ ^5 f9 d, Y. E
md d:abc #如果 d:a 不存在,将会自动创建中级目录4 w. G6 b% y: j% V4 D8 A
#如果命令扩展名被停用,则需要键入 mkdir abc
& Z( R7 ^6 X) L" i6 T3 C( |' \; A2 d
# j: ?! V8 b' {! w1 x6 rd/ B' @$ R0 V5 O/ A9 j
删除目录& @+ r3 _1 D4 u6 x8 b$ _
rd abc #删除当前目录里的 abc 子目录,要求为空目录0 t4 P9 b3 P3 I* |2 V
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
6 Q) w' W7 h& c" J; [% L
9 v' ^+ Z5 \/ N; ]2 f7 del
% B$ Z9 x7 r+ r4 e删除文件
9 ~2 }0 q+ a# _: [del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件! [8 [6 e$ n0 z3 w6 t
del /q/a/f d:temp*.*! J2 M/ M& L$ Z+ w# a7 G
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
( }" r5 T' A5 U0 b  D% f  gdel /q/a/f/s d:temp*.*
. w$ d) G( T1 _  ?删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
: m2 c- p! e- k( @% g
# ~, B9 u9 E# q7 d4 d/ x8 ren
& U5 G: A1 V% W5 S3 r' u) f( f- P+ r重命名命令. M  o- N+ N% ^& |: C4 F2 Z
ren d:temp tmp #支持对文件夹的重命名  F( w1 T# A4 \7 @, {# U

0 n5 P8 }) c+ W, Q3 \9 cls6 q/ {6 `+ m6 d/ G1 _" V! @! X
清屏
0 V7 N  G. X9 ]( }1 H/ B8 [5 }/ c. V10 type
4 ~; L0 U7 a3 T. }- s显示文件内容
2 T8 }7 C1 ]) ~& Y2 C- }$ Z* K% Ftype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码8 i. R' r; b' t0 X* b- A) Y
type *.txt #显示当前目录里所有.txt文件的内容
! ?3 ~8 H( E# J  k$ c+ I# y% ?. k; J
+ \9 k$ d5 f0 o: }11 copy5 h' p% S0 m# M; ]
拷贝文件7 f' E4 l2 B' [0 }8 n5 R
copy c:test.txt d:test.bak8 F" H, L. W) A" A1 O; l
复制 c:test.txt 文件到 d: ,并重命名为 test.bak
7 s! n" @/ b+ @1 V3 L' I# acopy con test.txt7 b: e3 ~1 n% L: ]0 N& R
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
/ N! y; ^# A- Q6 c8 Lcon代表屏幕,prn代表打印机,nul代表空设备/ j$ k- u5 q" R& z6 ^
copy 1.txt + 2.txt 3.txt# Z; w: g5 q# A* m% x
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件- X6 i3 N1 j" d3 r/ I
如果不指定 3.txt ,则保存到 1.txt
1 K4 P  L" Y1 J1 D1 Zcopy test.txt +
, V3 y- p& M% N- i, E: ]/ c4 e复制文件到自己,实际上是修改了文件日期, V6 ^( f/ q  N1 E& Q) C& O$ V& w7 r/ h

/ l8 e# A( F# A7 H  t12 title
# A1 b) ^8 g0 H( l5 f" B设置cmd窗口的标题
+ v' p  I% Z1 ^, stitle 新标题 #可以看到cmd窗口的标题栏变了- Y2 B. A, y$ h+ v/ \& k7 K

( }% {7 z8 W) Z" {13 ver0 _, S( o4 }7 w" |2 w6 j
显示系统版本8 F$ B( d+ J5 l/ h3 C
5 s( V0 }+ n  U0 F# A6 @5 d( s
14 label 和 vol0 ]0 u1 v1 q  B$ v8 k6 N
设置卷标
8 P+ E0 ~! R( c  Gvol #显示卷标
- J; }9 h! r& S7 W5 E  Jlabel #显示卷标,同时提示输入新卷标
; y6 L: ], Y" r4 Y, ]6 s; G$ b7 }3 x% xlabel c:system #设置C盘的卷标为 system* l1 e- y  i* D% z' \# N1 j$ i
( Y/ R2 v$ Z1 E( m* X2 @  W# D
15 pause8 G9 @% p  T1 t7 K
暂停命令
3 f( {. \0 H$ }, m+ n
- D8 ^6 q5 ^' O; G' P5 I$ G16 rem 和 ::, |# g" s8 d. t" w& I& b
注释命令
  R4 ^: O3 r! N) Z注释行不执行操作3 p  R$ p5 x! N+ R& Y5 Z

; \* `; S" \: c$ t/ ?; z. s$ T9 D17 date 和 time
5 m9 D% h  k- E* f日期和时间& e* n& Z4 w& G9 L' N( q
date #显示当前日期,并提示输入新日期,按"回车"略过输入
9 S( f6 k% ~# D, c: E+ gdate/t #只显示当前日期,不提示输入新日期) K6 B* L/ j  H! ^: w2 H
time #显示当前时间,并提示输入新时间,按"回车"略过输入7 A' E7 @+ k( }% e
time/t #只显示当前时间,不提示输入新时间
* Q  x( t! ^3 S6 ^& |) ^
) C0 G! v$ l: f18 goto 和 :
2 `3 c: [: h5 b8 ]# d3 L8 o* Z跳转命令
" G% `/ r/ W9 o$ ~3 A:label #行首为:表示该行是标签行,标签行不执行操作
( C7 n5 J/ `4 Ugoto label #跳转到指定的标签那一行
" q: z% S; e; F2 }- P
; Q) `. f) L1 o) ]" n" b0 b7 {- e19 find (外部命令). [! ?' {5 x% c1 X% h) s: \
查找命令$ Y, G  j  a8 u0 K6 e
find "abc" c:test.txt
6 b2 z! t  d% P+ x在 c:test.txt 文件里查找含 abc 字符串的行
3 P  C3 T1 k; G+ Y3 i1 R如果找不到,将设 errorlevel 返回码为1' x. w; o- ?) ^3 b! Q# y/ S
find /i “abc” c:test.txt+ ^" A8 c$ y& R. z
查找含 abc 的行,忽略大小写$ o, f) E0 ]$ z
find /c "abc" c:test.txt
5 i% E: t8 }) ^7 V; S& ?显示含 abc 的行的行数4 G! \* Z( a. d7 R6 Z; {% \3 a

) |' y% x' }3 H20 more (外部命令)
, Q  b8 d- U7 W" D7 ]7 a! S逐屏显示
7 E8 I3 P& `, b9 ^: [* bmore c:test.txt #逐屏显示 c:test.txt 的文件内容1 W7 l9 c# r/ H$ R0 i% l, O8 U
6 R; ]  E0 M+ B9 C  ]- d+ L
21 tree
5 T2 Y( }5 C1 U4 c3 p( _/ P) [显示目录结构
7 D3 L6 m: X6 W/ W: Q0 Gtree d: #显示D盘的文件目录结构
4 r4 t5 Z* s- Y5 m: R, n% u+ P1 E# V
22 &% V% |) J4 }1 h8 j: B
顺序执行多条命令,而不管命令是否执行成功9 B$ {0 U% ~4 r! j4 c5 d) V

: R& _# B  W$ J. p23 &&- n# N/ P3 W) U
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
0 n7 A, F+ F0 f$ d) K  h- _* Kfind "ok" c:test.txt && echo 成功
+ H5 M- p6 s6 Y如果找到了"ok"字样,就显示"成功",找不到就不显示# `6 V& x9 l  |/ J) r

$ D4 v! D7 M2 h) v' [24 ||) F% K- F8 P$ m+ I
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令, w* e. j0 a  y
find "ok" c:test.txt || echo 不成功
# f" s( H1 u" b2 P; O1 x2 E  x如果找不到"ok"字样,就显示"不成功",找到了就不显示2 O% S( d% a  f9 b2 O

, b4 b  Q; d+ ^* U- A25 |
5 `7 `  a. y+ k" U  w9 P" x3 [管道命令
% ~  a8 h4 `3 _) Z4 A& A$ ldir *.* /s/a | find /c ".exe"0 B$ ~1 t7 v" e  U, ~4 Q
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
; A/ s9 @; j* N0 i' ?' E* T: V( l该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数, D6 c- c3 `# [, w% V7 B6 t
type c:test.txt|more
) }; R" N" D4 T这个和 more c:test.txt 的效果是一样的2 ?. F  w0 j! F8 g/ v/ W" l# z' I

8 K4 F/ r/ l; V26 > 和 >>
% y! u6 j5 j7 v6 J- G: J5 V输出重定向命令
+ ]3 F& T7 o# ]& ]> 清除文件中原有的内容后再写入- ^1 ]" ~4 x0 \- R) {+ K
>> 追加内容到文件末尾,而不会清除原有的内容
% U, [: O+ S! N主要将本来显示在屏幕上的内容输出到指定文件中
* k7 [. P3 g! l3 G2 j+ U指定文件如果不存在,则自动生成该文件; [, \1 }. o$ ?4 f, O- X* r
type c:test.txt >prn
/ B" ]9 s6 ^. K0 P- s2 B" r屏幕上不显示文件内容,转向输出到打印机6 I" d) L: q3 f& o! u7 u: o
echo hello world>con0 t; D" p2 [4 P6 A; G
在屏幕上显示hello world,实际上所有输出都是默认 >con 的, l5 Q/ W' k4 o4 v
copy c:test.txt f: >nul' p' _" e' ?: b' m
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息  Q6 a" G, L: G2 `3 N
copy c:test.txt f: >nul 2>nul1 E; _6 r# z+ W! B+ k- @; L4 H
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
6 H+ y6 x' Y: U1 I0 u8 u4 y1 Becho ^^W ^> ^W>c:test.txt* ^9 `1 ^# K. B. _' v( U* U
生成的文件内容为 ^W > W4 S. J, J) {8 }! V) H
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号4 H7 m! O8 \4 H7 [

, j0 C: L5 C5 l  Y9 z  F27 <
( O( Z( g' Y0 T/ U/ _- H9 z& w/ ~) I从文件中获得输入信息,而不是从屏幕上8 \0 ?  m; c( ^9 S5 {* r3 f% f
一般用于 date time label 等需要等待输入的命令" O4 I4 _+ x- e
@echo off2 j) l6 Z! d- ]: J; f' T/ l7 Q. j/ P3 {
echo 2005-05-01>temp.txt
- H" k" C5 k5 l2 O/ O5 hdate <temp.txt6 L: O3 t+ x! `( a1 R* @
del temp.txt
/ I% n7 `* |. Q, p% L5 m这样就可以不等待输入直接修改当前日期
: {; X$ P7 w, Z. \# F9 u
! U8 d1 V" Z7 {7 k6 F28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*! h  D: |' l* X; Y7 p/ J
命令行传递给批处理的参数8 Z2 O& j! ?7 [- J
%0 批处理文件本身- [1 ]# Y  O/ P
%1 第一个参数
- ?# t5 f1 k1 f5 `%9 第九个参数
/ k" _0 \  u. d+ P1 B+ H3 c" c6 u%* 从第一个参数开始的所有参数
; e0 V- i" O, {批参数(%n)的替代已被增强。您可以使用以下语法:
+ R1 C2 _! R9 a# {4 \* p6 h%~1 - 删除引号(" ), 扩充 %1
- T$ l* Q/ W5 ~; M# B) P3 L6 h%~f1 - 将 %1 扩充到一个完全合格的路径名
; x/ r3 h3 f- X6 h2 D8 J6 J1 j# L% P  y%~d1 - 仅将 %1 扩充到一个驱动器号& }2 \0 O' I0 I# T' [; @" }# T
%~p1 - 仅将 %1 扩充到一个路径
+ q# S+ _8 F& e0 R- {% x2 x. [%~n1 - 仅将 %1 扩充到一个文件名& T9 `# @7 j9 ?# `( Y
%~x1 - 仅将 %1 扩充到一个文件扩展名
8 _0 X+ J1 b1 D* a$ Q& \  v3 I%~s1 - 扩充的路径指含有短名$ V+ h! ^+ G! m2 @% G+ M! D
%~a1 - 将 %1 扩充到文件属性# K5 W+ l# s5 Z/ o2 [7 o9 y
%~t1 - 将 %1 扩充到文件的日期/时间) f: i0 S+ {; T7 T. ?* D" c# i
%~z1 - 将 %1 扩充到文件的大小6 @2 j* Y! T$ G0 X! {
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %14 _  \8 O4 S4 S+ F: K* H
扩充到找到的第一个完全合格的名称。如果环境) R$ \! |; I. C
变量名未被定义,或者没有找到文件,此组合键会5 [4 F7 a# E4 {% `
扩充到空字符串
3 Y& x1 s5 C& P0 U( C3 F可以组合修定符来取得多重结果:! d6 Z8 y9 d  G; W  j& Z
%~dp1 - 只将 %1 扩展到驱动器号和路径+ T4 W" T* X( K8 c# H- ?
%~nx1 - 只将 %1 扩展到文件名和扩展名
( L+ K( {1 i) ~( a4 v; v%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,( k$ q/ B' H' g  k& l0 Q* ~
并扩展到找到的第一个文件的驱动器号和路径。/ ]9 z  Y' H# \+ @8 S$ Y! a! j
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
6 n# m% [% f: S可以参照 call/? 或 for/? 看出每个参数的含意7 H9 A% Q& H: W" \! R
echo load "%%1" "%%2">c:test.txt
+ C3 T% ?# r* \  Z- ~生成的文件内容为 load "%1"  "%2"$ w. h* b, k) L. p2 m: p# o
批处理文件里,用这个格式把命令行参数输出到文件
0 w+ X1 w9 T/ w0 O8 O4 C) N+ N% D# A' @4 {9 V, u
29 if
0 w" Z( Q/ e+ ~1 l: i判断命令( P- [. K9 C' `
if "%1"=="/a" echo 第一个参数是/a6 k2 q; g- J! t* v* d6 }* y7 J
if /i "%1" equ "/a" echo 第一个参数是/a& H4 v- a# ~4 r. ]! T2 c
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?- C5 }+ \7 d, n
if exist c:test.bat echo 存在c:test.bat文件! R6 H0 D$ L5 ^/ x0 t7 x# ~
if not exist c:windows (5 ^9 {+ U$ l+ l. h6 J) ]4 y
echo 不存在c:windows文件夹( \) ?3 q6 I$ U
)
: r9 ]/ X9 r) hif exist c:test.bat (
% |) O/ U# ~, H7 t, S* J" ]echo 存在c:test.bat
: R5 {' d# ]1 d) else (6 U6 E, l& t: \1 r0 o
echo 不存在c:test.bat
0 t0 ]( D# m' y+ J5 u7 |& S)0 L6 v0 ]$ \3 ]4 H" L6 p7 K
30 setlocal 和 endlocal
5 A: J1 d# b7 A9 I  r+ y设置”命令扩展名”和”延缓环境变量扩充”
& ]2 L6 q  e" a* m$ iSETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"- m! h2 J" G6 E0 h
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
* |$ L/ c" ]1 W4 ]: J9 g) HSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
- ?) x/ R6 \' ~+ H  @SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
* b. R$ E7 A/ I$ ]' l( XENDLOCAL #恢复到使用SETLOCAL语句以前的状态& D( j8 a0 e+ b* u" A6 @' L
“命令扩展名”默认为启用
! [# @( ^8 W; c“延缓环境变量扩充”默认为停用. \7 ~. |# R% h+ G( Z4 ?8 E
批处理结束系统会自动恢复默认值
! |+ [' j- ?$ \可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程, u: @4 O8 J' v9 n5 z
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确' f/ f' |( {2 n
保程序能在其它系统上正确运行  {8 \: v% o6 k8 f1 _
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程, D5 n/ m2 }8 J. s* s. R0 N# V

  H! S. ^4 S1 B, r( e* T; i" ]31 set
! b0 |: b/ ]+ }' z设置变量5 C2 |% M3 J4 g8 O: j& a; |
引用变量可在变量名前后加 % ,即 %变量名%
" b7 a) ], h+ I. jset #显示目前所有可用的变量,包括系统变量和自定义的变量
1 W& I) L, s4 g9 ~echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用4 j$ L. E& H, u: A
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1( b1 F# |1 C3 Z3 ^0 F$ Y3 m6 z
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2& F# H) l8 J& M/ C% r) i
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb21 x1 T% C2 \6 V7 H
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
, ]$ v& z" c- l; L9 i0 Fecho %p:~6,3% #显示第6个字符以后的3个字符,即aa2' R$ M, y1 a" x8 @& y9 E
echo %p:~0,3% #显示前3个字符,即aa1
  P: G9 v) [8 ~9 E2 jecho %p:~-2% #显示最后面的2个字符,即b2
% C, M* d) l5 ^echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b2 j2 w' T# U0 b9 A7 y! V
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2+ |% F0 C6 `  t6 x
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb27 `+ T0 r* v) C/ L7 a& t
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
5 a% F0 U# X  F0 b& x  Mset p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb27 O, c0 ?9 L# @9 K% T7 C& x
set /a p=39 #设置p为数值型变量,值为399 t. `# ~# p  D/ |- P. c2 k* s
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3, G" p7 `* j5 a; n8 K7 L
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用/ x1 D6 y6 N1 k% [2 R/ A! R) V5 P
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?5 X- h6 f( C! h
set p= #取消p变量
8 _; u* l/ o# A# r% s# W. Pset /p p=请输入9 t$ ^) Y5 @# \5 M3 k# O
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p# a* _3 Z& I- Q4 [0 [7 k6 l' ?
注意这条可以用来取代 choice 命令; }1 a0 U; q5 U! o% D/ y* S
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如" e9 r' x& z  o
@echo off2 e* b# M- @" p1 O1 V6 c! o6 K3 i
set p=aaa& u/ a- s; i! Q0 I; h
if %p%==aaa (
) m6 L$ _& p  wecho %p%
' Y8 ^. `- y" ]) uset p=bbb  R8 w6 v, Z6 ~
echo %p%
5 e7 H( _' n# P2 Z# O0 U/ J# z2 ]), _: `& ~( ^% ~2 `9 ~! z: Z6 J
结果将显示9 z. @/ }6 y5 A9 v% N
aaa
: [2 I. |& t/ }# E1 o  I8 xaaa+ P4 L( O* l1 {) I. i. {: v
因为在读取 if 语句时已经将所有 %p% 替换为aaa
3 K# H/ T7 y) k# I9 L这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
% P; a% a5 ~2 }/ T3 o3 t可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!" Z; S2 \; ?% _) V9 [4 S
@echo off8 M  Z/ R9 b0 ?+ J5 _5 \* }
SETLOCAL ENABLEDELAYEDEXPANSION* s$ L' z$ k+ D0 U2 g
set p=aaa
8 \) Y9 A: ^) Qif %p%==aaa (
# {# z2 l9 N3 N- K+ c6 y; zecho %p%
2 l6 V- k" E: \" Yset p=bbb
, ]* s$ W* x& e- W, d' qecho !p!' ?4 w/ @, ~9 Q
)
+ ^5 h, x0 x' h2 D! ]" g8 p: h4 A3 pENDLOCAL
9 s# \( r) |, Q7 `; _结果将显示" f! p  i8 k/ a
aaa# M& w% U3 M, _- {
bbb5 c( F; D/ p, i3 f
还有几个动态变量,运行 set 看不到6 v: \8 O  T  O6 V: h. Z
%CD% #代表当前目录的字符串$ ?' x4 M3 P9 E2 A1 J6 H
%DATE% #当前日期
4 U( q! y$ ^9 |%TIME% #当前时间2 b7 Y9 X1 i) v  t( K
%RANDOM% #随机整数,介于0~32767  _/ c  l) s; f  o
%ERRORLEVEL% #当前 ERRORLEVEL 值
# F# Z7 X: a' F3 k3 q9 f/ |%CMDEXTVERSION% #当前命令处理器扩展名版本号
+ A/ J  E5 F* d: z/ T6 q%CMDCMDLINE% #调用命令处理器的原始命令行2 C: n3 V  l5 T) M  D# U6 h
可以用echo命令查看每个变量值,如 echo %time%) `% j5 U# r1 l; `% W9 |
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
: m" T" s% a( V8 N7 D+ ^
* ?7 a5 R0 f) H1 I. M32 start" ?- n; p! s5 c' w1 @4 r
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
3 P* \5 j$ q! |% t7 T# i
3 _0 T/ ~. L% j/ ^$ X33 call& S3 O( R6 r4 k: `- l; D( p
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行8 k+ L' P+ H. R9 P
有时有的应用程序用start调用出错的,也可以call调用
7 a/ D2 ?& p- E! @, W
0 ^/ R- ^( ?0 e7 y- V34 choice (外部命令)
( \$ g# g) I  h选择命令' u; h& k: d8 i5 Y5 v- u
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……8 t, s4 A/ w8 b1 @
win98里是choice.com3 X. h8 m4 A% ~3 j! V+ N; v+ @
win2000pro里没有,可以从win98里拷过来
! G1 c& K5 D; M$ Wwin2003里是choice.exe
5 A4 L6 U8 L& V0 U( Wchoice /N /C y /T 5 /D y>nul
1 n( n7 U7 u# M* u延时5秒3 g3 D; f+ E1 @; M( m# s

$ v- ]$ R. a7 ]$ t0 q35 assoc 和 ftype0 a/ _# w' [; F; r. z
文件关联
% X7 T5 Q; t% ]3 _" tassoc 设置'文件扩展名'关联,关联到'文件类型'
! p8 j1 C: J; v) O$ `/ [ftype 设置'文件类型'关联,关联到'执行程序和参数'
: M. h7 `, I$ T2 P& X# M  N当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开# z" N8 p3 k! \0 d' O& @
而是先判断.txt属于 txtfile '文件类型'1 c* W4 ?* T3 @! L! B4 E5 g
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
' d6 Z4 x9 b2 J$ j+ r0 k0 R可以在"文件夹选项"→"文件类型"里修改这2种关联" m. S0 s+ c1 m6 [. I. h/ b
assoc #显示所有'文件扩展名'关联
( a) R$ \5 M! U. s2 nassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
" U% C6 J2 }4 p# }% eassoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.82 h5 ]. f! J& D- h7 N
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile! y: c. u# k9 s( c  {
ftype #显示所有'文件类型'关联
  {1 ~$ S3 R6 T* e8 ^% A' R. x: zftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*6 S2 r* ?: Y7 M
assoc .txt=Word.Document.8
8 m1 |! d. ?5 P- {0 S设置.txt为word类型的文档,可以看到.txt文件的图标都变了
% G' ~8 X" O/ }  v0 `4 Sassoc .txt=txtfile" \9 m; q7 m5 F- }8 L
恢复.txt的正确关联
: C& X) C4 b0 ?/ e3 gftype exefile="%1" %*7 {' ]4 n$ P: s
恢复 exefile 的正确关联( t/ b2 k# z/ J: s; s1 E) j7 ]
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令2 d1 a4 e) b/ m

1 W$ e( |; F6 g36 pushd 和 popd
2 f$ y6 q2 e5 r/ W. g6 X: s0 K. \切换当前目录
; n  s$ v8 s3 O* w* b@echo off
6 b( B8 o4 ~6 U2 tc: & cd & md mp3 #在 C: 建立 mp3 文件夹7 J" V% d! n$ ~, \5 {, P& l
md d:mp4 #在 D: 建立 mp4 文件夹/ ?) y4 U" a$ i
cd /d d:mp4 #更改当前目录为 d:mp4
8 \1 I: P9 v' r3 k" F- Z: {9 B2 vpushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
8 v5 z4 o7 @: t8 x6 Y9 \9 gpopd #恢复当前目录为刚才保存的 d:mp4
6 y6 C. r( j% g4 U8 z1 H5 F( E8 j
7 N7 ?# V6 w7 P7 F37 for
0 {) H* b6 f0 n, L5 N; E循环命令% a1 W/ T: y: X! ^, |
这个比较复杂,请对照 for/? 来看' |$ k8 G( p+ d2 A
for %%i in (c: d: e: f do echo %%i: `; {3 v2 \% ~' f
依次调用小括号里的每个字符串,执行 do 后面的命令
! e6 _' r3 {# m! p" x  w# {注意%%i,在批处理中 for 语句调用参数用2个%
! J  Q4 h+ l1 C默认的字符串分隔符是"空格键","Tab键","回车键"
% M. Q; K( S5 L5 c  Vfor %%i in (*.txt) do find "abc" %%i
: F% ?6 U, s8 O& o. \对当前目录里所有的txt文件执行 find 命令
2 ~+ n' {: t1 Cfor /r . %%i in (*.txt) do find "abc" %%i: w6 A$ n( V7 U/ R; @
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行6 e& y! K6 I$ ~% I' a" h! t
for /r . %%i in (.) do echo %%~pni
+ s% a; P2 \8 @/ a! l! f  b显示当前目录名和所有子目录名,包括路径,不包括盘符7 ]" e2 ], a) L; n8 j5 S9 B1 M
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
- X" l* D' ]8 [( B$ T4 T把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去9 O1 ^' `7 K6 S" \% ]: e8 @- J) B
for /l %%i in (2,1,8) do echo %%i
$ t/ Q+ z4 X( q" S# a' P生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1: j+ K  K  ^: r- L; h
for /f %%i in ('set') do echo %%i
* i0 T$ j$ I  Z" p" K/ e" ?" W( w对 set 命令的输出结果循环调用,每行一个
" \9 S5 a6 K+ x1 L8 [* p% e% sfor /f "eol=P" %%i in ('set') do echo %%i4 `" E& }5 A/ e5 }& K$ y
取 set 命令的输出结果,忽略以 P 开头的那几行: P/ p4 N! ^& f4 o
for /f %%i in (d:mp3.txt) do echo %%i
4 A3 r" K! ^' c& w9 C6 e$ k% C9 _+ [显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
2 r$ z4 G5 I6 Q% C( pfor /f "delims=" %%i in (d:mp3.txt) do echo %%i8 [( A* R3 n7 v
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称9 y3 K3 n( {& f# p6 @) m/ }
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
1 J) p7 j, u! O' h( j9 z2 N对 dir 命令的结果,跳过前面5行,余下的每行取第4列3 ^" t2 T  y  o0 U* u2 a5 h) C
每列之间的分隔符为默认的"空格"
4 {0 l" c; Q3 t+ [可以注意到 dir 命令输出的前5行是没有文件名的5 R& k4 i6 {1 K+ _9 S3 d4 `
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
+ P7 r3 j6 h3 w2 ~2 v* m( }echo %%a
& i' m1 H5 z+ W/ U7 o" M7 secho %%b9 ]" P2 Z( K5 x0 y7 u* b3 s- a( D
echo %%c! u0 B* ~: e# ]; r& A( o7 S
)
! `9 g8 {, ^( m( K7 I" q对 date /t 的输出结果,每行取1、2、3列
' L2 _3 L1 m4 R7 H0 B第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列3 z6 |7 ?' k# l( N$ T/ x! U$ E$ j
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
1 l4 q1 v0 g  F+ N3 @( f其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
/ o5 v9 q# C3 a  v" c6 p* Yfor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b' j- {5 O8 r- c  i2 x3 z% V
取第2列给 %%a ,其后的列都给 %%b
- t* |# C, I4 R. I, @) a& \7 ]2 d
38 subst (外部命令)
/ w- k; Y  }  l# C映射磁盘。
7 F+ O* i% K  M. c4 w$ L3 Hsubst z: serverd #这样输入z:就可以访问serverd了# R- |1 z% G0 C
subst z: /d #取消该映射5 \" t7 A( I8 m8 t6 R1 ~. d
subst #显示目前所有的映时) U8 C- p/ O: {! T- q* S

4 v# G+ g% {7 R! F( e+ J" f39 xcopy (外部命令)/ G( l" S9 L- e) U; M+ G  @* R
文件拷贝
7 X$ Y& w, H$ K# ?6 Lxcopy d:mp3 e:mp3 /s/e/i/y
6 z, L% Y* x8 G% F0 Q复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件, L$ U6 y! ~% `7 Q6 E8 D# U" E
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
5 f5 c9 n# {' E: D6 P: ~. d/ z8 R: |2 S4 g5 _1 M2 N8 N0 e
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退1 e! m4 A! `; h0 p& f
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:; x% i% T( `, ?9 b) u
    7 D1 P1 x3 I0 i
@echo off
! q5 E$ `( j4 b6 p4 Jset p=aaa  Z3 H9 k& X' M% Y. o
if %p%==aaa (5 u; ^; j6 {  ]* y+ `& N4 g5 F2 o
echo %p%
. X5 B( H% `% R6 E) e4 k- |set p=bbb
8 T, Q3 {2 S, n, r; O% `4 j4 pecho %p%7 o: a9 Z/ `! {. C' A( J
)
0 {& \; ?! R. }* z! u# P7 J5 Q7 G* ppause
  • 截图:
    ) w( q. f* l+ m0 M6 C7 `
  • 2.批处理.bat 文件中输出中文乱码
    7 k9 A1 I( B) ^9 o( w1 k
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:
      ; B' t3 @& U4 D* M) g
    • 效果截图:5 }# N4 }/ b0 _+ Y. d/ Q

      5 Z: T$ `* I+ j# Z* y- d& c
    / p1 T8 b+ ]& M
" i- F( D9 W9 [# v, T% Y

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
青浦海洋数码电脑城
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2001-2013 Comsenz Inc.Powered by Discuz!X3.4( 沪ICP备18024137号 )
快速回复 返回顶部 返回列表