扫一扫,微信登陆

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

搜索
查看: 2105|回复: 0

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

[复制链接]

307

主题

335

帖子

1899

积分

管理员

Rank: 9Rank: 9Rank: 9

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

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

    0 O/ W: A# S: J. b
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
( J6 n6 r1 K1 V# I. i* s
* q/ |( e% w- a% i- N( R: H5 G
Windows Batch 常用命令8 P, Z$ ?. |8 X/ }1 ?0 W: X
1 echo 和 @5 z9 a+ p4 X5 y5 `! R# F
回显命令
7 `' t1 A( j) D4 T; t) S+ Y) C@  #关闭单行回显
8 X' p6 u3 r$ m2 Y6 A+ ]4 Pecho off  #从下一行开始关闭回显9 u( a) \3 u3 c/ L
@echo off  #从本行开始关闭回显。一般批处理第一行都是这个
' I3 C& a2 f/ a. u# w( yecho on #从下一行开始打开回显7 e9 p7 h6 Z; e0 S8 c
echo #显示当前是 echo off 状态还是 echo on 状态$ C4 S. k; A$ L" o6 w0 U5 X( E2 z
echo. #输出一个”回车换行”,空白行) b7 F7 \  V3 u1 V/ f
#(同echo, echo; echo+ echo[ echo] echo/ echo)
% m1 L: T" f$ N3 \  z
1 Q1 \9 p! ]" ^# V6 H2 ~2 errorlevel0 q) [9 ~5 g, k5 y# S6 }
echo %errorlevel%5 @6 A7 X- h5 Z! K3 z. D0 e
每个命令运行结束,可以用这个命令行格式查看返回码
" I7 I: p- Y3 q+ V! U  _* T默认值为0,一般命令执行出错会设 errorlevel 为1
0 ~- M5 n. ?2 Y8 m  C1 b% N  o# u  L
3 dir5 l( j0 }' J9 k0 W9 ?
显示文件夹内容
) s2 A8 @8 u2 u; \" n6 [dir #显示当前目录中的文件和子目录
2 \- R: f. G3 Y& qdir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件# C/ B. J. p7 G6 z6 k' S
dir c: /a:d #显示 C 盘当前目录中的目录
0 u+ Z+ ?% Y# u+ mdir c: /a:-d #显示 C 盘根目录中的文件8 \" n$ H1 a% f" M9 |' f/ l1 l
dir c: /b/p #/b只显示文件名,/p分页显示8 t2 j+ t' g/ Y* p8 X. f9 T" n
dir *.exe /s #显示当前目录和子目录里所有的.exe文件: v$ a/ s6 K( P" ?
+ l. N: {6 F' ~$ K; }
4 cd
2 x3 _% z! o  Y* ]切换目录
( O7 u( I" A0 A) c  wcd #进入根目录
% u5 {# ^; E- _; l) i* `+ T$ Hcd #显示当前目录& {$ e# \  b) P. |
cd /d d:sdk #可以同时更改盘符和目录
' O% Y) q" N- J7 P$ {- \6 q9 ]' |8 t4 W; k1 F* I3 L; C% D
5 md
" t5 p1 L  d: {) g5 z创建目录- G' V7 b: d' D1 X3 O3 Q
md d:abc #如果 d:a 不存在,将会自动创建中级目录# ]2 P  W/ g7 q$ Y8 f$ [: U1 C
#如果命令扩展名被停用,则需要键入 mkdir abc
3 _/ ~2 T$ @9 U& x; _  X; ]
; e9 A% }: K* Q6 rd7 s0 y9 V+ c, T1 }
删除目录
1 Y% {: A, |# H/ D, {$ d8 ]rd abc #删除当前目录里的 abc 子目录,要求为空目录
7 d" N4 f7 u$ T: A7 ]( ~rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
( u% w' t% T: x, W
. b4 \' g& {: s$ {% Y8 W( J7 del
4 H# G5 l4 K2 c2 M  B! z删除文件
2 E4 J7 o7 t4 S$ l" Qdel d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
, W3 i3 Z5 A' V0 A( Pdel /q/a/f d:temp*.** }3 S$ B$ t/ }8 K4 D) {+ }( u* \* o
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
; @; w, [& T9 c1 |3 d+ y; Y# ldel /q/a/f/s d:temp*.*! n7 @. }" A1 W7 i. w3 ^% t, B
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
3 L; i7 X: {3 n1 B; h1 |4 E- ]+ q0 o% K2 \. ]
8 ren/ ?! x) i3 G' o+ m
重命名命令
$ D$ S) c$ A. B1 l# X4 pren d:temp tmp #支持对文件夹的重命名' L( x) v, V: N* Y0 _

. p. }; e7 Q4 l; ]8 o; P1 [2 x! W9 cls
6 G& R" ^6 P! T2 F0 L4 @, ?清屏
/ U2 k7 `8 O( K10 type8 _9 E" [2 Q  F% f0 A
显示文件内容8 c% w4 U, r" l* N/ U
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
* u+ ?* h% G9 [; Ztype *.txt #显示当前目录里所有.txt文件的内容
5 M" v: Z0 ~; b8 a" O6 F' A) F. V* x0 a, M4 |
11 copy7 P" \0 X7 b, C% i% C5 i7 e! H
拷贝文件
9 ]) |& z) i9 y8 p0 ]copy c:test.txt d:test.bak
1 x1 \0 s( E( f复制 c:test.txt 文件到 d: ,并重命名为 test.bak! Q+ s; e8 \- e9 i, a
copy con test.txt
$ Q- e$ o4 }. X! a3 ?) G7 f从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
: D. ^& x& M& f% L/ e, ~con代表屏幕,prn代表打印机,nul代表空设备
' L" G8 t' g8 y) A) p- O8 u( t! _copy 1.txt + 2.txt 3.txt
/ \; c. `/ i: E$ Z2 e, B合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件; R6 c' B. R; {6 [5 O; v
如果不指定 3.txt ,则保存到 1.txt* f, j  p) _+ p  T$ }6 M' {- Y6 h
copy test.txt +) l: p9 P5 U4 B
复制文件到自己,实际上是修改了文件日期; C, p% t5 b( x) P8 ]( _. z4 O. w

2 }. Q8 L- R# t$ v4 t  r5 W12 title
7 y3 g! [* ?1 G( x1 }' q* [# `设置cmd窗口的标题
0 ^& F, k7 F! I" [9 ftitle 新标题 #可以看到cmd窗口的标题栏变了
1 a- t  ~' P8 b/ @$ d
3 z# J/ A( N) o' q" ]13 ver1 c7 T6 ^; k+ M+ T. U" D7 y
显示系统版本
8 _* [7 W; h3 d2 n8 u. X/ [5 M6 q
14 label 和 vol! d2 {, N4 z% r$ [8 ~- y
设置卷标
' [( c' N, \: f4 k7 Bvol #显示卷标
' l( G  t! v, l! j% l7 ]; q: S, blabel #显示卷标,同时提示输入新卷标
- D6 @/ v0 `# ]1 C: l/ j; H. ~label c:system #设置C盘的卷标为 system
: p* O  ~, k; G6 k5 ?5 f5 ]" e9 _# P- i  J$ n
15 pause0 L2 p3 g9 v' e* n5 w
暂停命令; n6 ]7 L- r# H
8 j/ f5 q* J* C8 ^
16 rem 和 ::4 T: S& y: K7 N% O/ w
注释命令# m* D! g( X) h0 j9 M  r
注释行不执行操作2 Y2 @, ]: f# _( L
  m2 B$ z9 B$ s5 E. J
17 date 和 time5 P, ?7 q- {9 b; j3 L
日期和时间# x' F2 J. {9 @6 ~; w$ p7 u1 N
date #显示当前日期,并提示输入新日期,按"回车"略过输入
% m) a+ b3 M- R% t2 ]date/t #只显示当前日期,不提示输入新日期( T3 C: N& ?# l9 Z: a+ J$ m
time #显示当前时间,并提示输入新时间,按"回车"略过输入6 E& Y# W9 s4 ^3 r5 E
time/t #只显示当前时间,不提示输入新时间
) C# _9 @) W, P' V+ E3 F; s. W$ M! ^* _) s3 w( _
18 goto 和 :$ Q: `# _& R1 Q1 U
跳转命令
7 z( F) P! G& X, R$ v! M:label #行首为:表示该行是标签行,标签行不执行操作7 {: D( ?, w1 ^, M: |1 H: S
goto label #跳转到指定的标签那一行) Q% _4 U' E8 p% M# r, F
) v: q9 J: w5 u& p. B8 M* `) w
19 find (外部命令)
' J9 l. e/ R0 [( U查找命令/ Q" G. C. c8 K; o- _" h
find "abc" c:test.txt2 X+ ~, c; [' Z6 W' j
在 c:test.txt 文件里查找含 abc 字符串的行* R9 j2 i$ ]( y: I9 O
如果找不到,将设 errorlevel 返回码为1" Z% H& \, ]8 F% ]. G
find /i “abc” c:test.txt0 _% E2 H, Y$ c, _1 q2 N; u
查找含 abc 的行,忽略大小写, b4 j$ W' Z9 E3 d$ O. I1 v/ e9 c
find /c "abc" c:test.txt
2 E% s0 A7 c; {" E8 }: V显示含 abc 的行的行数' _( ]! v* x2 Q+ c3 M$ ]
3 t* X8 S1 u8 M+ g& x7 i& m& J0 [! z
20 more (外部命令)
1 \5 \/ P/ l" N: s逐屏显示" E0 }* U! P, d1 u0 x3 g
more c:test.txt #逐屏显示 c:test.txt 的文件内容
! `2 M  k2 _- ^5 N* z. a
  K$ u9 G: Z; E21 tree
' f" r: d0 B9 h: L7 {! o显示目录结构/ j7 I+ S( y! Y) f9 }3 V
tree d: #显示D盘的文件目录结构5 V! J$ U- n2 ~& v  W
# G' P* `% q" C/ l$ a  w( J, g
22 &
7 q4 o3 q3 O) |" w' G- Y9 e3 f顺序执行多条命令,而不管命令是否执行成功
. ~6 X& F9 \! R1 |" a7 h
1 S4 C2 X' V! J9 W' X& m2 u23 &&3 x- l* b: W& \1 c4 x" S
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
# ?' Y% F8 U" x/ Z8 b. ifind "ok" c:test.txt && echo 成功
1 [- g7 l% j! t1 Y5 {2 R如果找到了"ok"字样,就显示"成功",找不到就不显示
$ Y, v. h. _2 Q7 F: z) d. q+ t: z) M  I9 g* {
24 ||
8 e: C$ K' w; u0 ]8 L顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
+ d2 Z4 m- p: g% k" G, c$ \3 `+ l( lfind "ok" c:test.txt || echo 不成功
4 }7 `& y7 A; E$ X4 A# u! [9 R3 }, J如果找不到"ok"字样,就显示"不成功",找到了就不显示
2 U/ b8 v' ]+ i2 i- s1 i
2 i( w: o  [% @, J  M  X25 |
3 R. H7 d0 b: `" C! E  x管道命令* x$ P1 `" o; ~1 T5 [
dir *.* /s/a | find /c ".exe"
: L$ v: U; t2 K( m# [管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
" q# N. v' U" i. B/ H该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
- ]5 R" s* r4 b! _3 Ctype c:test.txt|more8 F& O& T' H, J' S# c) q
这个和 more c:test.txt 的效果是一样的
& ?( I* A+ z0 g  k. M4 \; Y2 _4 ?$ ^$ ~" c
26 > 和 >>- E1 \( V) n) X8 V
输出重定向命令' T: X) G) h' N: g3 W2 V( {* G
> 清除文件中原有的内容后再写入$ X. P0 K# x& a7 P" }
>> 追加内容到文件末尾,而不会清除原有的内容3 `3 Z1 ~8 c. q. a$ x$ K
主要将本来显示在屏幕上的内容输出到指定文件中( ~+ C  @1 A: h- T4 @! I" S
指定文件如果不存在,则自动生成该文件
* G: A  R. {7 P0 Xtype c:test.txt >prn
# h/ j( e3 q  B- y" k/ |* R屏幕上不显示文件内容,转向输出到打印机
& i* T) m! z, o3 H- s6 Hecho hello world>con" l7 ]* T7 \7 H# w& `9 o% h
在屏幕上显示hello world,实际上所有输出都是默认 >con 的
. o$ o0 B, S% D5 S3 Z+ E0 Qcopy c:test.txt f: >nul. h2 t6 f; N+ a, k- N
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
! l: ^- y: G2 G0 L1 F" \( l: ycopy c:test.txt f: >nul 2>nul8 T" k1 u/ S* v5 F: k8 a* t% A
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
9 v7 b. I. s6 B2 s" E+ \2 n# Zecho ^^W ^> ^W>c:test.txt
  [" V1 I* P8 ^生成的文件内容为 ^W > W
2 k/ K1 D0 }( f* ^8 z0 C' V* u) E^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号: F! I. r- W5 _; o7 Q# z

; J% m( A% }9 r( z27 <
, H- N2 `! T0 \( K  P4 Z) ^/ O从文件中获得输入信息,而不是从屏幕上& n& F4 k$ D, F+ H; y% M
一般用于 date time label 等需要等待输入的命令
! m- g1 u) _9 b) H9 r; _8 V) u+ I@echo off
; j' k3 T) Z- \echo 2005-05-01>temp.txt+ f% F) i0 y$ X
date <temp.txt* a4 B& o8 r% ^) _+ U
del temp.txt6 C- w- |  [; s# w+ I
这样就可以不等待输入直接修改当前日期3 l- l5 r# J3 Q, V- T; J) {+ a; f
' u6 X4 l, U* f: U
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
  _- O, E. c! d$ L命令行传递给批处理的参数
- U1 _8 `5 e$ G- t; Z- Q%0 批处理文件本身! K% X, \4 o! K" Y+ x
%1 第一个参数
+ j- _; U6 N/ E, b  Z) R' t%9 第九个参数
4 M0 C4 D" V) J%* 从第一个参数开始的所有参数
' E) e# k2 b+ |2 D4 X# X+ t3 |5 F批参数(%n)的替代已被增强。您可以使用以下语法:5 A+ G. l7 O8 U" T$ R# v- v
%~1 - 删除引号(" ), 扩充 %1$ y" |; ]6 J9 z( M- y9 z' R" p
%~f1 - 将 %1 扩充到一个完全合格的路径名
6 a# v9 K" ~% h%~d1 - 仅将 %1 扩充到一个驱动器号
$ {4 C* @3 |9 T) p$ V3 }7 a* d%~p1 - 仅将 %1 扩充到一个路径
# v8 o5 U* o5 b) _; R%~n1 - 仅将 %1 扩充到一个文件名
% t0 {" x! d3 P& \%~x1 - 仅将 %1 扩充到一个文件扩展名9 ~5 ^! g3 q' j# T' v- m  Y
%~s1 - 扩充的路径指含有短名
' }3 y, r3 f3 q# R& Z! X7 J%~a1 - 将 %1 扩充到文件属性8 R9 U! g2 [# F
%~t1 - 将 %1 扩充到文件的日期/时间1 c1 K' A1 Q8 f+ R7 N# S
%~z1 - 将 %1 扩充到文件的大小! J$ x! b4 m$ T1 A0 f
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
9 X" {' i6 ]! }6 g扩充到找到的第一个完全合格的名称。如果环境
" ^* J+ i* B6 e, z# z2 f/ x变量名未被定义,或者没有找到文件,此组合键会
; c) U9 w: b% @) N( O扩充到空字符串2 o! Z0 e' Y  r- T
可以组合修定符来取得多重结果:* R6 j. E/ n) g. I
%~dp1 - 只将 %1 扩展到驱动器号和路径! U" Q! f9 [4 N' {
%~nx1 - 只将 %1 扩展到文件名和扩展名( z5 b0 M6 J& Y" o" f9 C
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,7 T7 l' B3 i( i# e4 v" [
并扩展到找到的第一个文件的驱动器号和路径。
1 m; }3 T+ t2 t, O& |/ }%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。# x. B7 V0 s. T, o4 i8 U; r
可以参照 call/? 或 for/? 看出每个参数的含意
- u. O% q9 e* h8 s/ F3 }8 \echo load "%%1" "%%2">c:test.txt
! A3 L; A. h! o- u生成的文件内容为 load "%1"  "%2"
4 ]% o9 \3 ^+ N. I% p* Y' T/ p批处理文件里,用这个格式把命令行参数输出到文件
" `! e& E8 {3 a9 F5 J- T- Z  o4 u- X' A3 V. x5 q
29 if% u6 j% @9 p4 `$ |8 U. }3 E2 J
判断命令
9 R1 q/ W: _" yif "%1"=="/a" echo 第一个参数是/a1 |% ?* k  j! |8 p$ B
if /i "%1" equ "/a" echo 第一个参数是/a9 ~; N$ C: n3 @9 J* O
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
/ S, g3 a3 H+ f' `- k4 ?: P- f5 qif exist c:test.bat echo 存在c:test.bat文件
$ i9 n2 N: r7 M. |& g  w- v, bif not exist c:windows (4 h' G6 @- a5 C5 X5 v
echo 不存在c:windows文件夹
( R5 v1 Z: k8 |)
2 \2 V$ |+ H! J- ]0 Y( t4 m- @" Tif exist c:test.bat (: l6 |9 Y! {) W  B
echo 存在c:test.bat' _* h3 ?3 O* K  N+ d; i( H
) else (
" a" |0 y8 t$ w6 ?- L2 _echo 不存在c:test.bat
7 Q  p7 a, Y  j% z% J8 H, D)( n4 Y4 }0 @$ r1 q+ {1 Q
30 setlocal 和 endlocal+ o( \) [- f& R- P6 B- U' c
设置”命令扩展名”和”延缓环境变量扩充”
6 s, k$ U6 z7 NSETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"  }5 k1 T- \9 p4 J
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
: T! Z5 P+ l9 l+ zSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
5 F* }$ H: K& LSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
# B/ B% c- _/ W/ ]3 F0 V5 V! l1 r$ A) mENDLOCAL #恢复到使用SETLOCAL语句以前的状态
% |/ C1 K! L& {0 m' q: u1 G: W“命令扩展名”默认为启用
, P% V) ~1 Z" a4 y/ M9 Z5 J“延缓环境变量扩充”默认为停用' F- G1 \3 e' S7 q2 I' e! l
批处理结束系统会自动恢复默认值
! j6 R3 ?! a% T0 x0 j4 V# p可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程- _4 Q% P, T! }
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
; \2 g$ A0 n4 Z, X- H" e$ M, J保程序能在其它系统上正确运行
& j9 a0 H9 f) b8 P7 |! E: M$ X8 b"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
! i3 t+ p% ?* G$ G1 m* Y. z2 L) |+ X# `! Y/ Q( c2 d2 X* {
31 set0 `9 q0 ~. l6 a$ d
设置变量6 S7 y/ Y# E* t& ~; }. t
引用变量可在变量名前后加 % ,即 %变量名%
$ F% l0 K- H! T0 d: D) k- ]0 b' V: |set #显示目前所有可用的变量,包括系统变量和自定义的变量3 n0 b! t% I0 T
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用" o9 M  i3 {5 k/ i! [. {  }- O
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=12 _4 _6 ~! P/ N; M' i) _
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
7 G$ c7 j+ N. \/ Vecho %p% #显示变量p代表的字符串,即aa1bb1aa2bb22 ]7 b1 L% |) `: t- [  {' M' ^$ c
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
  i: Y1 t, i$ `echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2
7 {: l+ N" G7 L4 techo %p:~0,3% #显示前3个字符,即aa13 \) I- W$ m% n8 P/ N" D' i; Q
echo %p:~-2% #显示最后面的2个字符,即b2% ]5 d: y+ `+ c/ c+ Z
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b: k* Y; R. `/ u4 g9 M. E  X8 E* q
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
6 M6 [8 Q* W+ g4 G+ n# U& F! |echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
6 J6 g9 D; s# P2 Hecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
) q) j8 Q' p( Mset p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
' w, S3 _* h- s1 _- V5 rset /a p=39 #设置p为数值型变量,值为39* o4 _- U: H- E9 f/ N
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=37 }6 ^- D6 H: x  j3 x. r! Y
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
/ e/ M( E8 r, C3 j: ]8 Qset /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
( x7 H( l  c# |6 Oset p= #取消p变量$ [: @' C4 c& f  Z3 z( Q
set /p p=请输入- B$ e3 T! `( L9 \
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
) @$ L7 a" M. ^注意这条可以用来取代 choice 命令
3 F6 I7 f* R5 h2 ]" x2 m注意变量在 if 和 for 的复合语句里是一次性全部替换的,如( a+ t  R- X6 J; R9 [8 O( T
@echo off0 o- m0 q- C( \, d! X/ m4 Z
set p=aaa6 f+ O$ o- }, ~+ D& f
if %p%==aaa (* m- d: D7 d9 S
echo %p%
: a$ E4 D8 K$ e# U, m- rset p=bbb7 y; K4 L: Q9 H; j# J
echo %p%* V* }7 d3 C$ w
)6 d2 k+ @+ D' }6 f5 V- U! _, S; e
结果将显示
( T3 J" O* o1 Q3 I  N5 Baaa! S6 O! H; C! }- t
aaa
- C# y- H, n. [! U* j因为在读取 if 语句时已经将所有 %p% 替换为aaa& p, N/ j& Z. [
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充") c) Z3 p. G  I% j5 S( U7 B
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
) [9 B5 G' z. t6 K1 |' d9 [; ~% Z@echo off
/ r2 V7 M/ n. A, aSETLOCAL ENABLEDELAYEDEXPANSION
, l+ k- y( j9 s' m* H& u/ ~set p=aaa
8 T' z' j* O6 bif %p%==aaa (
& Y$ o- ?6 S9 `) decho %p%! p5 `) O0 i- Z7 Z# D" q$ E
set p=bbb
. N0 p  n5 s+ |4 A& Y7 H6 ?7 v$ `echo !p!- }- m3 W1 R' j+ x4 o% h+ s9 j/ f+ }
); N& O3 W* R: e/ @/ m" S4 w
ENDLOCAL: F* t, r8 q# o
结果将显示' R& ]2 U9 g. p: a8 S( G: \
aaa
; r" q, M' _2 N' n7 d% [! }bbb# G1 r5 y! k$ m
还有几个动态变量,运行 set 看不到
* I* |/ ^* F  b5 P* b; @9 O%CD% #代表当前目录的字符串2 W6 G' f2 O5 z' m7 N0 T  n0 D7 e  ^
%DATE% #当前日期9 h& d2 S) \  i# P$ c
%TIME% #当前时间( u: `5 _& p, h( q5 u
%RANDOM% #随机整数,介于0~32767; X4 _4 D, A! P
%ERRORLEVEL% #当前 ERRORLEVEL 值- t8 s) Z% A9 y7 v1 U/ u7 G* x; z9 T
%CMDEXTVERSION% #当前命令处理器扩展名版本号
& r6 w7 v8 o& d4 V+ z8 Q%CMDCMDLINE% #调用命令处理器的原始命令行
9 g. D( Y9 D- T; y2 H& y4 j# s可以用echo命令查看每个变量值,如 echo %time%+ y% r8 V8 M- l% o" u
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到* R. |, S& W, }$ A% u+ p

. Y( N6 S+ M4 ^# k7 e32 start. c% G0 U! E* g0 f
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
5 W9 Q6 ?6 a5 _/ n' Z0 p
7 _* K6 E7 f% r33 call
5 g! a4 Z  C# W! O4 g批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
7 V9 ~; ]4 f/ b$ \1 x- L! l有时有的应用程序用start调用出错的,也可以call调用& M" {# w; ]: E4 r( C: H7 t

7 i7 _) C! ^5 z  j/ L' c, P34 choice (外部命令)
. w8 q) W1 U: I选择命令
- i+ p, F) }, ~7 D/ ~: @, U" |' ?让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
( x8 o6 R- K* owin98里是choice.com( S8 U. D. W- @/ q4 _
win2000pro里没有,可以从win98里拷过来
& D) ?, }* k$ gwin2003里是choice.exe. U0 s0 P% i! k% k
choice /N /C y /T 5 /D y>nul: {0 I8 f" w' v# a+ B, R- C
延时5秒0 J1 F+ f9 R$ T8 H+ }

! d+ G& b7 c* D4 ^# |& `( s35 assoc 和 ftype
  u$ X- y% E8 S1 j文件关联
- s: L- i) c1 |assoc 设置'文件扩展名'关联,关联到'文件类型') y( ?* {' n8 v0 L
ftype 设置'文件类型'关联,关联到'执行程序和参数'' T) i- q- n! ?  p) w
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开9 }) b: h. b6 d' f  s# D  k* h# c% \
而是先判断.txt属于 txtfile '文件类型'4 X& P. e& a9 t8 W) g
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
; H. N! q9 Q, O5 |3 q可以在"文件夹选项"→"文件类型"里修改这2种关联- T! h9 n. i" V! j6 _# L* }3 a  c
assoc #显示所有'文件扩展名'关联/ f$ x1 j; X) u3 W' w9 D7 q+ i
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile+ g+ M/ r# p2 g- n1 r! }* U/ U
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8- p5 D( W' O/ I, K# B0 A: b
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
3 [7 I+ q$ H* k! r9 Pftype #显示所有'文件类型'关联1 d' N  v: B! p: U( r. C! p. ]
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*2 Q- \$ m( V- P- O4 i7 w
assoc .txt=Word.Document.8# e# U4 U  q4 }
设置.txt为word类型的文档,可以看到.txt文件的图标都变了: j4 \( p) Z. F) Y3 v; D
assoc .txt=txtfile4 e! c; ^2 B! O& M: ]. _4 F
恢复.txt的正确关联
5 ]  K2 w, s2 P, d- oftype exefile="%1" %*
+ s2 R5 t7 Z5 ?* ]; g5 ?% G恢复 exefile 的正确关联
/ K6 G6 B( q% K7 i9 [+ G! Q" ^如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
6 f' c( x+ \" n- ?+ ^& {  O" t. ?3 `- o
36 pushd 和 popd( `' }5 l) D) l6 D- `5 k# F- t  c
切换当前目录/ i5 p, b* {1 P
@echo off
) R7 F, z6 R8 q4 Cc: & cd & md mp3 #在 C: 建立 mp3 文件夹
  q) c/ d' m9 l1 P. l5 tmd d:mp4 #在 D: 建立 mp4 文件夹
, `0 P4 R% I" g' `cd /d d:mp4 #更改当前目录为 d:mp4
3 j6 U8 c$ V( T: D( }1 Jpushd c:mp3 #保存当前目录,并切换当前目录为 c:mp36 j+ H3 Y! A+ u& y' @4 ^
popd #恢复当前目录为刚才保存的 d:mp4
- l3 S/ I, i4 y! a- Q& ?+ X
8 X+ o" j) k0 b37 for) ]$ E- V' G& x! R+ u+ ]
循环命令
2 r8 N4 W4 z- @这个比较复杂,请对照 for/? 来看: X: {; j( V9 b" G, s/ z0 d, P  ]: X
for %%i in (c: d: e: f do echo %%i
1 W! |7 C6 Q% l8 B8 ]; S依次调用小括号里的每个字符串,执行 do 后面的命令
" D) j# a4 _# _, ^: ?5 h, ^注意%%i,在批处理中 for 语句调用参数用2个%
/ ~% w- L2 {- o* W3 G$ i6 l默认的字符串分隔符是"空格键","Tab键","回车键"
9 b0 i( h# n/ @for %%i in (*.txt) do find "abc" %%i4 y. }4 f# L( k' X' @& ?# I
对当前目录里所有的txt文件执行 find 命令
8 w% t1 J( ^* p# r- O5 zfor /r . %%i in (*.txt) do find "abc" %%i& ~1 ]) U6 K$ T- b0 m
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行- S/ k/ _( C9 z+ S* C: h1 I
for /r . %%i in (.) do echo %%~pni
  U0 f6 e7 W0 u显示当前目录名和所有子目录名,包括路径,不包括盘符
% r1 _) e. K" c: J6 k8 ]for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
% C  y2 a9 M# u6 B把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
! X  O1 B/ h1 f, ?/ v# `: C' B) Cfor /l %%i in (2,1,8) do echo %%i  K$ |& c7 K7 Z0 b
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
5 K6 _" x6 X8 J5 c& e; y" `for /f %%i in ('set') do echo %%i9 i2 o+ C' r& I! E9 M: u4 l7 W
对 set 命令的输出结果循环调用,每行一个9 p" _! f, v- u
for /f "eol=P" %%i in ('set') do echo %%i( x+ U+ G( ]" H+ b6 O
取 set 命令的输出结果,忽略以 P 开头的那几行
' y8 _; ?3 |8 P3 [3 {for /f %%i in (d:mp3.txt) do echo %%i
! D6 a# n1 l9 B' Q显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称" u8 f8 C( |# Z5 j# d- E. f* p5 |5 D
for /f "delims=" %%i in (d:mp3.txt) do echo %%i; g" L2 A5 \* z( G
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
% J& ~7 @8 _6 K* |for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
1 D3 @* o1 ~: i对 dir 命令的结果,跳过前面5行,余下的每行取第4列  w! ?' q& z: Y" C" f2 }: U
每列之间的分隔符为默认的"空格"
5 @' Y& s; H6 n, p9 |3 W8 F5 v可以注意到 dir 命令输出的前5行是没有文件名的- n" b, D, Q0 h6 I$ w# a
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
0 V+ d/ n3 B. \8 i4 }echo %%a
* G  I+ @4 T; c$ cecho %%b
! ?! ]4 g/ e0 k8 w: ?: r$ F# ]% Wecho %%c
* q% N' P2 h3 N# s)
4 ]8 _! v, b5 x$ T5 _对 date /t 的输出结果,每行取1、2、3列. @& j) D: h* N; F* u
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列6 W" e' q, }+ R" x* Z0 S2 L! W1 N
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
8 K3 e* n* z# p) g其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的& f& l3 W( j9 g8 v& r2 X
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b7 C% ?6 ?2 v' }! L4 h
取第2列给 %%a ,其后的列都给 %%b
+ n1 w0 y- c" V4 S" A
1 [, i. ^# E; J+ R! i7 j38 subst (外部命令)
4 z' L+ p' E& }映射磁盘。
# y  H& |- V. M3 ~' Isubst z: serverd #这样输入z:就可以访问serverd了* s( z& [* p/ E" G% q% Z/ l
subst z: /d #取消该映射
9 K; B( Z) v6 dsubst #显示目前所有的映时6 c8 _' j+ l2 ^+ O3 |6 h8 d: H

9 E2 N2 t/ ]" k8 \* q# L7 B9 |: m39 xcopy (外部命令)8 J5 t4 i2 Z+ J0 b: j
文件拷贝  ~1 @0 R* N" v0 s& D
xcopy d:mp3 e:mp3 /s/e/i/y; |$ H5 s# [+ L8 W; H% ~. n* e
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
, T5 p! y, O  l, R% ~0 {$ S加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
1 R% i' P% y, O% x3 _+ {
$ l1 D$ ^6 _& G+ s. A1 o- X/ [+ {  u常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退" J, i  \& Z, N: B& P* M$ U' q
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:
      , k' M4 b( m- b! b" i+ [3 n

    ; `2 Y0 o3 r; O, Q- ^# i6 k
@echo off
3 B  u3 F- I" f8 q  c$ lset p=aaa
# o1 Z0 O, S7 b- b9 Uif %p%==aaa (+ t  v% j6 D1 l* c
echo %p%
' a) y" o1 c3 k( }* iset p=bbb
. B4 t1 g1 _% O7 }echo %p%$ E% O* [- n  k* Q! o
)% L" N! C% m; d3 s2 @9 G9 w  y4 y
pause
  • 截图:  M: _: R0 U- H( [. y) ]: j+ F
  • 2.批处理.bat 文件中输出中文乱码

    - d. ]  q9 _9 ^" V( z+ h
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:
      3 W7 w# q3 e! p4 N! Y6 Y# i. g
    • 效果截图:
      , n' }5 C: N* ~0 ^: p
        @$ v! k% s) L* O' }9 ]6 J0 I! f' l
    + @8 E8 f$ F/ q1 \

3 X  L) S; ~7 T* e! b

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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