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

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

1925

积分

1

好友

309

主题
发表于 2021-6-25 19:48:12 | 查看: 2320| 回复: 0
Windows批处理(cmd/bat)常用命令教程
简单详细,建议收藏
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
  • 2.批处理.bat 文件中输出中文乱码
  • 解决方法在文章末尾!8 Z) r8 Z( X9 {- m  Q7 o6 G
前言
  • 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效
    " X/ P9 F& v/ M) ?1 T
在Windows中善用批处理可以简化很多重复工作
什么是批处理?
  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展- j$ r. b) ]& S
    名为bat
  • 目前比较常见 的批处理包含两类:
    ) }) ]! J9 ^! ?3 G$ m" ~) L" d8 n
    • DOS批处理和PS批处理。
    • PS批处理是基于强大的图片编辑软件
    • Photoshop的,用来批量处理图片的脚本;
    • 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
    • DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
      ; g2 |7 t7 d& E3 t" I! @
  • 批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的8 n& J+ F$ ^& q* y8 U% f- B
    命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行
  • 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
    / E2 \# J- k1 @. D" o' N: |
怎么创建批处理文件?
  • 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
  • 一般情况下,每条命令占据一行
  • 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
  • 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
    7 w; ]* U4 V8 @9 ~* C
批处理命令简介
  • echo
  • rem
  • pause
  • call
  • start
  • goto
  • set
    % K, E. k/ b1 C9 a7 @" [
批处理常用命令总结批处理符号简介
  • 回显屏蔽 @
  • 重定向1 >与>>
  • 重定向2 <
  • 管道符号 |
  • 转义符 ^
  • 逻辑命令符包括:&、&&、||0 p3 Q- ]5 f, l* J2 ~
常用DOS命令
  • 文件夹管理:
    2 C0 O. ~% k  d. X' a) o) \
    • cd 显示当前目录名或改变当前目录。
    • md 创建目录。
    • rd 删除一个目录。
    • dir 显示目录中的文件和子目录列表。
    • tree 以图形显示驱动器或路径的文件夹结构。
    • path 为可执行文件显示或设置一个搜索路径。
    • xcopy 复制文件和目录树。
        p8 V% K+ T" f2 {5 [/ r
  • 文件管理:
    1 u3 y, M5 K, B2 E8 l
    • type 显示文本文件的内容。
    • copy 将一份或多份文件复制到另一个位置。
    • del 删除一个或数个文件。
    • move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
    • ren 重命名文件。
    • replace 替换文件。
    • attrib 显示或更改文件属性。
    • find 搜索字符串。
    • fc 比较两个文件或两个文件集并显示它们之间的不同! K" q, {: K: k$ ^$ J1 H
  • 网络命令:! Q8 f; |! n, V, B3 f, W
    • ping 进行网络连接测试、名称解析
    • ftp 文件传输
    • net 网络命令集及用户管理
    • telnet 远程登陆
    • ipconfig显示、修改TCP/IP设置
    • msg 给用户发送消息
    • arp 显示、修改局域网的IP地址-物理地址映射列表
      0 {5 S  c3 i2 g6 G
  • 系统管理:
    2 v" _9 z0 ~5 t" b
    • at 安排在特定日期和时间运行命令和程序
    • shutdown立即或定时关机或重启
    • tskill 结束进程
    • taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
    • tasklist显示进程列表(Windows XP Home Edition中没有)
    • sc 系统服务设置与控制
    • reg 注册表控制台工具
    • powercfg控制系统上的电源设置) v. p# @4 o: {  O6 D+ b1 R
    8 Q& X9 K5 X9 C% @
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
0 o5 I9 B6 Y, U7 |9 V# ~+ D! O
' v" }: {/ V/ N% `
Windows Batch 常用命令
  ?7 t1 a6 F) Z) j/ ~/ {. U# w1 echo 和 @6 x( o9 C) [' V9 z8 y5 L
回显命令- R  i  D: l- c( l
@  #关闭单行回显' f" H$ N9 P* t% |9 e; i% Q; Q
echo off  #从下一行开始关闭回显4 P7 S0 `1 `0 z3 v
@echo off  #从本行开始关闭回显。一般批处理第一行都是这个% a1 K" t* z: D) v2 ?
echo on #从下一行开始打开回显, \6 i# C, w1 r# v* D) m" t+ b
echo #显示当前是 echo off 状态还是 echo on 状态. S! D! R, O+ a7 `" i" E  F
echo. #输出一个”回车换行”,空白行2 z, l+ u# y7 C7 q5 y% }
#(同echo, echo; echo+ echo[ echo] echo/ echo)0 @6 R% T% l7 b6 f" ]% J# s4 o2 R  ?) S
9 R9 n$ {, N/ z: o; r
2 errorlevel
! D0 H8 V: {: U" oecho %errorlevel%& E. x/ N! R" U9 ]. d- c
每个命令运行结束,可以用这个命令行格式查看返回码$ q8 U  f. L; y% t. E, H; l( M
默认值为0,一般命令执行出错会设 errorlevel 为1
9 G; g. u( A$ ?
  n, M+ l" c) j. w* H+ Y$ P3 dir. m( m% v& S2 m9 R' C$ F
显示文件夹内容  b  S: L+ F' D% b$ M" ^
dir #显示当前目录中的文件和子目录
& C3 H* l* a- c! J, q7 n. g" Kdir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
% V! l% \/ f" @) pdir c: /a:d #显示 C 盘当前目录中的目录% D8 ^( f. t1 c8 K
dir c: /a:-d #显示 C 盘根目录中的文件
+ \  @2 s1 W& q& X6 z4 ddir c: /b/p #/b只显示文件名,/p分页显示
' F* A$ v7 ?# y9 N$ _3 vdir *.exe /s #显示当前目录和子目录里所有的.exe文件) L( `, M6 q" o1 N5 U& S
1 a5 Z$ t6 k0 {8 M+ G5 u+ \& G  |7 N8 S
4 cd* A8 i4 G- \3 `
切换目录1 q" v  o; n, f) D9 a8 M
cd #进入根目录+ J$ Q7 w+ u$ b+ \
cd #显示当前目录+ [- B$ X3 h: I) c6 Y: i4 C1 Y
cd /d d:sdk #可以同时更改盘符和目录
/ ?. Z$ u2 ?7 C% _2 j
0 a2 Y9 x  ?3 p4 S5 md
+ I5 b' O( {3 i2 a( o创建目录4 D4 p% V: i: w
md d:abc #如果 d:a 不存在,将会自动创建中级目录
6 s6 \6 P. T  ~#如果命令扩展名被停用,则需要键入 mkdir abc
8 C( f/ L( S, s* \3 b
; W( e5 `2 e; m7 v6 [# {" g" d) T: K, [6 rd
% K2 i+ b# B: n* K0 Y删除目录0 j+ h5 g9 p, }* {6 F
rd abc #删除当前目录里的 abc 子目录,要求为空目录
  b7 ?0 Q0 N$ ~* I6 n6 Q7 Qrd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
. T/ x8 p# s1 U5 g; L% A$ a2 k' _# F0 `" N+ g7 W2 H
7 del
# I  i% c6 y" Y* h删除文件, Q+ d% x4 A  |
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
! \3 d7 b% n( V$ J9 T5 rdel /q/a/f d:temp*.*
$ T- R% Q) W; {  z' {删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录# M) v" M" F( ?9 x2 O
del /q/a/f/s d:temp*.*
1 N3 i, {/ j9 s) u  H删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
) y: f: Q1 d. T* o2 A7 n  T
; c( \0 j. ~4 ^& a* n; q8 ren: w3 h& J" N3 v7 Z/ m
重命名命令# n  h9 S2 k8 x. L4 K6 {9 ~
ren d:temp tmp #支持对文件夹的重命名
4 K# q, G- ~1 @/ ~1 I; A& {; p
9 cls
7 T0 H' K0 H+ f: \/ K. Z" B& ^清屏. X/ \6 _. a% ~* J- X
10 type. C; G9 N9 A# X$ f
显示文件内容# L4 S+ e2 ^- u+ N! F2 G) x
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码2 o! i, s8 C6 y- l
type *.txt #显示当前目录里所有.txt文件的内容
' _* }  j+ o( z2 \$ `. w9 h# E  R. L. V. H* R- J9 n% G
11 copy1 B7 X& i3 i% h; l/ X0 C
拷贝文件
' N3 S3 W# F; j/ N( m1 {) Bcopy c:test.txt d:test.bak
  W6 m$ R. H4 o7 e* f0 H复制 c:test.txt 文件到 d: ,并重命名为 test.bak" U0 n7 g( v1 E( l$ Z1 v
copy con test.txt, J" _: q; @# _. a4 D
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
2 D+ r6 z5 o8 vcon代表屏幕,prn代表打印机,nul代表空设备) f; V4 l/ d2 a. c8 M
copy 1.txt + 2.txt 3.txt
2 K% i8 N3 k: e合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件. f( M1 F  P: a/ Y* k- M; ~# R
如果不指定 3.txt ,则保存到 1.txt
% l8 b& u6 u! mcopy test.txt +2 D: K' D" r  f0 H9 D
复制文件到自己,实际上是修改了文件日期( i7 M3 g" \  L, b- R; L
# [+ V+ ^" W7 i1 a
12 title
% {; s) L/ H( l! o设置cmd窗口的标题
: u& [% V6 w6 G4 I7 P: e, f$ p1 z# C/ Mtitle 新标题 #可以看到cmd窗口的标题栏变了  h1 e" i" S" L8 }/ C1 Z, }

3 m* _# _1 z* O( n3 Y13 ver
& F- u( o: p( J) S显示系统版本; g5 {5 ?; `: e& r1 ~
% u# j( ?- a3 S. x
14 label 和 vol
( B6 E( J3 X: U/ R5 k% ]) p6 J设置卷标4 s3 I( \2 O4 Q/ P& P6 N
vol #显示卷标0 I6 ]1 G- X, t
label #显示卷标,同时提示输入新卷标
7 f) A: Y, e9 b- q7 [0 Glabel c:system #设置C盘的卷标为 system
9 E4 l; k# @7 J0 R3 d3 L
1 y9 d- Q7 r: F. p. l/ d15 pause
! r& E! ~7 Q: Z- @暂停命令9 X) w. H0 }9 [& U' m
; Y9 b# {( m* w$ |4 V9 t2 d7 E
16 rem 和 ::" j& ~) u- Z% c  T. g
注释命令
5 A+ a: z* z+ m  D* A3 C5 v/ I. l1 e注释行不执行操作
' f: y* D, ^1 \1 f: s1 v3 E" d6 R. K: f* y) h
17 date 和 time8 |* b; ?" x# h/ h. ]
日期和时间& k- g" x1 x3 Z1 z
date #显示当前日期,并提示输入新日期,按"回车"略过输入
) V% E& x6 q$ d$ d# m) Ydate/t #只显示当前日期,不提示输入新日期
& @1 z1 J2 \$ ?8 [time #显示当前时间,并提示输入新时间,按"回车"略过输入
% u% x5 k0 B( vtime/t #只显示当前时间,不提示输入新时间
" g' U- |- N( c( M/ S; ^9 P
% x. `& {1 Q$ }18 goto 和 :
, \- F! H  [0 _跳转命令
9 O- r0 A) ]! ?0 A$ G:label #行首为:表示该行是标签行,标签行不执行操作
0 \; B. v4 [+ bgoto label #跳转到指定的标签那一行4 N4 w6 w) V2 H' t/ u' Y

, y) n7 w: G9 w" d19 find (外部命令)% |/ d% u" {. u
查找命令
! I* ^! y+ T: r- N: H: Mfind "abc" c:test.txt+ q8 ?6 d3 Y& o6 t5 R. R
在 c:test.txt 文件里查找含 abc 字符串的行
: D3 s1 w' {: u如果找不到,将设 errorlevel 返回码为1
1 k! }! ~* V0 {  |" w5 c+ P7 ?find /i “abc” c:test.txt2 H, V$ |+ B* V! P
查找含 abc 的行,忽略大小写
  r0 H# t) H, H( U: B+ `; L$ @0 N: Cfind /c "abc" c:test.txt5 u: }9 z. u, M9 ?* ~
显示含 abc 的行的行数
, e% w1 E" p& k$ l5 q: ^
3 R% M; C! A7 r) R, w7 \20 more (外部命令)
9 c3 J2 ^* {+ }, T% {$ z7 @8 o逐屏显示# n' h, n0 u$ Y' J% B
more c:test.txt #逐屏显示 c:test.txt 的文件内容9 D3 u* r1 R( W& |
2 X' L# W- V, E: k4 _: X9 f
21 tree* \- x# v$ C9 }* C0 c/ h, W# R
显示目录结构3 A7 i# W; ^5 b# p
tree d: #显示D盘的文件目录结构
% d4 c0 W. C; f" ^0 b( c
, A! o' K) Y4 U0 ~6 s. H22 &
6 \/ J0 J! z( t" [0 N* e顺序执行多条命令,而不管命令是否执行成功  I( [, Z3 h5 Z: r; p
3 y4 y: K/ U# z. M- \9 Z" C0 z! p
23 &&2 x) h7 F) u* _! ^" K5 ]
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
, B# w' y7 R- y8 F* @6 L* pfind "ok" c:test.txt && echo 成功
1 e2 g, ?7 c1 K8 b/ {  Z7 a+ Y0 z( M如果找到了"ok"字样,就显示"成功",找不到就不显示2 W: e. T1 h7 Y+ P' Q
; M; w' g. |* W
24 ||
4 d5 j  A0 l9 u; e. T% k) M顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令$ W  m& r1 J- H7 {0 i# z
find "ok" c:test.txt || echo 不成功8 K; Y7 @" l- @$ i  [3 @
如果找不到"ok"字样,就显示"不成功",找到了就不显示
- I4 ?! t- u/ M: n4 ^
3 v4 F$ y" K3 Z1 R0 h25 |
: |) L8 \" L" N5 l3 v管道命令
# `# C! @! ~  L/ Zdir *.* /s/a | find /c ".exe"8 d' E: B, u0 g# o5 ?' }0 n
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
; M! v6 i& w4 F% y6 r该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
' Z- j4 M/ v/ t# d, U- Z2 h! Otype c:test.txt|more% \' H6 [# L' b8 r1 t
这个和 more c:test.txt 的效果是一样的7 u; K" ^- X" L# C9 T' T
' k/ c6 k# g/ A% Y, M
26 > 和 >>
0 f3 D! c0 m3 ~. c/ T输出重定向命令" r) C4 p( I; {$ I& N" s
> 清除文件中原有的内容后再写入
, o0 z9 C% c1 q>> 追加内容到文件末尾,而不会清除原有的内容& B$ p; D- K: _& c" e4 ^; }% d
主要将本来显示在屏幕上的内容输出到指定文件中- F: z9 d; u7 ~6 }2 O
指定文件如果不存在,则自动生成该文件
' t* g% Q# x0 r  ~2 y" f' ^type c:test.txt >prn' i$ a1 [/ ]: x
屏幕上不显示文件内容,转向输出到打印机
; g& F) S& g* g: }; N  y  D0 {echo hello world>con2 O) R! l8 X/ ~+ z% j9 H
在屏幕上显示hello world,实际上所有输出都是默认 >con 的
" i1 S( u: u2 X. ucopy c:test.txt f: >nul
4 |& L& y- k' D4 Q拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息* d- V6 u# q) W# N. F& o* o+ Q1 X
copy c:test.txt f: >nul 2>nul0 s/ Z" k1 W+ H$ O
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
" w( l/ f, A# R* N) z% zecho ^^W ^> ^W>c:test.txt1 r! j5 C# ^/ G
生成的文件内容为 ^W > W
& i+ _2 A% \' i) a* C+ ~" S^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
9 A# s5 E) [$ ]* D$ f+ z4 G/ e: U/ I
27 <8 _6 H, ?4 [4 G3 G
从文件中获得输入信息,而不是从屏幕上
1 {% D$ F' L& a3 j一般用于 date time label 等需要等待输入的命令9 t- j' y4 [4 n2 U! ]+ ]7 i* m
@echo off
3 m7 l! T$ C3 ]. K' v# o1 wecho 2005-05-01>temp.txt: o9 r7 R! g! L1 S8 i' |
date <temp.txt9 I% C/ T: t: S
del temp.txt7 P3 v1 T+ \; H/ F6 H
这样就可以不等待输入直接修改当前日期3 z1 `+ r# Z" J$ Y

1 c+ b: {8 B' x/ S( b" `28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*" a5 }  `, u& i; D' i3 n* R' a
命令行传递给批处理的参数
- N' u# H! P/ n) q( c% j/ V%0 批处理文件本身% H# D2 A* d7 C8 A
%1 第一个参数( b2 W. m: z& Y- q
%9 第九个参数  t# k) d. V" _, ?: G% F5 C6 O4 ~
%* 从第一个参数开始的所有参数
2 j8 ~5 N' E* T% A- F* E$ @* _5 ?批参数(%n)的替代已被增强。您可以使用以下语法:- `& _2 @5 l5 {- ?7 U
%~1 - 删除引号(" ), 扩充 %1
! P: Q2 V) V" g, d. C- b+ J%~f1 - 将 %1 扩充到一个完全合格的路径名/ P/ w/ [  _' Y6 S8 e0 v
%~d1 - 仅将 %1 扩充到一个驱动器号8 u# w. F' f+ {. x
%~p1 - 仅将 %1 扩充到一个路径* z# Q7 @' v/ n
%~n1 - 仅将 %1 扩充到一个文件名
2 n3 B( n) G/ n1 L%~x1 - 仅将 %1 扩充到一个文件扩展名6 y3 |* |. a7 i+ L& t8 @) |
%~s1 - 扩充的路径指含有短名
6 J" E1 `  v; j, I5 X0 |) V%~a1 - 将 %1 扩充到文件属性4 `" F! s* }5 G/ A& {" `1 {" K
%~t1 - 将 %1 扩充到文件的日期/时间4 f" `+ G3 p( @+ _6 C: f; c' I
%~z1 - 将 %1 扩充到文件的大小
( E( B* k. {# x6 L# B4 S%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1/ `$ b/ H4 v" f
扩充到找到的第一个完全合格的名称。如果环境8 `; W; V2 {$ D1 d* P- O3 N
变量名未被定义,或者没有找到文件,此组合键会
8 \7 k+ Q& F* U6 I& M扩充到空字符串
7 V" o  w" Q3 m" G7 p+ R( T6 \5 ~可以组合修定符来取得多重结果:9 P9 t; g+ U+ I7 D
%~dp1 - 只将 %1 扩展到驱动器号和路径
! p, \* i5 Z" l( U' |%~nx1 - 只将 %1 扩展到文件名和扩展名  W1 C$ l7 O5 U8 v5 n6 j
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,/ r5 N1 [! X" d
并扩展到找到的第一个文件的驱动器号和路径。" ^  }9 B5 u, M: A* F/ V, z' F. l
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
/ B8 F0 }8 M4 l; A3 F9 H/ J可以参照 call/? 或 for/? 看出每个参数的含意
# m& U. G6 L$ B2 necho load "%%1" "%%2">c:test.txt
: b8 n: l# {9 |* i) `  B% M生成的文件内容为 load "%1"  "%2"! h" F' K! u* c2 J* h8 C. J2 l
批处理文件里,用这个格式把命令行参数输出到文件; s; E% }; c- L0 ^: s
) ]/ |/ ?. a+ u, A0 L  I2 \4 _
29 if- q" _+ F/ k3 j, m
判断命令
9 A+ B3 q4 h* O6 r' mif "%1"=="/a" echo 第一个参数是/a
1 n/ e4 I, j! }1 @if /i "%1" equ "/a" echo 第一个参数是/a9 j' M9 t8 w- P- s( _( ~
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?$ e9 v( J( e1 c8 `" q- E( Z
if exist c:test.bat echo 存在c:test.bat文件
' B9 ^; |  X$ A, ~+ Qif not exist c:windows (
' T% Q, c: z2 F' k9 ^echo 不存在c:windows文件夹5 h5 ]& p+ |7 |# @  w# @, P; z7 ?8 N
). P* c! ~+ T$ [( ^1 C+ |
if exist c:test.bat (( o# z+ n# o5 L9 K2 q
echo 存在c:test.bat: M) t3 a+ L% E& F9 G
) else (2 m- t' K% ]* R; J' t4 Z
echo 不存在c:test.bat$ w7 f  C( o. a& e7 Q2 X( w  Z
)
' r* t! Z/ [! X, l; K30 setlocal 和 endlocal
  \+ X7 q9 I2 i( W* `9 N; [0 Z设置”命令扩展名”和”延缓环境变量扩充”+ [- `; f& e& a0 T" W) l+ x% B+ \
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
" h. y, v  M9 x- l3 hSETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"% l9 U; }# G% b4 d8 D$ f
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"4 ^# c" V* q3 o# Y  i! y
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充", S! s0 c9 F% t; I$ C2 u
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态8 ?: W1 h, ]$ l/ t
“命令扩展名”默认为启用
# v1 D- l/ A8 _“延缓环境变量扩充”默认为停用3 I% W- I1 r! `/ ?% I7 |: p
批处理结束系统会自动恢复默认值7 j1 o' l' C) h( {% v  |9 E$ q
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程3 w9 o" u1 j" j* i& y% F
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确# B3 u6 G/ G4 B2 M, r/ {
保程序能在其它系统上正确运行% e' C0 U3 m* \; W
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
; ?, I7 f' m# c; W  F/ t* c4 z! [& _" Q5 l+ |1 B2 H6 I% ~
31 set
4 m! M/ C$ Y+ e! p$ f设置变量
5 @5 ]9 w, s% D. T" x; b引用变量可在变量名前后加 % ,即 %变量名%
! U% e5 E3 X, B" I5 ^- |set #显示目前所有可用的变量,包括系统变量和自定义的变量
* ?4 |& y3 B' G' [/ lecho %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
' A3 }; s8 S2 Wset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
: a# ?7 z' G& Tset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
/ ~0 X. N1 v" ^6 Wecho %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
/ q3 B. \! i' l' w5 a; pecho %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
1 C; [- _) N% c8 secho %p:~6,3% #显示第6个字符以后的3个字符,即aa2+ l* l, n) Q8 R& l0 H7 |" b
echo %p:~0,3% #显示前3个字符,即aa1
$ t4 ^5 T/ r* D% S: a. A2 Hecho %p:~-2% #显示最后面的2个字符,即b2( L/ V( {1 n! n% d, |' v' G0 {5 U
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
+ y: ~- h7 E' [7 k7 Y+ ]echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
+ \( \# ^- i$ d6 _  V* R8 Wecho %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb26 P# C' ~9 [1 X* p) W; V) Y5 C9 R5 t0 f
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
, `( O9 @! j6 m$ L# Q$ F, sset p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
% ~7 |7 c9 ]  U) u: h3 Vset /a p=39 #设置p为数值型变量,值为39& ^6 a; j- X/ G& q9 z
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=33 l# a8 n; ^$ T
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用6 {/ n4 A& R7 h0 s* ^' l
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?3 k# }8 z7 d  H+ @0 C2 W
set p= #取消p变量
, B% t, R2 o+ |set /p p=请输入
, ?5 I: u3 E$ d8 G' X% \  z* C- Z3 q4 m8 @屏幕上显示”请输入”,并会将输入的字符串赋值给变量p& D4 r' \2 k% p  N  t
注意这条可以用来取代 choice 命令, y$ A1 e  @  W5 f- p" c8 Y
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
) R1 x$ z* N- Z1 l% s2 \, `@echo off
8 M$ Y! ?4 \! p: R( G$ U( A/ Nset p=aaa9 `; L; Y5 k& r3 O8 }+ ?3 E
if %p%==aaa (
2 |5 @# I+ ]2 D+ V& ]echo %p%
+ J: B6 e/ u5 B! S; |9 Pset p=bbb  Q7 e) n; E$ k$ ^, f, H4 o
echo %p%. [1 T- j/ M3 t/ @' X
)& R9 i4 T9 i" x6 F, h3 ^) I
结果将显示! _2 ]# `. w* y
aaa2 m: w. e$ {. o1 y  g6 u/ X  a
aaa1 Y5 o- r/ e( s  y1 x) U: c
因为在读取 if 语句时已经将所有 %p% 替换为aaa7 L0 {6 o) b" q$ b
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
6 E1 T0 i+ g/ `; I% v可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
1 b7 {9 u  r1 h# `6 A; V$ u@echo off
, l( l( a# c3 K% n. }SETLOCAL ENABLEDELAYEDEXPANSION
( C9 Q) |5 A6 T+ u2 Dset p=aaa* K, O& C) H. W% c5 B) r4 I& j
if %p%==aaa (* A3 D% e* Q  K0 X
echo %p%- c8 Z) i5 \2 S  A% h; c) B7 N
set p=bbb6 E; Q9 b0 k7 e: ]% _
echo !p!7 q; \7 K5 W) D' y& V
)7 K) u5 ?- G$ L8 r
ENDLOCAL
# \" K& c( o2 o/ K  G$ K结果将显示
/ L. T) t% l1 q1 ?aaa5 _) u" m4 d( u# O( Y$ R0 g& k5 x
bbb
2 C$ v5 r& l, C8 l  w1 u; r还有几个动态变量,运行 set 看不到) l1 {% y+ ^' j# a
%CD% #代表当前目录的字符串
4 P1 K  E0 E! R3 y/ n%DATE% #当前日期
" Q0 ]7 D- c- v6 e%TIME% #当前时间* z( `4 `8 f! p* O& y* `+ o
%RANDOM% #随机整数,介于0~327672 ^8 J% a, T% J) C
%ERRORLEVEL% #当前 ERRORLEVEL 值
( h3 F$ u0 d; ]- J0 T# V- n! P%CMDEXTVERSION% #当前命令处理器扩展名版本号
( X& o/ [  m3 z1 `7 F4 S%CMDCMDLINE% #调用命令处理器的原始命令行# D- Y2 V: g, z' Q0 z; ^
可以用echo命令查看每个变量值,如 echo %time%, Q/ G: I: {$ ]1 X% Z3 [
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
9 x+ l6 R% [4 l$ b# [# X6 Q
& p! |6 q( h; b' J32 start
/ p1 l7 e: [  a; g9 ?批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令% `) }1 R! K% x' u
5 F8 k- v2 K( d/ W0 k1 L) }
33 call/ S  ~- P+ ~5 V- n
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行9 D& ]  F4 J! X& V# D& C# S6 o* S
有时有的应用程序用start调用出错的,也可以call调用% D: A" Z2 r4 e% l

( J6 m$ I, s: F( M& Q  {" t! T34 choice (外部命令)7 f; ?9 R- \1 b: G! f$ {- \2 y
选择命令) ^7 N" Q5 h$ _
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
' k! ~$ U- o. B) G8 D: T1 fwin98里是choice.com
+ A; P' d. J7 D8 J4 J6 ywin2000pro里没有,可以从win98里拷过来
* {# K  f0 e( c) Vwin2003里是choice.exe) _6 V. n$ H2 C. Q
choice /N /C y /T 5 /D y>nul
3 P5 c! G8 I7 a7 V$ S7 I% v延时5秒
2 Z. I$ Y9 p( b' r% W3 g' v6 x- v# V
35 assoc 和 ftype. ^- t" W( s) [- ]1 ]5 {& ^9 M
文件关联
2 C8 S1 ?1 h/ v4 w& iassoc 设置'文件扩展名'关联,关联到'文件类型'
  M( i* H5 R: k3 ^) Z2 nftype 设置'文件类型'关联,关联到'执行程序和参数'
) s) g% m' Y7 ?  ?  K! n# v( K当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开5 N6 j% ^5 X' \5 r% p) ]. d
而是先判断.txt属于 txtfile '文件类型'* P& e# g+ v8 a
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
7 Z% |. A# F* u5 W$ y可以在"文件夹选项"→"文件类型"里修改这2种关联
, u( K* g# e+ F: ~4 E5 P: D9 R$ vassoc #显示所有'文件扩展名'关联
7 J3 J3 ]5 h; Aassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile1 r  O+ i- k# q, U4 t6 D1 g. z' D
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8: {$ P) C( h  |3 V' }
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile* ~% \" i' V) H
ftype #显示所有'文件类型'关联
1 W3 H* O- I( }$ }9 N) \; _! [ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*$ w4 \! N2 p0 C( x
assoc .txt=Word.Document.8) h; u& s, @5 q5 D. C  {
设置.txt为word类型的文档,可以看到.txt文件的图标都变了
0 ~* r% {- j7 s$ K$ E0 ~) H" |# Z: wassoc .txt=txtfile  }- d7 N# o9 Z! J% u% N
恢复.txt的正确关联+ R+ s  u  I7 w* {
ftype exefile="%1" %*
- z6 ]6 D# t1 h% G7 I* a# r6 n( p恢复 exefile 的正确关联
: w6 a- U  M) [# _7 `# v9 V! Q如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
. T9 C  i" Z  ?$ c/ V( a2 A8 m) O  J6 o# I5 h8 q2 X- |
36 pushd 和 popd
3 O( p- j; a: v8 y切换当前目录
- g6 _( q+ U; X* ^- z@echo off( U: ^* Z6 C+ `: z- d  ?* X
c: & cd & md mp3 #在 C: 建立 mp3 文件夹
9 {9 ]! T* ~2 r; vmd d:mp4 #在 D: 建立 mp4 文件夹
% \0 l4 r; a. g" D  j6 o% `cd /d d:mp4 #更改当前目录为 d:mp49 d2 C; m" C! s( i/ y
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp34 D7 b9 Y0 ?: A# g: b6 n9 v# B, o
popd #恢复当前目录为刚才保存的 d:mp42 E$ i/ q+ e4 @7 J7 B6 @' Q' j4 G

6 }% J" \! L" L% U" Q# j37 for
& U7 N- g7 J% T4 v5 E( e: U循环命令% ?# o  W# q; m
这个比较复杂,请对照 for/? 来看
8 D3 J! N) ^1 ~* u# g2 cfor %%i in (c: d: e: f do echo %%i
2 h- F1 z; C; u2 m* k依次调用小括号里的每个字符串,执行 do 后面的命令
, S3 e& U  s  s+ ~9 r1 M注意%%i,在批处理中 for 语句调用参数用2个%2 _+ a' U5 y1 z8 ^7 h! h
默认的字符串分隔符是"空格键","Tab键","回车键"3 f- P) K1 R+ j* ]# u/ c
for %%i in (*.txt) do find "abc" %%i
2 M. i3 S3 ~+ z6 F& B% n. P3 U3 Y对当前目录里所有的txt文件执行 find 命令
% n" }( z$ T: a5 d9 ?for /r . %%i in (*.txt) do find "abc" %%i3 |) ^8 S" @: x: i/ V
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行, C8 Q' p" e9 E& |* R6 E7 ]
for /r . %%i in (.) do echo %%~pni6 |9 U- ~- M. N
显示当前目录名和所有子目录名,包括路径,不包括盘符1 m! L6 ]9 R- r: s# A. h: ?# [; Y/ K7 y
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt/ B9 \) `0 {' g  W0 U: K; i9 N9 e
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
" y9 ^' P# h2 ?5 x3 h6 Kfor /l %%i in (2,1,8) do echo %%i& V" o( c- a' q6 {
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加17 E+ x1 y7 A* _$ z, K
for /f %%i in ('set') do echo %%i
3 S& `0 k0 q- F3 \" n3 u" u/ I9 d. s对 set 命令的输出结果循环调用,每行一个7 Y& B1 g+ U& {6 ?, s- s9 n
for /f "eol=P" %%i in ('set') do echo %%i4 ~5 s- I* Z1 \0 L3 ^+ j% X; o. w
取 set 命令的输出结果,忽略以 P 开头的那几行( m4 F2 y0 ]$ ^. D, k# `0 p
for /f %%i in (d:mp3.txt) do echo %%i  T5 g/ T1 C4 K+ t; s
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
) b4 ~( a2 g3 Q; [. j4 Jfor /f "delims=" %%i in (d:mp3.txt) do echo %%i& a7 f, u  {: q; o" C
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
1 t8 X1 W' ^' ]1 `2 o; z- w$ [for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a6 X. |- X( e5 v1 y+ X$ G
对 dir 命令的结果,跳过前面5行,余下的每行取第4列
4 C( c, P# k- d. e8 L每列之间的分隔符为默认的"空格"
" M2 h' F& f) b5 Q; {可以注意到 dir 命令输出的前5行是没有文件名的! v7 z( d. r5 O( G
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
  V/ v0 M9 J! p, {8 U9 Z* A/ N! hecho %%a2 {$ m9 b) V3 m) ?9 h5 k  d3 m
echo %%b
1 B/ {. X+ i! c: A' H* yecho %%c
) N0 a8 U6 T, t5 `)! l. |: l+ `6 T% l; q" g0 H
对 date /t 的输出结果,每行取1、2、3列
% H( k7 k8 Z1 N' @# ~! ^& W第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
3 W$ `* V. r3 P7 B分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"/ Y: X) h. R+ ?! ^
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
, ~3 A6 L6 C7 M& J* ofor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b2 M  q, D5 l- n0 @$ ~$ B% @7 a& x
取第2列给 %%a ,其后的列都给 %%b
8 `( l  ?3 _9 w+ |' V6 l. q  c" c  r, t" J
38 subst (外部命令); [4 j! v, G+ d
映射磁盘。
$ ?9 z9 K9 c: Esubst z: serverd #这样输入z:就可以访问serverd了
! a2 [* o, g' H" v/ _subst z: /d #取消该映射
# y" b- D1 h. g% ?0 Isubst #显示目前所有的映时( v4 W1 A' ^* {4 i$ |
7 `4 g7 ]  N  G6 [$ z5 \3 L
39 xcopy (外部命令)
) w% v) ?. Q/ p& H& o/ D' Y文件拷贝& V* M9 b3 _. R
xcopy d:mp3 e:mp3 /s/e/i/y
6 q1 _2 y+ _8 o! @0 F# c; M复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
7 {+ O0 G& |2 Q( V0 H% ?8 w加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
$ T3 m0 @' m. U, N# U5 C0 M; F
4 m; o& [- _  X8 f) q- ~6 ?4 I常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
    ) [2 t7 \0 W+ k$ d7 N! f' e
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:! j" _! Q# x, W6 G2 \
    ! B  H" C) \3 ?: D. u: p3 y
@echo off
% p4 i. Z1 W, k4 T, [' Q  p, rset p=aaa, o) e" ~0 d9 g1 Y/ w; p8 Y; w) }
if %p%==aaa (
0 }9 U7 a: d6 Z$ H4 ~' h" J  ]echo %p%
7 O* W' F# u0 x. |. I3 Cset p=bbb/ o; H/ \! z4 F4 U& k6 p( g! u
echo %p%
# [1 `- S% B3 F3 w2 B8 ]. U/ o)( C+ `* X, h7 J
pause
  • 截图:
    8 A" |; n6 V. A$ X4 M1 \2 t. a
  • 2.批处理.bat 文件中输出中文乱码

    " C+ a0 }4 Q% t( ^/ J* k0 s
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:
      - U" N3 Q3 L7 I
    • 效果截图:- G7 W; B) G# j* S0 P
      8 o7 ^- A% i3 J9 [
    ( Q3 o3 X8 p5 g) E8 u4 F$ B
; k6 U, [0 P1 z( n

本帖子中包含更多资源

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

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

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

GMT+8, 2026-8-16 17:52 , Processed in 0.217019 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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