扫一扫,微信登陆

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

搜索
查看: 1390|回复: 0

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

[复制链接]

307

主题

335

帖子

1891

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1891
QQ
发表于 2021-6-25 19:48:12 | 显示全部楼层 |阅读模式
Windows批处理(cmd/bat)常用命令教程
简单详细,建议收藏
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
  • 2.批处理.bat 文件中输出中文乱码
  • 解决方法在文章末尾!# q: J- Y3 j: F  v* j, u+ T5 U# }* [
前言
  • 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效& u* E. P6 E0 Y+ h5 i4 |
在Windows中善用批处理可以简化很多重复工作
什么是批处理?
  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
    8 C# \" o* L( Z2 k( z) F名为bat
  • 目前比较常见 的批处理包含两类:
    9 r$ J5 n) t! o( n( a. K
    • DOS批处理和PS批处理。
    • PS批处理是基于强大的图片编辑软件
    • Photoshop的,用来批量处理图片的脚本;
    • 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
    • DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
      ; \8 s) j, z% Q1 ^0 a9 C  T) b
  • 批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
    ' c/ C$ g8 e3 t9 n3 P命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行
  • 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
    2 u0 |, ~0 ?2 z1 }9 L1 {; {9 p  a
怎么创建批处理文件?
  • 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
  • 一般情况下,每条命令占据一行
  • 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
  • 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出2 j  Q+ E" S( _  i) k9 f: K0 Q: J
批处理命令简介
  • echo
  • rem
  • pause
  • call
  • start
  • goto
  • set1 b; j, ^% J! N$ S4 y) N' y& X2 T
批处理常用命令总结批处理符号简介
  • 回显屏蔽 @
  • 重定向1 >与>>
  • 重定向2 <
  • 管道符号 |
  • 转义符 ^
  • 逻辑命令符包括:&、&&、||, H5 h( c, N( f' y& }5 ?
常用DOS命令
  • 文件夹管理:
    % {: T! [5 F) E) r
    • cd 显示当前目录名或改变当前目录。
    • md 创建目录。
    • rd 删除一个目录。
    • dir 显示目录中的文件和子目录列表。
    • tree 以图形显示驱动器或路径的文件夹结构。
    • path 为可执行文件显示或设置一个搜索路径。
    • xcopy 复制文件和目录树。* u0 W  R8 L- d$ a
  • 文件管理:& K3 w4 j3 a5 T( m# ~9 D$ M
    • type 显示文本文件的内容。
    • copy 将一份或多份文件复制到另一个位置。
    • del 删除一个或数个文件。
    • move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
    • ren 重命名文件。
    • replace 替换文件。
    • attrib 显示或更改文件属性。
    • find 搜索字符串。
    • fc 比较两个文件或两个文件集并显示它们之间的不同; X/ H. k/ g9 Z# [6 f  J
  • 网络命令:
    & J% Z+ Y( y$ B& b" R( i
    • ping 进行网络连接测试、名称解析
    • ftp 文件传输
    • net 网络命令集及用户管理
    • telnet 远程登陆
    • ipconfig显示、修改TCP/IP设置
    • msg 给用户发送消息
    • arp 显示、修改局域网的IP地址-物理地址映射列表+ K1 U; `/ j# N
  • 系统管理:: w7 U) L0 C1 |; p
    • at 安排在特定日期和时间运行命令和程序
    • shutdown立即或定时关机或重启
    • tskill 结束进程
    • taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
    • tasklist显示进程列表(Windows XP Home Edition中没有)
    • sc 系统服务设置与控制
    • reg 注册表控制台工具
    • powercfg控制系统上的电源设置
      + l3 s% R. t' }% E8 C
    1 L  y( M: z7 Z0 s( f; E
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
% B0 a' u; V# _/ g; b, I- [6 p/ i

' v9 Y+ A4 I1 H0 f3 i* ~  zWindows Batch 常用命令  h' {+ K- q) d  S
1 echo 和 @  y* i) M! T9 o6 B8 z& M
回显命令4 `9 y* C# X8 P
@  #关闭单行回显
3 ]& T0 {( f  `3 S0 _echo off  #从下一行开始关闭回显
3 s' E& A0 I  f# \# C( ]@echo off  #从本行开始关闭回显。一般批处理第一行都是这个
6 o0 p, `  W$ d) gecho on #从下一行开始打开回显+ n- h( Q* M/ r1 C4 W, j) l6 ^
echo #显示当前是 echo off 状态还是 echo on 状态
7 Z' F4 g. N1 s# q; e$ Z+ Eecho. #输出一个”回车换行”,空白行# a9 k5 x  U9 D0 `8 x9 I! n! M
#(同echo, echo; echo+ echo[ echo] echo/ echo)
! L: L7 ^0 a- d; ^% [. n
- L. M: V- C; f/ f! P2 errorlevel
& M; G) H# m# ~! lecho %errorlevel%
! U1 l8 G* H0 O  B6 n每个命令运行结束,可以用这个命令行格式查看返回码
. |  \+ Y! _: L; v. v. i默认值为0,一般命令执行出错会设 errorlevel 为1
, z2 S" D- }  Y1 {7 M
8 B! Y3 ]6 }, a* A1 R  ]* O3 dir
: K0 J6 ~2 ^8 k/ K- R显示文件夹内容6 w! B* e4 I' |
dir #显示当前目录中的文件和子目录
+ }+ {: @4 M/ N4 ?3 e3 A$ F% Zdir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
- w& U9 q# J% V6 `) w/ m9 cdir c: /a:d #显示 C 盘当前目录中的目录
4 E2 B$ I: l1 K( N3 e9 Adir c: /a:-d #显示 C 盘根目录中的文件" c  V/ V( X  `# b. c' E
dir c: /b/p #/b只显示文件名,/p分页显示
0 p, t' ]% `. M# d$ v! E! jdir *.exe /s #显示当前目录和子目录里所有的.exe文件
$ [/ D4 a; g- a! h0 q
$ S( H8 ^* R! A* N$ R0 J4 cd  X4 E+ Q9 U& e( J- L
切换目录
7 T1 a; y( O: G) U1 h1 ?cd #进入根目录
( p0 p- f. @1 p* Y) m) [+ h2 b; @cd #显示当前目录
% _, y, k1 y' gcd /d d:sdk #可以同时更改盘符和目录
, ^* S' A' K, d7 W6 W
1 J3 o) S  w/ v  X/ M  t1 ~' W5 md% C0 g, s9 z1 d3 d
创建目录! I4 M' j; r5 W8 `' \
md d:abc #如果 d:a 不存在,将会自动创建中级目录& R0 B) l/ b9 k  n3 W5 q2 l
#如果命令扩展名被停用,则需要键入 mkdir abc
+ T; J" B& r7 n3 a0 S1 d
" D# ?- x8 g: X9 N6 rd
2 j* M( q  p% I! r. V3 Y删除目录; m# E9 s5 D9 _" e- t3 J  ]
rd abc #删除当前目录里的 abc 子目录,要求为空目录
5 @( H2 u- b3 L8 C( l. Vrd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式4 y  k+ t$ d! \, m* ]/ k

9 K+ q- @" x! @7 del( j! N1 }. _: ^4 d/ b. U' i
删除文件; b6 ?" Q! G& s
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
$ x# k1 t% O1 t9 |del /q/a/f d:temp*.*  j: [2 \, a: z3 _* G. J
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录) g, U* n9 j) g, |* f0 {$ _* r$ w
del /q/a/f/s d:temp*.*, j+ d+ D" P) {: t5 y/ {$ s
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
) Q$ s% y5 I9 ?, d8 k3 `! H
7 ^8 {' s6 p3 s$ ]7 {( d5 a* ^/ g8 ren) G8 e1 h# X! B6 P
重命名命令4 A* g; W; J1 N# h1 l
ren d:temp tmp #支持对文件夹的重命名
) C( d+ e+ T6 u9 w( A" B1 ~: d' |8 K, Y! }- n$ y/ l
9 cls
* \. T+ m$ i6 @- w5 \/ {清屏. T% a; z7 s! t$ X/ L4 ^2 L
10 type; @: r  r8 r) d. o4 [: F
显示文件内容
$ `2 C. h: C) Z* K* g- }) J$ B. ^type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
8 w+ {4 o( d! w7 f2 G3 l0 ztype *.txt #显示当前目录里所有.txt文件的内容* w! |' C- l7 T
. d' u8 @6 f0 p& G
11 copy" z$ g; N$ S3 d, l
拷贝文件
* j: R; T5 k2 U7 E1 [; D: j8 icopy c:test.txt d:test.bak
0 P6 K/ x: g2 V7 ?& g6 K复制 c:test.txt 文件到 d: ,并重命名为 test.bak
6 x2 {4 l7 m5 o# bcopy con test.txt
) x, [! w: W; K9 O: i7 A从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
5 g# H$ M, d3 I/ Y5 Ycon代表屏幕,prn代表打印机,nul代表空设备, I7 w, y  s3 O7 `
copy 1.txt + 2.txt 3.txt  k: D) q+ p( {. {  z! a6 ], d
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件, H. S( |' c! y/ W
如果不指定 3.txt ,则保存到 1.txt
7 N$ ], }' O& V/ C) R" Z3 V& z3 Dcopy test.txt +9 S& s0 q; W( Q# e- u; L
复制文件到自己,实际上是修改了文件日期+ g4 c4 J8 O2 J: ~
5 \) G' y" E- v
12 title
) X2 q+ P1 c6 L  i8 G# V' M设置cmd窗口的标题
, r' k, a  _3 o4 Vtitle 新标题 #可以看到cmd窗口的标题栏变了. L1 Y4 J: W& A. J, y, [% o
8 M% ^! `! P. o
13 ver
% ?' F8 A2 p5 ], S# e& t4 |! r- H9 _显示系统版本
$ p: _* _* H1 M5 N
9 q4 `; h1 p! L- K7 X5 k14 label 和 vol' z% W. z' L' e, v
设置卷标8 v( g0 @$ t  I- e
vol #显示卷标( J6 ]( D9 ^. p& r( T: _
label #显示卷标,同时提示输入新卷标/ A9 k( d9 M8 C/ g, N) ?4 g
label c:system #设置C盘的卷标为 system
0 ^* q& W5 J* q! r+ c& b  C
. v) a7 _1 |# T2 X' q1 D' d! J3 y* m15 pause
9 Q- J6 [7 y. k; L3 ~6 H& o暂停命令/ S) J. p' L5 P3 l. d3 _9 l  I( H
7 E* W  D$ l+ v+ M. n+ e& U
16 rem 和 ::& M& K5 T% F% l
注释命令  p  J$ B9 Z# B! Q3 i% K" B
注释行不执行操作( G! J: w; v3 F+ H$ p. n4 q1 [
" }" B. ]1 ]8 {6 K0 T7 [
17 date 和 time7 x6 e- H7 t" Y, A( c: e* e$ c8 n
日期和时间# y- j, o5 @8 g' \: }  i# |
date #显示当前日期,并提示输入新日期,按"回车"略过输入  K  F4 a* {! U0 D  L# g+ F
date/t #只显示当前日期,不提示输入新日期: p; m! ]" R) a1 z$ m3 {6 L
time #显示当前时间,并提示输入新时间,按"回车"略过输入
( j* R4 _* g4 |2 M* C3 htime/t #只显示当前时间,不提示输入新时间0 }! ?: P. r- v3 }
5 ^3 J9 W  }- t# d) C  J
18 goto 和 :& Z5 [! w2 z$ s1 M& G( P
跳转命令
! a; n( {% n  s! E7 J' i- T9 V' m:label #行首为:表示该行是标签行,标签行不执行操作* E, E7 O5 W0 j& K% x/ q0 Z
goto label #跳转到指定的标签那一行
# {$ r7 F$ F; f6 _7 Y' ^0 X0 T* D. n$ D+ D. R+ T
19 find (外部命令)
% x2 a# X" {1 z- T  a0 G查找命令1 q$ l# J" y8 ^! A2 @1 Y: g8 l$ i
find "abc" c:test.txt4 C3 O$ @, f2 M+ u6 l7 v% m
在 c:test.txt 文件里查找含 abc 字符串的行
# g% x) s& W# e0 [如果找不到,将设 errorlevel 返回码为1
) B8 X% Q- ]8 I& D5 p; K6 Zfind /i “abc” c:test.txt
+ W) P; p' X9 |) y4 r( F( z查找含 abc 的行,忽略大小写! q$ G9 C5 {9 o" a7 m+ D/ q
find /c "abc" c:test.txt
5 P9 A* B1 h9 ~( {+ O显示含 abc 的行的行数
9 @8 ?( Y0 T* K7 e0 I: }
7 u3 i* C9 |2 ~2 y20 more (外部命令)' p% O: D& e4 v6 d$ r( L
逐屏显示
7 W3 l- N; h& `" R$ z  Y- B4 s0 mmore c:test.txt #逐屏显示 c:test.txt 的文件内容
5 K- ]4 l2 X2 A1 s# L+ @: r
# k! K' _* E- A: |6 R0 J21 tree9 K0 U8 B+ H6 K2 Q* @$ X; T
显示目录结构* `* Z% l5 ?  |2 w( C6 A$ s: ]' m* N  D
tree d: #显示D盘的文件目录结构
. V! P8 O& x9 O4 }4 e3 ?# s6 Q2 M5 V, E4 c& [8 e9 k( B& G$ X
22 &
5 l6 h/ Y4 n" p+ M7 [5 V顺序执行多条命令,而不管命令是否执行成功0 s% y# _, d5 H+ ^& I
3 W# f2 Z" [9 y" s5 [/ K# X0 c
23 &&
4 k  b( r: P1 N- ~+ G顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令9 A' C! @+ P5 c- o
find "ok" c:test.txt && echo 成功
4 E: g3 }% T, `如果找到了"ok"字样,就显示"成功",找不到就不显示2 N$ X$ x9 {+ V! ~) }- \
0 M5 p3 v- R% z8 {7 Y0 {
24 ||6 }( s6 z1 D, b; K3 @; v' v0 D6 V
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令( F" M0 y9 r: `$ X; E) W+ u
find "ok" c:test.txt || echo 不成功5 L* s% c  Z7 e, L1 @; y- F
如果找不到"ok"字样,就显示"不成功",找到了就不显示
$ |# H4 M, z# ?
; b& _+ J* a( z7 U4 P1 S25 |
5 y: w! D2 _, X7 z' m管道命令8 y# ~3 G# I% e5 L/ m7 w
dir *.* /s/a | find /c ".exe". a+ _% V% V, R' U
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
8 i+ p0 I% x( ^# Z) p该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
9 L% k2 b# e: Etype c:test.txt|more1 f2 l+ g* e4 q2 E
这个和 more c:test.txt 的效果是一样的) f- g9 I8 q7 B5 L  ]* o- A$ y
8 O. s& |& \$ [# B. }% G' {  H
26 > 和 >>
0 K7 b' R3 W" g# _3 `输出重定向命令+ y6 T" m. F& H& D* ^* O
> 清除文件中原有的内容后再写入3 n; B" A: l2 ~- H1 `' p
>> 追加内容到文件末尾,而不会清除原有的内容
9 i! W( q% H% j: h# g" z: e. N主要将本来显示在屏幕上的内容输出到指定文件中
' K  i' N+ q) D9 n# l0 n指定文件如果不存在,则自动生成该文件
& E/ {( R: B  O; p6 @! H+ ztype c:test.txt >prn: v! E6 a* \) @' }) h: a' o3 F
屏幕上不显示文件内容,转向输出到打印机
  Y) {; ?( R: S( L5 Secho hello world>con
$ ~0 E3 g! N. |$ \4 w" l在屏幕上显示hello world,实际上所有输出都是默认 >con 的, B$ k/ b1 P' ]6 k
copy c:test.txt f: >nul4 H# `5 B$ t: j! v  O1 D
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息& E( c! o0 }" f1 O1 {- G
copy c:test.txt f: >nul 2>nul
- b* w) L$ G8 J不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息) m' P+ b# }. E1 k  w. f' I
echo ^^W ^> ^W>c:test.txt
: X1 ~! H, K' K; V# `  d* j% f( v生成的文件内容为 ^W > W) Z  R# b0 ?5 n: f6 l  X; O8 X
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
: Z" }, G6 A9 j: S; b4 }, |4 I7 x! A, B" i
27 <. P% P& `& j# {& X2 D
从文件中获得输入信息,而不是从屏幕上
7 o9 j. |1 z1 z/ F8 x7 y6 P一般用于 date time label 等需要等待输入的命令. w6 E8 F9 A% y; O( j; ~1 S
@echo off4 X4 `% }9 P; q. `2 P
echo 2005-05-01>temp.txt
( c; s9 D6 Q/ U. L# `9 Y8 q: Kdate <temp.txt, W- d+ S) y9 Q. w
del temp.txt/ t+ m; h6 m! {! C  K
这样就可以不等待输入直接修改当前日期. x, ]4 v% S* d" _  }/ C* X! E+ a

: [; y- k. @2 O& }( A: b28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*" E- g: f0 w) L1 Y! s7 X$ M
命令行传递给批处理的参数
/ ^; ?3 ]0 j0 K%0 批处理文件本身- u; B% H/ N" l7 o! v
%1 第一个参数
# h2 s& c- _, ]%9 第九个参数
/ X% F% y/ h8 q' w( g" J- F%* 从第一个参数开始的所有参数
6 `3 h# ?$ }5 [# ^批参数(%n)的替代已被增强。您可以使用以下语法:
- j+ F; Z3 {( D, T6 a3 E%~1 - 删除引号(" ), 扩充 %1$ i, Z4 G' Z1 ?& W. T; U6 u0 G
%~f1 - 将 %1 扩充到一个完全合格的路径名% l3 l* C1 o; K; W: K  K
%~d1 - 仅将 %1 扩充到一个驱动器号7 j3 v9 ?3 J& J: R/ R( l4 @! u
%~p1 - 仅将 %1 扩充到一个路径
# R) T2 O- T+ B& y%~n1 - 仅将 %1 扩充到一个文件名
! i& q" a6 k" \%~x1 - 仅将 %1 扩充到一个文件扩展名. @6 S% A( v! Y9 I
%~s1 - 扩充的路径指含有短名
( g% N* G9 K- _" F. U8 d3 o5 N%~a1 - 将 %1 扩充到文件属性
4 q" T) v3 \  R4 T2 }  o5 r* Z1 C% R%~t1 - 将 %1 扩充到文件的日期/时间
: i) Z2 c; b+ a* X%~z1 - 将 %1 扩充到文件的大小" F( j+ z2 {; P" y2 @, Q# `
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1. @1 }  V* {& A" f
扩充到找到的第一个完全合格的名称。如果环境3 ^7 N* Y' s* T3 m  u! d8 |. q
变量名未被定义,或者没有找到文件,此组合键会
( S& {7 x2 f& p0 D/ m# a扩充到空字符串
7 r/ x0 b4 l! @1 i: y( m可以组合修定符来取得多重结果:
7 F2 v$ X) v6 Q3 Z; O8 B%~dp1 - 只将 %1 扩展到驱动器号和路径) B* a9 X/ b- K. m
%~nx1 - 只将 %1 扩展到文件名和扩展名& A- |) G, I2 Q) m% o3 Z
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,' n- K7 D5 @6 b7 r
并扩展到找到的第一个文件的驱动器号和路径。
+ {% N* @  R( @3 U: y' x* `3 I% M%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。, t( V8 m% F% S( |+ i: n% R
可以参照 call/? 或 for/? 看出每个参数的含意6 O. w; I9 b: H# _) ]' @" l2 B+ `
echo load "%%1" "%%2">c:test.txt
2 x. R0 Y4 D# a' C- d- d' o4 J生成的文件内容为 load "%1"  "%2"
/ y) Q1 ^9 S0 m8 l9 p批处理文件里,用这个格式把命令行参数输出到文件. l$ G2 R, L. L. w/ q4 q/ R

5 Y; C7 W% p) R29 if( x$ L1 z6 X. d" z# G3 d4 f
判断命令
" k9 W: q$ |; A5 }" I4 [if "%1"=="/a" echo 第一个参数是/a
8 v( E+ T' r& x/ {! [, _1 oif /i "%1" equ "/a" echo 第一个参数是/a
4 C0 J  x2 p1 y# `% Z% ]( z/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?/ Y, T; u6 H7 a2 r6 [9 C1 e8 v  T
if exist c:test.bat echo 存在c:test.bat文件' h. _; ~) m5 u8 \" P" e
if not exist c:windows (5 C7 z- T7 s* y4 ?+ H0 G
echo 不存在c:windows文件夹5 ^; L. N& d# Q% g
)
1 e& K% E) L$ I$ U4 |if exist c:test.bat (
- m1 r" P; o# v( }3 S  j" Eecho 存在c:test.bat2 h' K8 c9 e. p
) else (1 }% q: \/ f) V; V/ e" F$ U
echo 不存在c:test.bat0 O2 `2 m! }% M* |/ L8 W2 X
)
0 U$ m" t0 W( T& Q& @, h30 setlocal 和 endlocal
% z6 \- [/ x0 Y( D8 X设置”命令扩展名”和”延缓环境变量扩充”
. S, @3 \; E6 Q+ h7 BSETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
6 r4 M% ^5 c* c3 w" D3 GSETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
- d3 M$ t, p$ j9 o; t3 JSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
7 _! Q3 H! C- P% QSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
3 s' M6 Z* ^# c* l  aENDLOCAL #恢复到使用SETLOCAL语句以前的状态) k! d, [) u/ W
“命令扩展名”默认为启用! x$ z8 V7 |( X* H
“延缓环境变量扩充”默认为停用
) i- A/ G! |6 A  y8 N$ p( Q批处理结束系统会自动恢复默认值: j, ]. G& f* D% L
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
8 W5 o. B/ ^4 c& u; S序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确! R8 D, D; T/ Q+ ~; h
保程序能在其它系统上正确运行) H) k$ _/ T0 C& o. `0 _
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
5 w3 N, t4 }5 n4 G4 Q
3 i8 h8 H- {  G- z31 set4 m$ v( t, l* ^6 H+ H5 o. R% x
设置变量) L* N9 G2 \4 g* `8 r" y# `3 Q
引用变量可在变量名前后加 % ,即 %变量名%$ f" C! b9 _7 k
set #显示目前所有可用的变量,包括系统变量和自定义的变量
4 V& l" V( L" \, \6 N+ h$ }$ c! {echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
* P7 S9 q# U2 U6 i  g$ e9 gset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=16 P% @% Z! f/ n) M6 b1 P0 {/ {# j' Y
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2* t( E5 d2 X3 I
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
5 s$ L5 _1 X) r2 h1 r: ~1 Vecho %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
; z/ A- q( |1 I6 `echo %p:~6,3% #显示第6个字符以后的3个字符,即aa29 r- i5 P2 g* O  _: Z* C+ Y
echo %p:~0,3% #显示前3个字符,即aa1
* P# [" F- X" q* v  wecho %p:~-2% #显示最后面的2个字符,即b28 A  _8 g( V: L; ?; R& @8 W
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
5 Q) H# F9 v! _/ k! L& T! Q2 vecho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb25 F0 h* C- K, x
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
4 h8 Y/ q, T; x- aecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
( Y2 J! g' O$ P. S. fset p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb25 K5 A9 U$ i% q7 j5 A
set /a p=39 #设置p为数值型变量,值为39) T( E! w/ K0 B5 x
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
. ?% B2 t2 W6 U. y1 uset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
  j. w/ G+ W, s8 E- c; `! w+ dset /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?( b, ]) W; X; h8 n( H$ j
set p= #取消p变量
% E- x4 Z/ ?+ i  e& Jset /p p=请输入
; o! @0 ]) k  h屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
) A: V; J5 K* f$ P注意这条可以用来取代 choice 命令1 O! O/ A: v) R& b9 |  H
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
" y$ \7 I+ ]9 b@echo off# J  T) e" A% B' T/ e: T( j
set p=aaa6 j4 V4 C% C# |4 P% X9 i- k
if %p%==aaa (
) [, L6 T4 ^% ^1 h) B6 k1 e' t4 qecho %p%
* i0 y) _; X  s3 B' a! K7 Iset p=bbb
* w( `1 k# n' L  Hecho %p%
3 c: {0 j) e+ V+ L, H% E% ]) I)
! c" y* [" O7 ~结果将显示
$ n5 g- [# `2 i+ i) ^6 Laaa
8 j0 v1 p, r6 `, `- u9 taaa
4 X" |% j( }- ]7 ?9 \) u7 }因为在读取 if 语句时已经将所有 %p% 替换为aaa' h, r, U( y  X+ y1 t% o8 e
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充") G9 V( T0 U# N8 U
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
; E" ?  J1 N2 O7 z@echo off
* S0 u" s* ?$ {SETLOCAL ENABLEDELAYEDEXPANSION$ n7 H" A/ f. F8 E
set p=aaa" s: a2 j) k) L. d
if %p%==aaa (+ Q" B- O7 F# ?6 O
echo %p%
) g! i" W% D2 ~6 _6 oset p=bbb
, G% ~3 U2 z! O( ~: yecho !p!
3 {  j( ]4 [( Y1 W! a1 \7 P)  O( r2 L; [' y( L, l8 r$ h* W9 t
ENDLOCAL- Y/ \9 o& w% q4 Q6 N/ M
结果将显示
* q' Q% s  j' S2 a" w+ I2 Waaa
1 f( U: D1 P5 m# s  K0 _3 B' G! ^' {) u% Ubbb) W3 b$ ~$ I5 c% c; J+ M8 h0 n
还有几个动态变量,运行 set 看不到! y5 r: T: G# y4 v* X7 T8 S. @- W
%CD% #代表当前目录的字符串
- Z+ S! H. {5 W! W# j  l%DATE% #当前日期
: v- x6 e* e. a& e' D8 r%TIME% #当前时间
1 j1 I" W  P( `. g%RANDOM% #随机整数,介于0~32767
* ^% ~% b# e! b/ {%ERRORLEVEL% #当前 ERRORLEVEL 值
* ^6 f% e/ s$ _* {. `7 v3 M8 \. N4 U%CMDEXTVERSION% #当前命令处理器扩展名版本号7 y! e1 V2 A. H+ q* O$ P
%CMDCMDLINE% #调用命令处理器的原始命令行
! E7 S7 f3 B, a+ l可以用echo命令查看每个变量值,如 echo %time%8 Y# \3 {6 l( M+ g8 E1 i
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
# A3 `) h7 K3 A) _% ]( b8 T, v! p& {4 m9 L7 V5 |9 \5 Q6 I
32 start6 D4 g0 I! J, M9 R* K% n
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
/ H3 U1 A7 i( J; [5 v9 N  `. x1 a3 W1 p2 j/ F
33 call
5 U" ]0 ~# ]* z9 J批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行! q' C) g7 @6 e2 _% {$ ^8 |
有时有的应用程序用start调用出错的,也可以call调用. L. b' Q' {! k! m# Q: A
( k- J# w0 P6 J% c& Y: ^
34 choice (外部命令)
8 E+ P- U0 D5 G/ C3 P6 M7 J$ E' Q选择命令' G* @$ E9 k1 u: A, O' ^& a
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
: ]1 v- c- a9 c% A5 Iwin98里是choice.com8 N5 u1 f& F5 y" \
win2000pro里没有,可以从win98里拷过来% r1 f  U* a; H& c; r
win2003里是choice.exe
/ i- q! x% Z- d. Echoice /N /C y /T 5 /D y>nul
5 C. ]# X  @0 b延时5秒& {. Z0 x  S9 h3 d& p) P

2 e6 e3 o  }: u6 P( H3 P35 assoc 和 ftype
, G1 ?8 V/ ^1 Z( S文件关联
7 \) b. X8 J' g+ l/ \& massoc 设置'文件扩展名'关联,关联到'文件类型'
" U5 J! ]. f* \ftype 设置'文件类型'关联,关联到'执行程序和参数'
1 H: o6 ]8 U& F& F当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开. q, `* Q$ i( ~4 h. U. G
而是先判断.txt属于 txtfile '文件类型'
9 p6 M% @6 p/ A% y3 k/ }5 q再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
+ _/ b* }4 p, T* ~3 k) O2 k+ u可以在"文件夹选项"→"文件类型"里修改这2种关联
- }+ J1 ]4 e, V6 @. a+ W1 Z9 b; }assoc #显示所有'文件扩展名'关联$ A- E5 I# c, @# |- ^" j
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
7 d4 S0 O& {1 ]6 C3 |6 qassoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8# L* k# g8 H. M& \5 N4 r$ C2 g
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
; ?# v* N4 b4 @; M' Pftype #显示所有'文件类型'关联% G( n! [& i, P+ U1 E% _2 f( @% T
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*+ Q  s  _( {% f1 @4 F- \) N6 N
assoc .txt=Word.Document.8
& r  @4 h  I% p. i, q  @设置.txt为word类型的文档,可以看到.txt文件的图标都变了
# ?) i& E; ]. Y6 Nassoc .txt=txtfile6 T- v- t+ D. d7 V
恢复.txt的正确关联
2 J+ h, D$ c& ?5 X; Dftype exefile="%1" %*) a- j4 L4 Q: T8 P) \( e2 h
恢复 exefile 的正确关联/ S& F. `0 x% N- o5 O' O
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令0 Y2 r  c, m1 M! Y

* N& y5 h1 B8 ^& i9 y: m9 m36 pushd 和 popd
" `3 Y' k+ W2 z# K( K, C切换当前目录0 i, h$ |4 [/ \+ q+ P9 v/ O
@echo off
* |7 t2 o8 v: H6 U1 Kc: & cd & md mp3 #在 C: 建立 mp3 文件夹4 V3 p  [6 S$ p) ?- V1 s4 y. ?
md d:mp4 #在 D: 建立 mp4 文件夹
: p, B4 k% _5 {: R' P; C& ccd /d d:mp4 #更改当前目录为 d:mp4
! {2 ?7 |' }+ m! A: kpushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
( N3 S) V& `: [! H# Zpopd #恢复当前目录为刚才保存的 d:mp4" \* I- `' I7 J) a. s9 `

8 l& `4 ]/ Z1 M$ D/ I37 for
& y9 J) `, j; S循环命令
1 D* }4 [$ x& z) m" ?这个比较复杂,请对照 for/? 来看: Q# G+ J, l9 }4 u1 W# Z4 V
for %%i in (c: d: e: f do echo %%i
* u1 l6 ?* G( ]依次调用小括号里的每个字符串,执行 do 后面的命令
( {1 P+ M, R" B, K: W3 }+ g注意%%i,在批处理中 for 语句调用参数用2个%
; H2 T" E% P' x2 w默认的字符串分隔符是"空格键","Tab键","回车键"
5 @9 y1 D: `4 Q* b, sfor %%i in (*.txt) do find "abc" %%i5 B0 J2 ~& |* o% J8 b" \
对当前目录里所有的txt文件执行 find 命令
" ^5 w# c: S: U+ _for /r . %%i in (*.txt) do find "abc" %%i
8 u7 ?4 ]/ d* d7 `1 Q; y在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行7 Y# f* j9 a; y4 n" q
for /r . %%i in (.) do echo %%~pni
4 e" p( I( X* V' F; ~显示当前目录名和所有子目录名,包括路径,不包括盘符; X2 D/ {- m$ ?$ M
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
* G+ R; T1 K4 \# ]" t9 N1 e5 w把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去3 k% u" Q& Q: ^8 I* p) Y
for /l %%i in (2,1,8) do echo %%i' i2 ]" v' V; \: v. t
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
9 P- I7 Z# |' \6 E8 v9 D3 Afor /f %%i in ('set') do echo %%i
1 A5 Z! v$ ~( j# ~( z3 C# a对 set 命令的输出结果循环调用,每行一个
3 V3 I% {( u. S' E0 }$ [! v, H6 c0 hfor /f "eol=P" %%i in ('set') do echo %%i
+ K& Z3 j  M0 N0 U6 T; i取 set 命令的输出结果,忽略以 P 开头的那几行
9 e/ }8 t2 h4 `8 `6 {0 G$ Jfor /f %%i in (d:mp3.txt) do echo %%i) D, B& N$ Y. d" S7 g
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
3 r2 J' v7 k+ S% {for /f "delims=" %%i in (d:mp3.txt) do echo %%i+ Y& \6 O# L. u2 `8 S, I  J
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称2 T% v8 }% J6 X7 \: k2 e
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
1 X) d: U8 q* l4 `对 dir 命令的结果,跳过前面5行,余下的每行取第4列
$ n# D3 W& ~4 d9 l' u每列之间的分隔符为默认的"空格"
9 H8 F/ }3 a, u# M2 Y( Z可以注意到 dir 命令输出的前5行是没有文件名的7 h8 T7 g7 C. k; n# e' W
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
- j2 a8 p, X- M; Techo %%a+ X; E# Z- p0 `7 ]6 e
echo %%b1 I8 I6 W' @# m9 b- R, L) p
echo %%c1 ?3 T4 ^' H) j! l9 a$ D2 H
)
* Y6 R3 Y, n4 d- G) C$ m2 G! ]对 date /t 的输出结果,每行取1、2、3列6 i- S$ k+ p9 x$ w) s+ L0 b
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列% I) }0 h" {' w
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格", s8 Y, Z4 g7 p( ]
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的/ I! d$ c; Q- V, x
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
; \  z9 c8 \9 k1 d" t. k取第2列给 %%a ,其后的列都给 %%b
& E+ A7 F- T3 r: A4 a9 W3 x+ z
/ F0 Q+ s# I  C) r5 W38 subst (外部命令)8 M9 \9 y! V4 p. a0 z
映射磁盘。3 q- Y; `9 c5 @3 R0 `0 X" v" q
subst z: serverd #这样输入z:就可以访问serverd了
' o2 `5 c  s: ssubst z: /d #取消该映射1 ^7 ~: Y4 i3 k5 u( u" Y
subst #显示目前所有的映时
' {1 `5 @  i; p; t7 K, h
. {1 m  U( ?  L39 xcopy (外部命令), u: F7 D8 H! u% Y4 _8 S9 ^# t
文件拷贝
6 w5 d2 X$ f/ x$ J2 E; Q, }xcopy d:mp3 e:mp3 /s/e/i/y2 y. |: S4 ?- [- D- K
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件7 p% i4 J6 a8 L1 m; t1 D& c1 s/ B7 H
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
* l3 j% m5 u, [3 C$ _! D2 B# d/ x) @( [7 v3 r" Q5 P
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退6 S/ i( O- m- r8 h& }5 A3 X
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:, `5 L& B& C' W

    8 }8 I, J* W- e5 t, H
@echo off
( X: c1 z4 r2 s4 ^: h$ `) Rset p=aaa
% A' Z" H& N  q8 Fif %p%==aaa (! @6 z& R- X# A
echo %p%7 @/ M# ^& C2 p
set p=bbb0 t5 I" b, {/ q8 ^
echo %p%1 @# a/ p/ c1 F
)
' N7 Z5 |9 n2 ]3 M& P! ipause
  • 截图:8 o8 J7 o5 s3 e  F
  • 2.批处理.bat 文件中输出中文乱码

    - j; Y% [, b8 S' _; v
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:
      - `% [( e, x! \! z5 O/ q, C" n
    • 效果截图:, D. O7 w- q+ q5 ~4 l
      2 g, B! z* P/ x$ S$ \
    # t9 z' e( Q2 K: w
1 [# g" v6 M( }( W) Y; @. b# c

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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