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

找回密码
立即注册
搜索
热搜: 活动 交友 discuz
发新帖

2000

积分

1

好友

326

主题
发表于 2021-6-25 19:48:12 | 查看: 2469| 回复: 0
Windows批处理(cmd/bat)常用命令教程
简单详细,建议收藏
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
  • 2.批处理.bat 文件中输出中文乱码
  • 解决方法在文章末尾!
    9 Y3 M5 \2 }- j# V/ [0 f
前言
  • 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效
    / o9 E, T' t6 ]2 L  w
在Windows中善用批处理可以简化很多重复工作
什么是批处理?
  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展) g' J/ X5 X; H
    名为bat
  • 目前比较常见 的批处理包含两类:
    ' n- A8 V& D: o7 l# ^7 o* \
    • DOS批处理和PS批处理。
    • PS批处理是基于强大的图片编辑软件
    • Photoshop的,用来批量处理图片的脚本;
    • 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
    • DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理: M" v; W5 q! P' g% F! S2 e
  • 批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的& \: P4 C, A1 t' J6 u6 J
    命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行
  • 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件

    $ E$ j' C/ b: L) h3 w
怎么创建批处理文件?
  • 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
  • 一般情况下,每条命令占据一行
  • 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
  • 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
    + q3 |; [# T; o) k5 |; [& p
批处理命令简介
  • echo
  • rem
  • pause
  • call
  • start
  • goto
  • set
    2 [  d2 p/ {& {% b( P7 H* y  B1 }
批处理常用命令总结批处理符号简介
  • 回显屏蔽 @
  • 重定向1 >与>>
  • 重定向2 <
  • 管道符号 |
  • 转义符 ^
  • 逻辑命令符包括:&、&&、||
    " f+ `' A3 x9 R% n
常用DOS命令
  • 文件夹管理:
    ! a9 S' @+ k/ w8 q2 [
    • cd 显示当前目录名或改变当前目录。
    • md 创建目录。
    • rd 删除一个目录。
    • dir 显示目录中的文件和子目录列表。
    • tree 以图形显示驱动器或路径的文件夹结构。
    • path 为可执行文件显示或设置一个搜索路径。
    • xcopy 复制文件和目录树。3 q2 `7 W6 E! K5 o
  • 文件管理:
    & v' \0 `, i9 _( C- O( k
    • type 显示文本文件的内容。
    • copy 将一份或多份文件复制到另一个位置。
    • del 删除一个或数个文件。
    • move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
    • ren 重命名文件。
    • replace 替换文件。
    • attrib 显示或更改文件属性。
    • find 搜索字符串。
    • fc 比较两个文件或两个文件集并显示它们之间的不同
      * O/ m1 c) D; l( }; P- X& D+ `
  • 网络命令:+ r4 c: r% G* v# Y
    • ping 进行网络连接测试、名称解析
    • ftp 文件传输
    • net 网络命令集及用户管理
    • telnet 远程登陆
    • ipconfig显示、修改TCP/IP设置
    • msg 给用户发送消息
    • arp 显示、修改局域网的IP地址-物理地址映射列表
      3 W) M3 K2 Q, S7 q7 q
  • 系统管理:
    # [3 V: E0 Q" O  A$ N- Z
    • at 安排在特定日期和时间运行命令和程序
    • shutdown立即或定时关机或重启
    • tskill 结束进程
    • taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
    • tasklist显示进程列表(Windows XP Home Edition中没有)
    • sc 系统服务设置与控制
    • reg 注册表控制台工具
    • powercfg控制系统上的电源设置
      3 N% ^" {1 Z1 Y& [5 l8 B

    , c4 d7 E/ H' c* g7 S
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
5 |0 Y# X  o+ c, u) _7 L% d. x8 |- m4 r
6 v0 T  L  D+ W( O
Windows Batch 常用命令6 S6 x% E3 e. S/ l( c! [: l& N$ }
1 echo 和 @' M  k( D, T1 ]3 ]$ E+ L7 G' d9 V
回显命令# h4 ?/ @7 v' U& u
@  #关闭单行回显+ H3 ^4 c9 ?- v1 z5 B  r
echo off  #从下一行开始关闭回显( P, |' n) w- S- [+ [2 j0 z
@echo off  #从本行开始关闭回显。一般批处理第一行都是这个% S) N* d# [$ d7 e3 {2 D& G# q! w
echo on #从下一行开始打开回显4 H$ E/ p, A& A! u5 w6 k
echo #显示当前是 echo off 状态还是 echo on 状态
5 V+ J" m7 s3 Z& @echo. #输出一个”回车换行”,空白行  n. o! F0 m" o+ [. z3 M, F
#(同echo, echo; echo+ echo[ echo] echo/ echo)$ w) c2 \9 f$ T- X

% @) ^  }7 R% O+ ^2 errorlevel
1 ~/ E2 h% v2 ^0 uecho %errorlevel%
5 @: g! }# Y; g& F& ^) u+ ]每个命令运行结束,可以用这个命令行格式查看返回码5 |1 E; L# n% B- m
默认值为0,一般命令执行出错会设 errorlevel 为16 [9 Z+ s) q; N5 y& ~5 T3 k

% F0 ?0 j/ ^1 F8 n1 b/ H3 dir( I( ]( X1 S3 M1 S0 x+ g
显示文件夹内容2 A& v; s1 Q6 P3 `
dir #显示当前目录中的文件和子目录
& k+ ^. O4 r0 q8 J5 R0 bdir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
8 x8 I( t3 x: s" G, {% n, v/ ydir c: /a:d #显示 C 盘当前目录中的目录
1 n; D; K8 ^9 z3 b5 W  {+ m3 a) [dir c: /a:-d #显示 C 盘根目录中的文件
+ o) g6 Q8 F; P9 mdir c: /b/p #/b只显示文件名,/p分页显示  o6 ^- i; M& m/ V# e+ [9 q( ]
dir *.exe /s #显示当前目录和子目录里所有的.exe文件
6 P; w! d  i: ]5 h4 A
# n2 l7 b% Q1 Z) f( m! m2 C) R! ^) ~4 cd, f, y1 k+ O% w! @9 Q- t
切换目录
/ |' J/ M% s; y9 u2 Pcd #进入根目录
7 T' j3 t. z; J: rcd #显示当前目录
& o! h+ Z$ E$ g- wcd /d d:sdk #可以同时更改盘符和目录
! j" l" {; Q: ~2 p- k, K. t5 ]9 Q6 u0 n& z6 i
5 md! @% k7 M6 q% F5 N9 ?
创建目录6 @  f5 c, B" L9 U
md d:abc #如果 d:a 不存在,将会自动创建中级目录
: h* X. C/ N+ b" v/ V; J$ O5 ]#如果命令扩展名被停用,则需要键入 mkdir abc$ |+ i  N  C# H2 {6 u
; r2 X) G, _, I" r/ `5 i
6 rd2 ]1 Q7 U! w3 E$ l
删除目录
$ L8 }$ |9 v; w  s! w5 ?3 e+ w5 Brd abc #删除当前目录里的 abc 子目录,要求为空目录
8 v' w" s3 m: xrd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
  `  c. ]( N2 [0 r# @0 B; D
4 s) F0 d" m6 d( c. m7 del
& |7 n# t' g' l% ?' x& A删除文件# P: Q6 m. D1 s
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
& l1 W- e4 ]$ Q9 ]6 v' odel /q/a/f d:temp*.*
( J# Y, d" j, \8 T# s; A删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
6 r5 i' Y  ^: d$ t3 Odel /q/a/f/s d:temp*.*
( r8 N% D0 A/ K/ V/ d删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
* G7 B5 O$ q9 p& Q+ K, \8 z9 n3 q
1 x; U6 e0 x* R0 p# q  n8 s, U8 ren8 a0 p0 t8 y8 |5 A; ?
重命名命令
5 e: V( s4 o" r  Lren d:temp tmp #支持对文件夹的重命名
! x4 r* F: u- F4 e2 u! x
; U7 b2 o' a+ t4 _9 cls" g1 E/ _5 s) E- I
清屏5 R* h8 e( x- s! f3 t. Y) d: Z
10 type+ o; w, y: q8 M& ]+ g! r
显示文件内容  N1 _, W5 T; t  q
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
$ P/ m/ ^: ], B2 Itype *.txt #显示当前目录里所有.txt文件的内容1 e7 ]6 E5 ?3 T: w4 u
: E& v7 Q/ p& _
11 copy
3 h" \( [( O4 L9 l& S拷贝文件: [- `$ B- g+ @
copy c:test.txt d:test.bak% y3 y; ~8 K  }- V/ t
复制 c:test.txt 文件到 d: ,并重命名为 test.bak9 i3 d/ F* C* n+ n0 i9 c
copy con test.txt+ u* g6 G! k8 z0 m
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
# w; N# Y1 _3 Z" y1 b; F0 ocon代表屏幕,prn代表打印机,nul代表空设备6 r3 N+ x& N- d# v0 V
copy 1.txt + 2.txt 3.txt
0 ]2 A" _: i+ K" t6 A9 ^8 D% }; H合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件5 n8 O% k4 q0 r. t. Z/ _
如果不指定 3.txt ,则保存到 1.txt2 c( {9 H8 Z. ]- g  M& \
copy test.txt +
6 ^+ f. T( t9 [8 j  p9 e- d( O- d复制文件到自己,实际上是修改了文件日期
$ \9 ?4 o1 G; ~8 K3 M/ y. L2 j( U5 A& K6 n
12 title
7 K; t# K0 g9 ]! z设置cmd窗口的标题
& D# P& P1 M$ U& B# _! Ftitle 新标题 #可以看到cmd窗口的标题栏变了- r- r1 @7 C( d7 I7 P- a- }/ A

# H( n8 ]3 ]) C1 g! N) ]& n13 ver
! t! @* t$ s9 f  C, ]显示系统版本. G# Z. `% k1 M
2 w$ ^5 Y4 o+ w, z) Y4 P' O2 P
14 label 和 vol' x. a# X# P- M5 F+ _! |
设置卷标
; Q0 R3 p. _! C/ Hvol #显示卷标1 }: Q- S+ c/ U. A# e6 ~4 P3 h7 K1 S
label #显示卷标,同时提示输入新卷标  ]/ s8 o- I* u7 S& ]) A9 E
label c:system #设置C盘的卷标为 system3 w! |; P% a2 q

3 R1 a, ^7 z+ N% \% T15 pause" z7 ^+ m: I$ F& H
暂停命令
6 G& n! _8 p  `% @6 \. A
9 s6 O$ k" q  s) M, {16 rem 和 ::
6 S& l3 P" c3 C, [: m注释命令* i+ g1 ]+ ^" C! t8 R( V' t
注释行不执行操作
4 U5 A8 v4 |3 A
- W5 O5 m% O* B# C' ^# Z, ~2 |7 m17 date 和 time
2 B' h6 @4 M$ {" E3 V4 E3 q0 A$ f日期和时间# |* W6 t! s* \
date #显示当前日期,并提示输入新日期,按"回车"略过输入6 r9 @) a0 l% D/ J
date/t #只显示当前日期,不提示输入新日期2 V/ D. u( [5 Y
time #显示当前时间,并提示输入新时间,按"回车"略过输入  z* c* a$ @! J# G
time/t #只显示当前时间,不提示输入新时间
; t; K5 G; X! H1 J( H& Z& A0 z9 ]+ I% A8 D; Y* n
18 goto 和 :8 Y, z; s7 T( a
跳转命令
- i! k: {2 s* j- H0 j4 e:label #行首为:表示该行是标签行,标签行不执行操作
. R3 N  V# B% Z) i$ |  pgoto label #跳转到指定的标签那一行7 |. @. x# n& m2 r, F6 \+ s
: b1 _% m+ S5 K5 C/ `8 I5 k0 p! L
19 find (外部命令)
0 V6 t1 M; C8 N  k2 Z, o9 g查找命令
  `( K  h3 A; _, y+ Z- _: Jfind "abc" c:test.txt
. b. v3 x9 Q. s0 _在 c:test.txt 文件里查找含 abc 字符串的行
! d/ ~, W: b  F2 ^如果找不到,将设 errorlevel 返回码为1( d- p, J7 {# V3 x
find /i “abc” c:test.txt
' V1 r- S! D4 k% o9 n1 h, ^. s查找含 abc 的行,忽略大小写
! D9 w3 x( `6 a, e- bfind /c "abc" c:test.txt
5 r$ w2 Q5 W1 _显示含 abc 的行的行数: K. n  |  N9 \0 |+ q$ s0 Q

% ?. f) Z; J* r0 d7 k20 more (外部命令)
  @! S9 h9 w8 o' t8 Q逐屏显示; |4 R+ d' O! E, ~  b! p
more c:test.txt #逐屏显示 c:test.txt 的文件内容
1 n# F2 a6 G+ a# p5 H+ F% d. k* v) c
21 tree
7 ^6 k. x: T9 u5 u7 a$ z显示目录结构
3 T: T$ u: j* V$ B9 H% w9 P- M3 _tree d: #显示D盘的文件目录结构( ^) ?1 n# z+ S' M. F

/ [3 a, V& N+ i7 Z) I22 &+ Y7 ~& H" {2 _5 R4 r+ Z
顺序执行多条命令,而不管命令是否执行成功
4 ~4 p& T! w6 Y) j+ @8 q8 ]' q
. o2 D# d; Q$ G; I1 B( n& {23 &&6 U  y, N9 ?2 B3 o* x
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令7 V" H0 I( X" M/ S+ w9 l
find "ok" c:test.txt && echo 成功6 o: c( I( c* P, G! X
如果找到了"ok"字样,就显示"成功",找不到就不显示
8 C$ U0 A4 _& [) I8 b4 c% x
$ x3 i; T9 O, n" _24 ||" s& W' v4 Z& `( }
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令( s% B/ r, g, G9 w  b; ?4 V, z! C
find "ok" c:test.txt || echo 不成功
0 T9 t) O! f+ r1 e2 |如果找不到"ok"字样,就显示"不成功",找到了就不显示
; n$ |9 c$ C. y0 B+ h8 P0 `+ k5 x$ D% w  |+ n1 W1 y. U1 E
25 |
+ i$ V# Z- m6 B; I. s6 H, Z管道命令$ W2 I8 j! g% y& O# H
dir *.* /s/a | find /c ".exe"* G, ~0 l9 ~8 @  k- _) j2 }2 U
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令, c* w* h  y3 v: X7 n
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
6 C8 W  z  k7 v& F1 X5 Atype c:test.txt|more9 f' o3 @3 p2 N+ z
这个和 more c:test.txt 的效果是一样的' R# i( n7 O2 Q7 M) t( C2 M+ B

. a! y0 o9 l0 D6 d5 Z% |26 > 和 >>
' o+ S4 e4 Z2 M7 P# d输出重定向命令" M9 ?; y& P. h+ g
> 清除文件中原有的内容后再写入
6 n- O& \2 F$ K7 D>> 追加内容到文件末尾,而不会清除原有的内容8 F5 j0 ~: e6 R, }4 N
主要将本来显示在屏幕上的内容输出到指定文件中) y8 |+ [1 p7 T7 h
指定文件如果不存在,则自动生成该文件
- y( Q: {8 H# V" F- N( utype c:test.txt >prn
0 i. k& Z7 Q! i屏幕上不显示文件内容,转向输出到打印机7 M' E. I' }! I3 |& b5 t9 `
echo hello world>con
- M; Q3 D( t: V; j! h3 b9 H' O2 M在屏幕上显示hello world,实际上所有输出都是默认 >con 的
# ]; O6 L" Q2 }9 ?% e6 scopy c:test.txt f: >nul+ r0 Y( B# w  S. ~+ k4 ?$ X
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息9 b# j) h0 `% R' o5 F4 c. `6 H2 S
copy c:test.txt f: >nul 2>nul" E% s3 J. _. o+ k2 }
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息- p) ^& Q  `7 {- b1 p
echo ^^W ^> ^W>c:test.txt% [( S9 M, H& v1 V2 E. q3 I
生成的文件内容为 ^W > W* h7 J5 I& d/ B5 w
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号3 }3 Z$ }7 X$ q- n

1 T4 j# N0 e0 d27 <
# X4 M+ U# z1 D2 d1 K. p5 B( |从文件中获得输入信息,而不是从屏幕上) j, Q5 Z) D- H* Y) ~, ]" O  ^
一般用于 date time label 等需要等待输入的命令& [: d5 {- o  W! L
@echo off
" c- q& d6 \3 L, Qecho 2005-05-01>temp.txt9 {: y! X3 j1 X7 k9 `4 v+ {* {! a1 d
date <temp.txt% u3 l2 g+ S$ |/ Q
del temp.txt% `1 P. O( N4 G' s4 B, U
这样就可以不等待输入直接修改当前日期2 b  K! l- `  q9 n) v! S
/ ^! H3 e! h8 b1 D+ K- E$ a
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
6 x/ o: ~# U& x+ r. r! u+ N' r6 a命令行传递给批处理的参数7 G6 {% Q- P1 N2 l, S/ f  z! P
%0 批处理文件本身* J7 S2 y- C! Z& A# i8 V
%1 第一个参数9 Y) h# U' w# w& C
%9 第九个参数' o3 y. @. A! i' p
%* 从第一个参数开始的所有参数$ h# g+ M. A$ O, c
批参数(%n)的替代已被增强。您可以使用以下语法:2 l% [6 F) Z* J
%~1 - 删除引号(" ), 扩充 %11 H0 S' h4 O! K4 h* m
%~f1 - 将 %1 扩充到一个完全合格的路径名3 _. q$ q2 R9 F0 L
%~d1 - 仅将 %1 扩充到一个驱动器号
! b2 Q+ D7 E/ }" F' [' _* g0 c%~p1 - 仅将 %1 扩充到一个路径
6 u6 |9 A3 x$ D$ d' \: i7 }/ H%~n1 - 仅将 %1 扩充到一个文件名5 P4 S3 ^" c7 K- q" v2 [
%~x1 - 仅将 %1 扩充到一个文件扩展名( ?% L1 P4 B, J0 ^8 a5 [
%~s1 - 扩充的路径指含有短名  I  H7 L, y  x& K0 b0 t
%~a1 - 将 %1 扩充到文件属性
! p9 x& q7 r' H6 S%~t1 - 将 %1 扩充到文件的日期/时间8 M: v& V( S; a) H+ U
%~z1 - 将 %1 扩充到文件的大小1 P  M/ b# S) {6 q, Z% o
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
$ s# O7 D: L5 [扩充到找到的第一个完全合格的名称。如果环境
9 ~. `' m( u2 I4 K( Y& K; r变量名未被定义,或者没有找到文件,此组合键会
5 Z' O! t1 @# q- C( e3 Q" s扩充到空字符串& A/ ~% i  Y/ q0 T1 q
可以组合修定符来取得多重结果:
9 G0 Z: D* F/ p9 ?- @3 X%~dp1 - 只将 %1 扩展到驱动器号和路径
. k* W6 }, D; p3 w%~nx1 - 只将 %1 扩展到文件名和扩展名
9 D3 M+ W' G/ X8 ?% N%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
( W! v, ?2 e/ i* Z4 M并扩展到找到的第一个文件的驱动器号和路径。
8 n# {/ h* _- B% K%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
, W8 {2 x3 i$ m# t! s可以参照 call/? 或 for/? 看出每个参数的含意5 R, x# P; y) [2 d7 b
echo load "%%1" "%%2">c:test.txt
8 R4 Q, G. X* ?: K2 G  `2 v3 C生成的文件内容为 load "%1"  "%2"
3 K% E2 j. F: O& c) H1 p( F: R批处理文件里,用这个格式把命令行参数输出到文件& U- I. V0 R3 s
& D+ K: W, ^; b: g  p
29 if
& L; G6 \1 {* r8 h8 F0 |判断命令
, c( u& ~" Z7 V) jif "%1"=="/a" echo 第一个参数是/a8 N* R( v2 B; b5 `( }! a' h3 _
if /i "%1" equ "/a" echo 第一个参数是/a
9 e) O* n+ f  o  z8 i. e* k- G. f/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
, o3 m; p. Z! ?5 S/ Z) i* Lif exist c:test.bat echo 存在c:test.bat文件8 T0 u$ L4 N7 V, N7 T% d
if not exist c:windows (; P0 o: I/ }) V) ^5 O
echo 不存在c:windows文件夹
/ g" Z: `' a) @1 E)
8 D* F; n: l) Pif exist c:test.bat (
( E( w) C6 h7 `; `$ Hecho 存在c:test.bat
+ d. v$ C3 h: W+ y) else (6 s# a2 l7 `8 e+ i: u
echo 不存在c:test.bat5 G! S. {- ]+ `
)! b' ?8 s9 D% t# C9 g$ g$ n" n7 E
30 setlocal 和 endlocal3 C( B) f4 C- w+ g
设置”命令扩展名”和”延缓环境变量扩充”
  I) m2 l' c7 iSETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
. r1 N+ J6 ^$ |4 C9 [6 @SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"5 Z% s0 R, M5 i2 v2 h, j
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"" F' `$ ?: p/ G' X" L+ w  `9 ?
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"0 V, n7 n+ j' V8 \  r
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态
  e: p# Y4 d& m1 R1 W5 b" w“命令扩展名”默认为启用
% {* j, \3 B  v  m' D: n“延缓环境变量扩充”默认为停用" q5 Q: {7 p2 n. K
批处理结束系统会自动恢复默认值. |- f2 p% D8 c4 J
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
5 \4 B+ o% r. X- h序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
2 r: Q$ o1 k8 o2 ?- B3 p: i保程序能在其它系统上正确运行5 e/ T8 ^' W6 m# b" Z, F
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
6 ^, v2 }: d8 J+ K9 B( V! H. M' I% C8 v8 K: y2 S6 b
31 set* D- G% |# t9 S
设置变量: H* f4 w( `) h$ [, _5 |
引用变量可在变量名前后加 % ,即 %变量名%) l( Y& V! T3 q; D- R, J
set #显示目前所有可用的变量,包括系统变量和自定义的变量
9 l! s( S/ i1 V# Y& |2 M7 [  W; ]echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
; a, T! }$ }% d$ G7 aset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1) y  e! ~/ v, F6 O* {, c# M* \, M
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2" S  ^8 X; P: F2 K: D2 \! v6 G
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb21 J  p! r7 ]( B2 R% `$ \( P& c
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
' L1 W' G. X8 P9 Lecho %p:~6,3% #显示第6个字符以后的3个字符,即aa2
7 j- L2 s" x! R! h! _8 recho %p:~0,3% #显示前3个字符,即aa1
5 @9 k0 I9 k6 _1 m6 i. Aecho %p:~-2% #显示最后面的2个字符,即b2' R+ Z2 D# ~; w8 Z; B& A" C; ~
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
/ O$ r* A& I0 m0 zecho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb28 [* y; @& E2 c* Q2 R9 w$ Z) t
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2& f# t, W0 F. W- }+ u8 s1 l
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb29 o# v! D. ?* k% y' x+ w
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb25 y$ L  ~! F1 Y, `* T& M
set /a p=39 #设置p为数值型变量,值为390 E' L/ M: w/ v, t, S
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
6 X: \) N, B. V- L- w/ O' \# hset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
2 C6 d0 [1 m% m+ p; wset /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?) `8 j8 L' R6 V* ?+ M
set p= #取消p变量3 K$ Y2 [/ H: A3 N, X# `+ Q
set /p p=请输入, b! ]0 K9 P5 A9 S" V$ H
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p2 e* y$ t& E3 u! u
注意这条可以用来取代 choice 命令6 [/ j4 c+ @8 \1 X2 D
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如$ g" I$ r8 u' j* p) j: y$ ^3 S5 [5 |
@echo off- e1 T% Y; t& A  e8 `6 M& [
set p=aaa
- x% A( i8 ]9 B0 ^if %p%==aaa (
* }8 Y# c" h% Jecho %p%
. G8 i& c- C& A1 G5 |5 U/ lset p=bbb
$ X0 C8 B1 o, {/ e/ }+ W: Aecho %p%6 C. t' z4 _; B% P; R  M) b% H) S1 I
)
% i! n4 L* Y% M5 M8 w6 @" E结果将显示
: }# T+ v9 ~6 H* oaaa
- [9 M8 `0 ~8 c& Oaaa
: c* z5 P% r3 @, a因为在读取 if 语句时已经将所有 %p% 替换为aaa5 _; o. ^" l! p' u0 u/ L8 O6 `
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
! R) I% c7 ?1 y9 ^可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!2 M& Q- \) N$ ]5 s, n
@echo off- M( @, d0 E1 F1 n, l
SETLOCAL ENABLEDELAYEDEXPANSION; C3 R* Y/ o4 N! U+ ^$ n
set p=aaa5 j9 x# h0 p) v  A& }
if %p%==aaa (
: E& G, g; [( i) {! qecho %p%
- Q) u" P$ S# Uset p=bbb
: L; z1 c* e5 ~- Jecho !p!
8 c& {6 M2 A9 f0 d8 ^)% l7 Z- O) T$ v; j/ \4 f% G0 E
ENDLOCAL
0 S+ }+ Z3 p1 ]" @5 v6 P$ ~结果将显示' q& L' C/ n2 b6 x
aaa
8 N+ Z  |! |' O3 h( Wbbb
3 b- S2 W8 G: K6 V还有几个动态变量,运行 set 看不到( m' ]* @, c2 g: A; e5 X. k; J  s
%CD% #代表当前目录的字符串
: l+ [6 ?' }+ N# Q%DATE% #当前日期. p! e  t# i) [7 c* e" ^6 F7 }( z; {; U
%TIME% #当前时间3 k$ t- G/ [; @0 E. j
%RANDOM% #随机整数,介于0~32767
  O3 J+ [6 m- x  T%ERRORLEVEL% #当前 ERRORLEVEL 值9 x9 j$ a. n# j
%CMDEXTVERSION% #当前命令处理器扩展名版本号
" [* q7 N/ Z5 H- ?( }, ]- B! s4 w7 O%CMDCMDLINE% #调用命令处理器的原始命令行
" M3 V1 H0 J) `. ~$ {& M可以用echo命令查看每个变量值,如 echo %time%9 t* ?% ?& N8 K1 _  m7 w% ]4 ]
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到( y3 B: G/ [8 U' m9 X

# R% o* R- t, c7 }* w9 P! }: o32 start: L. y+ F. m1 n# g' X
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令- e' G2 A) W  }! Z/ s; M" Q

: A9 k% {+ a* Z' Y" ~33 call  K' D" t( u/ p
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行, {7 @0 |1 S8 s: q
有时有的应用程序用start调用出错的,也可以call调用
; X) P+ o, u! G& O: S+ o9 L" h
; x% v, C/ m8 B( u% @34 choice (外部命令)9 F2 A& v; q; S4 r
选择命令% S. r1 u( d* D$ r
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
: r( y( K* g  @/ R) awin98里是choice.com  v: v* r' [) F
win2000pro里没有,可以从win98里拷过来
8 B2 b- r8 s) |* Rwin2003里是choice.exe
& l$ ?4 \: Z% x* Ychoice /N /C y /T 5 /D y>nul/ R/ o8 S2 }, d& D' i3 s: L1 ]& l' ~
延时5秒# t& I) O, K3 ~

- u8 F! ~  H- }) d35 assoc 和 ftype9 c; F1 V& Y4 j/ A+ v
文件关联
* ^7 b  p6 z9 }, passoc 设置'文件扩展名'关联,关联到'文件类型'* M8 M2 F- n  g; y  B8 g+ E4 t
ftype 设置'文件类型'关联,关联到'执行程序和参数'% V1 b! w& ^4 Z3 Y. I
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开% M' e0 i, ?' |0 a. U) {; h2 ^
而是先判断.txt属于 txtfile '文件类型'" |2 F6 b6 A& w3 l. S
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1; n7 j& |' F3 F2 ~; }1 Z* q4 _% C9 R
可以在"文件夹选项"→"文件类型"里修改这2种关联
9 \1 f5 h3 K. A- a6 @/ rassoc #显示所有'文件扩展名'关联) h4 _: e6 `6 H, C" ~" C
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
4 U0 u5 Q5 q9 G1 Q3 ~) hassoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8. Z" _9 t! P7 W3 O2 }; q( y$ v
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
0 C3 b$ Y& L8 u: b+ iftype #显示所有'文件类型'关联5 Z3 f$ J7 N+ P8 j5 |6 V6 V
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*+ m) t+ J0 }% z8 }- b
assoc .txt=Word.Document.8
" m) B+ D  D/ g( X  V设置.txt为word类型的文档,可以看到.txt文件的图标都变了1 u3 Z' U5 a6 b: e9 t# B
assoc .txt=txtfile/ m: M+ E6 L3 s- s. g1 R
恢复.txt的正确关联- w& W* Y# F1 X! ^, V' h
ftype exefile="%1" %*/ i4 h1 g& t3 {( [! N: \
恢复 exefile 的正确关联
8 n7 ~+ n0 W* z如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
; P( {; ?# J. R
) }2 F, @: |; ~! [' P36 pushd 和 popd
/ J9 m# E- ]/ R  w1 p切换当前目录
6 F3 ?) E% s3 V( h! w( }@echo off
; F* E% U: f  d  p$ S$ _( Ic: & cd & md mp3 #在 C: 建立 mp3 文件夹9 a) O  d  f5 Y
md d:mp4 #在 D: 建立 mp4 文件夹
# g8 h% T) ~; p* s2 t& n3 dcd /d d:mp4 #更改当前目录为 d:mp4
, E2 |2 O* x) o; Rpushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3  d1 d, z' Y) N5 k8 H
popd #恢复当前目录为刚才保存的 d:mp4
  w' a9 v& M3 R) N
( t# V5 }; N( x5 N37 for  ^7 C7 W) v. c1 s3 d; Z8 l
循环命令
6 @2 D4 K4 e  ?* h( |这个比较复杂,请对照 for/? 来看+ ^* `4 @# {' Y% }: L
for %%i in (c: d: e: f do echo %%i
4 r3 G9 v1 u  g: D0 K! r  o* p依次调用小括号里的每个字符串,执行 do 后面的命令* @$ r5 ~; G0 Y' h9 \! z
注意%%i,在批处理中 for 语句调用参数用2个%
7 k1 @/ \3 z7 Y: k默认的字符串分隔符是"空格键","Tab键","回车键": R3 s' e5 P0 C1 W: F
for %%i in (*.txt) do find "abc" %%i' s6 J8 C4 A4 R, b/ |
对当前目录里所有的txt文件执行 find 命令* b2 f8 U9 {) t3 h# ?* R( h$ O
for /r . %%i in (*.txt) do find "abc" %%i
& H3 Z! T1 d# s' P在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行' W, u* {8 z# k7 n( A. l
for /r . %%i in (.) do echo %%~pni& r+ Y; \  G/ _, ]+ f5 C
显示当前目录名和所有子目录名,包括路径,不包括盘符6 O9 m* m5 B, L" \3 ~' a4 e
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt. i& ?1 `( ^$ p& T- x. V  s
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
- k* L/ s# k" q+ ?1 _+ j9 yfor /l %%i in (2,1,8) do echo %%i
0 u2 }, q& T' {生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加10 R2 g: U: M1 w. N- i3 h( a- j& Y. T. }
for /f %%i in ('set') do echo %%i+ n, k8 w: _) ?
对 set 命令的输出结果循环调用,每行一个
' ~: X: x, x) e  Zfor /f "eol=P" %%i in ('set') do echo %%i
, K( |! L: n3 y' |( X取 set 命令的输出结果,忽略以 P 开头的那几行5 @8 m/ m" P: k0 d9 {
for /f %%i in (d:mp3.txt) do echo %%i- V3 f( W  ]" O9 g" V
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称$ W% i+ Y% t: L$ |3 O* D* b
for /f "delims=" %%i in (d:mp3.txt) do echo %%i' |- [6 D5 W4 E$ H: K1 g3 L4 b
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称' _& O# U. F' k+ u; e) T0 K
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
/ j& ^! y  {" p, r$ d对 dir 命令的结果,跳过前面5行,余下的每行取第4列+ F3 A5 P$ d9 Q/ |, e5 m4 I
每列之间的分隔符为默认的"空格"7 q. c4 S) s) o" e8 A! m
可以注意到 dir 命令输出的前5行是没有文件名的
! d7 n, L- ^6 ^1 Qfor /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
7 |" J# J! c$ zecho %%a. |3 b0 ^) o' R' M
echo %%b
9 N& b. M+ c' Wecho %%c
2 {/ l; X, Z7 G3 j3 A! [! k* p)
4 p/ B- F% L1 M对 date /t 的输出结果,每行取1、2、3列
9 h6 D% K9 W. ?; `第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列, V/ D) l2 j+ v& @
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"0 ^* @" p, q3 }. J3 {
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
9 }. Q& m2 r" F4 ]" ?for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b6 M; N. Z3 Z! u+ U: o
取第2列给 %%a ,其后的列都给 %%b
0 u4 @( B( Q, ?( d, }2 J( f5 d* P* ~! c* L5 ^* y0 }
38 subst (外部命令)1 x2 J1 k, \$ N. D( K3 n% C
映射磁盘。2 m( A% w% F9 m. v. L
subst z: serverd #这样输入z:就可以访问serverd了; K& ^' x; I( z3 W" y! ~  C; x
subst z: /d #取消该映射
3 f2 P: _1 C- T; {# ?subst #显示目前所有的映时/ o. g, {' W" T9 V0 h) E
  w2 D: f9 U, b6 ~
39 xcopy (外部命令)0 p$ o6 _& I1 p: D+ Y
文件拷贝
. Q$ h- I* m7 ~& ]7 Yxcopy d:mp3 e:mp3 /s/e/i/y
+ g, G) `. B0 E: b7 c复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
; X5 g4 t8 T5 A/ i& V加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
  k' O3 c; _* c- J1 P; Q4 M6 M# j1 w1 \; |, v2 l- o+ n
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
    1 `7 ~, Z8 R3 L- q% @1 u* S* G
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:
        r/ B: M# p- \1 t4 _7 _
    2 @. T, m( G" D, g/ }
@echo off
! S% Y$ _: n- K6 |2 k- Q5 \set p=aaa
% [. b8 V! P; \: {* Iif %p%==aaa (4 w" C" J+ K) a: H5 ^# U0 R
echo %p%
9 ^. V- X' }# A. [set p=bbb' B6 Q& n- o8 J1 s7 J
echo %p%# V* e( G  C/ w
)
$ E6 T, y2 }  D) n1 b- Zpause
  • 截图:
    ( N9 `. i0 S5 t8 u& S- j1 k
  • 2.批处理.bat 文件中输出中文乱码

    ! a0 Q( z8 E% Q# @: |+ J
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:
      + l6 B. `( A- |: ~5 x
    • 效果截图:
      4 Q$ j* l$ n6 G5 |2 v$ N+ [0 @
      + c0 ^. H( ]- ~

      J7 m( {8 T8 u1 z- y2 t9 d

( J0 r$ W/ }- R/ g, e

本帖子中包含更多资源

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

青浦海洋数码电脑城
您需要登录后才可以回帖 登录 | 立即注册

QQ|Archiver|手机版|小黑屋|青浦海洋数码电脑城 ( 沪ICP备18024137号 )

GMT+8, 2026-10-17 08:13 , Processed in 0.082070 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表