扫一扫,微信登陆

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

搜索
查看: 2015|回复: 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 文件中输出中文乱码
  • 解决方法在文章末尾!/ |1 P" M' f/ _
前言
  • 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效
    ' v- U' u  V8 p( U* Y
在Windows中善用批处理可以简化很多重复工作
什么是批处理?
  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展" X! C( K( Z/ u2 b% j! y
    名为bat
  • 目前比较常见 的批处理包含两类:

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

    . c% N- I5 {% ^  l
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
) n2 X# y" u. e
/ o) h! L  G8 u: k8 i( K; z2 x, s
Windows Batch 常用命令
! a3 V/ ]1 ^4 i$ ~8 ?! u# E1 echo 和 @
, [6 {  }% T' s+ A; Q回显命令) o, b/ X) M+ C+ a! n( q  x6 t$ G
@  #关闭单行回显4 i: B. Z9 {# {9 E+ Q
echo off  #从下一行开始关闭回显# |  x2 W  f$ U. ~' m6 Z8 f3 @
@echo off  #从本行开始关闭回显。一般批处理第一行都是这个
* J3 I7 [& }0 f7 s, g# m) hecho on #从下一行开始打开回显
* W+ x9 h  X/ Hecho #显示当前是 echo off 状态还是 echo on 状态' q* C( f9 X( Q, M: T+ p- }
echo. #输出一个”回车换行”,空白行
% g4 e+ K/ V5 |8 v" N4 E& F$ b#(同echo, echo; echo+ echo[ echo] echo/ echo)  V8 x4 Y( \+ |1 V( ]  n

+ {! Z% ?/ N" t3 \6 g6 b2 errorlevel
2 k* f: F- f3 W7 [& qecho %errorlevel%
: h6 t$ t4 T' \. O5 m3 G: s每个命令运行结束,可以用这个命令行格式查看返回码! T/ ^6 V4 o( o& g: v- `: l
默认值为0,一般命令执行出错会设 errorlevel 为18 I7 D/ q. R. w; t4 L& S" ?
$ U( L6 P( r1 v; b# R
3 dir5 E5 y2 n# G! k* r% ~' r  m
显示文件夹内容: T2 ^4 l5 S" o1 f, d
dir #显示当前目录中的文件和子目录( k  I0 d3 b' |* _* P7 b, D$ f
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
' b8 y' |2 N( m! _, j! ?dir c: /a:d #显示 C 盘当前目录中的目录
# d% H: W" L. g% xdir c: /a:-d #显示 C 盘根目录中的文件
5 N3 b6 ~$ _; M2 o$ Y- adir c: /b/p #/b只显示文件名,/p分页显示( N% O9 u! M+ F/ \) I$ w; p* L
dir *.exe /s #显示当前目录和子目录里所有的.exe文件
+ e' p! U9 n$ d. h/ K: d0 ^! \5 d1 C5 @3 e5 i( R
4 cd
: P) r+ \' {7 v0 d切换目录8 a* M' K+ W' }% H
cd #进入根目录. Q1 l) r, w& V
cd #显示当前目录+ L6 ?  D7 h. d& y
cd /d d:sdk #可以同时更改盘符和目录
3 l  e) U& S( o3 g& h. J# {" N, V' C% \
5 md7 }( l" P# D- [$ y$ T) C" w
创建目录+ e' ]8 _' x6 W+ l
md d:abc #如果 d:a 不存在,将会自动创建中级目录
1 |8 e3 _7 s/ m! d$ t#如果命令扩展名被停用,则需要键入 mkdir abc0 i1 |. W2 q1 B1 T4 X
/ j; Y# p1 a* o& e
6 rd
7 A0 V8 ]$ S$ B1 a; J删除目录
0 ?! l# f% Y# h3 P5 b- Mrd abc #删除当前目录里的 abc 子目录,要求为空目录& a% ?' n1 {6 Q; i2 i0 `
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式  r; J( ~+ K8 w: J
" H+ x' U6 U) D. x  y* _
7 del
# u1 v* P% F( Y' Z删除文件" ]& @5 v; D3 [% q7 F
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
: \/ ~( _: z' {/ x# F- R( |5 ~$ a( _8 udel /q/a/f d:temp*.*
. P' h) L7 R( w5 R: t0 x删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录& V7 A$ i% `: K- D# H
del /q/a/f/s d:temp*.*
+ A# S* j+ f  j0 M  Z8 C! w; W删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录: a( d: B) Z( @" {) `

" D; U3 L' g$ c% l4 N* Y& C8 ren) a' \  v- s4 f/ z5 u: j
重命名命令
/ x7 t) d& Y, ]& R2 yren d:temp tmp #支持对文件夹的重命名
" J4 `; N$ b& h, o) d# l( n& d. h, L
9 cls& ~7 b9 A; F7 O* _
清屏
& D- i& ?  B  q! Q10 type( M" H3 V4 L9 a% ?+ [7 E& v
显示文件内容, v0 ?! M; ~% m  y# N
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码/ y- r* d4 z* R, p  O
type *.txt #显示当前目录里所有.txt文件的内容7 K# z/ |- P* a! W% k
. h$ y) @4 u6 d7 E) o+ {3 k
11 copy
- _; c! o, J, ]拷贝文件
" K: o! e3 o$ V3 f" D9 P7 Fcopy c:test.txt d:test.bak& ?1 H3 Q. z2 M/ D0 r% L
复制 c:test.txt 文件到 d: ,并重命名为 test.bak8 k) o! E( j. t5 b$ i+ C7 ]) h2 z
copy con test.txt
3 L3 Z2 X9 ~, D8 b4 c: a! P- P从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
# ?* T  N5 N1 N4 D4 O+ a* }con代表屏幕,prn代表打印机,nul代表空设备% y# ^# I, O  k7 n
copy 1.txt + 2.txt 3.txt2 S/ j! t2 D. ?% G" T
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
$ S0 ^' |2 N+ j2 e. b; V# J如果不指定 3.txt ,则保存到 1.txt
4 X. r/ }" [5 N5 N' |# R  pcopy test.txt +
9 O7 O: x' i9 L( j9 [复制文件到自己,实际上是修改了文件日期6 T- p" f4 a9 w( {( \4 Z6 ~

! X) Z7 M1 ^) B$ V12 title
8 B3 F; w- s/ H& C5 D* ]设置cmd窗口的标题
  D( f6 Y, ]$ q# D8 ]' I& c, Qtitle 新标题 #可以看到cmd窗口的标题栏变了- A0 g. z8 Y) k% }: F' F- J* D5 c$ m
% |% \0 j* ]* v7 o6 L! K% D" k
13 ver" |9 m& Z, W  P8 t
显示系统版本
2 X) b6 g+ J/ n: j& ^3 m- ?. |/ A$ K: o: K7 B3 m% i
14 label 和 vol: d* g9 o$ k' t- F3 Z3 R3 @
设置卷标
  y3 p/ x: q' d4 N( Q5 }2 gvol #显示卷标
! Z& a; Z& n# p# o; `7 M0 w; Tlabel #显示卷标,同时提示输入新卷标  e; m& `7 Q' z* x
label c:system #设置C盘的卷标为 system. s6 a& {( X* l/ ~: r: k
. q6 Y5 f4 {& @( j
15 pause
  W- U/ k/ p/ y( T8 d暂停命令
7 ~. M% ^& }& w* [1 g5 h
7 [  L# g1 T3 `6 s# E# I16 rem 和 ::# P: A! Z# g8 J5 W1 \
注释命令
' b3 d' s! P" H注释行不执行操作5 G! T# G$ L- {5 l8 C! U0 ?! j; j0 Y
2 R) J  l. j! Q/ R* r
17 date 和 time
4 G. g) \: t) B5 l" o日期和时间
0 R2 {& o' ~$ Y2 |8 V. vdate #显示当前日期,并提示输入新日期,按"回车"略过输入
+ R; q4 B2 q8 u0 c! L( m" }date/t #只显示当前日期,不提示输入新日期
5 ?# m3 e' u( t2 }0 ptime #显示当前时间,并提示输入新时间,按"回车"略过输入
3 k! K$ P) R0 m3 H+ gtime/t #只显示当前时间,不提示输入新时间/ A* V/ V4 u# S2 \& w

9 {5 ^5 ?3 y9 x8 S% v18 goto 和 :
# `0 w5 u, R! {  H跳转命令
! `! l- S5 X/ p' }8 J:label #行首为:表示该行是标签行,标签行不执行操作
& v" p; ]2 j4 X. n3 egoto label #跳转到指定的标签那一行& V: U& w! V+ D" k8 j

1 z* h+ Y, j* _8 M) [+ @8 ?19 find (外部命令)
* w* Z# Y% \0 C9 _查找命令
; N4 K8 v- ]* I2 d( s6 N2 b+ ffind "abc" c:test.txt
3 x- Q+ c' a9 e* a) X* q3 c在 c:test.txt 文件里查找含 abc 字符串的行
7 x2 X  O8 N: g1 Y4 Q如果找不到,将设 errorlevel 返回码为1, }# u. h8 Q# x3 [
find /i “abc” c:test.txt/ w: e7 G* N0 U+ r( R, L
查找含 abc 的行,忽略大小写# f8 f( j7 k' k6 Y3 u/ E; |- s
find /c "abc" c:test.txt
( S0 @7 g$ Z* ]! |. V4 g. {显示含 abc 的行的行数
/ z' K$ q; I* X* a# j
6 j, @9 W  v3 Z4 R6 `5 r20 more (外部命令)4 e% I5 r$ s5 w$ Y5 o
逐屏显示# Q1 p$ V0 W& x2 t% C) \
more c:test.txt #逐屏显示 c:test.txt 的文件内容- @! Z* \& I; r0 q" u8 j' s( x
/ a: Y" T5 Q2 k- i5 q' [1 ^
21 tree: @! H6 a1 U1 i: v6 v5 ?# T: V) b
显示目录结构
, y7 [4 M, Y# i/ l6 `3 utree d: #显示D盘的文件目录结构
; p/ ]" X* w/ [) x2 w7 F1 C
, [, b. L( f: Y& A9 B* |6 ?22 &1 g2 k! n6 n4 s
顺序执行多条命令,而不管命令是否执行成功" L3 t; i, e1 w- e* _) R9 h
2 N, I0 F" C1 J  ^& e
23 &&6 X8 K. T/ h3 A1 u+ W) N( d. D6 E" d
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
" b+ H- T- [' }find "ok" c:test.txt && echo 成功1 h7 w# W: g5 D# ?
如果找到了"ok"字样,就显示"成功",找不到就不显示
/ D0 n: k; j& x; Q/ `
# B* Y! t7 K! U  N24 ||
) b8 D8 ^4 {7 S9 O: w& T/ M顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令0 ~6 C6 _& h$ L9 l, |0 z% a1 C
find "ok" c:test.txt || echo 不成功
4 J" k& X3 Q- K0 o3 V; Z如果找不到"ok"字样,就显示"不成功",找到了就不显示
3 B& p$ s$ v+ E0 |4 z) X8 F0 S* x0 q6 a& G2 \
25 |+ ?7 K! S* N4 b& @) l7 I
管道命令
7 f8 q" P5 ?( t# H6 x1 h; Rdir *.* /s/a | find /c ".exe"0 `6 c* N/ m/ y3 k2 r
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令+ w/ b: s+ O- c! f
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数* ~5 E' S! o, u1 X4 u9 |
type c:test.txt|more! S) c4 z7 E% S. s
这个和 more c:test.txt 的效果是一样的
+ U) P9 L- j. H/ f) e! }3 L; U6 S
26 > 和 >>8 T+ ]- ?) n# |" P8 h0 i! @
输出重定向命令
! {/ n& S' f' J: O1 K> 清除文件中原有的内容后再写入
! F+ Y# p8 Q+ B; X5 q/ P>> 追加内容到文件末尾,而不会清除原有的内容. I2 z4 z* S  m6 b) g0 p  p
主要将本来显示在屏幕上的内容输出到指定文件中
3 w, c/ \7 N$ @8 H指定文件如果不存在,则自动生成该文件
0 M$ ]2 R; ^: P+ V' Z) F8 jtype c:test.txt >prn
8 o3 s- K! {, Y* T0 r屏幕上不显示文件内容,转向输出到打印机
% [8 i+ i' g! j& Y, z) yecho hello world>con" J% H% F3 l! U0 K% K
在屏幕上显示hello world,实际上所有输出都是默认 >con 的
6 [* b, ]: s6 O/ O$ tcopy c:test.txt f: >nul' X0 W3 q  ]+ o4 N. ~3 \9 C
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息0 `- o# `' J5 }; j, m8 A( V
copy c:test.txt f: >nul 2>nul  J+ V5 n% T. Z7 O8 C
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
9 [6 r5 R( A8 J# Techo ^^W ^> ^W>c:test.txt
' n4 z: P9 N7 n- P- B# l0 s生成的文件内容为 ^W > W  ^2 G/ U  u( ^$ M9 D1 |
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
$ ^3 R& Z9 T5 S' e1 C: {$ w$ k+ i  {$ S7 w0 o
27 <
0 B3 u! c4 N) ^# e. [1 D从文件中获得输入信息,而不是从屏幕上3 x$ ^/ k4 \5 s- T  _! J( z! H
一般用于 date time label 等需要等待输入的命令2 }/ `' A" Z1 D5 h/ E% `; l2 x
@echo off
! c9 ?4 R. w0 [4 D5 ]! necho 2005-05-01>temp.txt
* h) ~( H" y1 K4 Ldate <temp.txt! i* G. |( ^0 g9 q# z6 R
del temp.txt# z& a# Z: T+ U+ K" u6 V3 e& r
这样就可以不等待输入直接修改当前日期
- i) }0 l7 t: h. ~
- Z, E- a1 z: c28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*# {" C8 I1 A: C) g
命令行传递给批处理的参数
9 h# X9 U  w3 f%0 批处理文件本身
( d3 z( j2 ]+ J2 M1 W; l%1 第一个参数
- a* i" [# }+ w' `! p" q; P%9 第九个参数
( i# k" w$ Z) _, F  Z%* 从第一个参数开始的所有参数
0 X; M0 v0 M8 \批参数(%n)的替代已被增强。您可以使用以下语法:
: Q9 U7 W5 o+ z/ I%~1 - 删除引号(" ), 扩充 %1
! ]' Q( u( P9 {1 \' L%~f1 - 将 %1 扩充到一个完全合格的路径名, j. S: j$ W/ P5 J5 f! Z
%~d1 - 仅将 %1 扩充到一个驱动器号% C* `; Q  G' M) j4 P; I
%~p1 - 仅将 %1 扩充到一个路径
. W, ?) I7 x2 k, m* D( ~%~n1 - 仅将 %1 扩充到一个文件名: y2 p5 p8 h* W+ `  |) Q
%~x1 - 仅将 %1 扩充到一个文件扩展名5 z+ C5 w# k' J
%~s1 - 扩充的路径指含有短名5 {' ^! F6 X. c' e7 N! l
%~a1 - 将 %1 扩充到文件属性
( F! Q9 H1 `* P7 R%~t1 - 将 %1 扩充到文件的日期/时间
  E' O+ ]- S* a* M%~z1 - 将 %1 扩充到文件的大小
, a* p0 `9 H+ O& x* z+ F* o0 Q0 I, r%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1" K" S& q, o( |% ^( ?  \
扩充到找到的第一个完全合格的名称。如果环境  F) z' J" `) p4 j7 T
变量名未被定义,或者没有找到文件,此组合键会
) V9 O! g: ^& y4 O扩充到空字符串
' a; _& K1 p/ @/ ]* b- q2 A  P/ R* a可以组合修定符来取得多重结果:  g# M1 [4 ^/ a" y! ?; \
%~dp1 - 只将 %1 扩展到驱动器号和路径
: o' i; s6 r4 O- e+ v/ _+ w& {& u9 Q5 S%~nx1 - 只将 %1 扩展到文件名和扩展名2 J$ e% J9 L& A  ~- ^" K
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,5 c) ^+ r4 Z4 U( b
并扩展到找到的第一个文件的驱动器号和路径。1 p" a: L$ d7 t% ]* \: g
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
+ u4 g' k5 P6 i7 q% @可以参照 call/? 或 for/? 看出每个参数的含意
1 d: p) ~* N; ^6 w) necho load "%%1" "%%2">c:test.txt/ r  l5 w$ h( J6 r$ ~
生成的文件内容为 load "%1"  "%2"3 Y0 X" O8 |1 D$ K- e
批处理文件里,用这个格式把命令行参数输出到文件
( _  G. u  U# o$ ^  T. u: Q. Y% ?* D7 R4 N0 _" M* z  T( p8 H
29 if2 N+ b2 M. ]* R" d) R# K# e, G
判断命令
) m  T: D. v( i2 Kif "%1"=="/a" echo 第一个参数是/a
% ^! \( Q; y, N5 i! f- aif /i "%1" equ "/a" echo 第一个参数是/a
) \* R% i, Y6 S2 V; L* ]- q/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
: Z4 ~7 e( j$ pif exist c:test.bat echo 存在c:test.bat文件( D5 ^3 K' K1 Z$ j# a4 r+ g1 y1 I
if not exist c:windows (
- q( Q( N8 F3 U/ Z- Recho 不存在c:windows文件夹
4 i9 |% J9 z' O9 A/ F/ O)
5 `- b8 Q# y. v( K* R  b3 d9 Rif exist c:test.bat (
: d( O9 |' @! g2 ~3 Lecho 存在c:test.bat
) }: V  c6 n& ^: q) else (
" B9 t2 S! Y  H* f* ]5 g2 ]* Gecho 不存在c:test.bat
9 }! Y, ]- D4 B4 J)# k* R8 J% W& c3 z! X) ~2 t: N
30 setlocal 和 endlocal: d$ `2 ]0 X3 o9 k; F/ T1 d( F
设置”命令扩展名”和”延缓环境变量扩充”+ Q2 N  F( x3 {1 W0 M
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"7 F# T. ]8 I! o: f8 e3 q" M
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
) d# D& y8 Y  X: \4 g+ k, f( S/ w5 VSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"7 i6 R* {/ S, [& Q( M
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"$ z+ w. j( i( N/ E4 Q/ h
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态' H0 S* m9 ~* x5 g
“命令扩展名”默认为启用
/ {1 w3 z  O, Q; R“延缓环境变量扩充”默认为停用! h- @& X& A0 n! D0 Z  z2 Y  `
批处理结束系统会自动恢复默认值
0 K& n5 U# Z3 q  ~( g可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
% w% f3 q) l# f8 Z序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确5 G* y1 h8 f. c
保程序能在其它系统上正确运行( ~+ h  ~1 r8 `! [. F4 Z0 |
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
2 A9 r$ X, ~" U4 C4 s% I% J) E) j8 b: n
: }4 Y% i7 l$ s8 m3 N31 set
1 S2 ?  W: O0 p3 K1 j; W0 D设置变量  J! v. T1 a" Q/ r5 T' s! ?7 y
引用变量可在变量名前后加 % ,即 %变量名%
+ E$ B; u: h  b1 f* K6 bset #显示目前所有可用的变量,包括系统变量和自定义的变量
- g: I4 a! g& R( Aecho %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
  t1 T2 z- M% \% g+ g! c2 x* Nset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1- ?2 w6 o. v: V8 J
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2( _/ G% S2 U& a6 K
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
& q5 ?$ t; V% g, Wecho %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
( ^3 ~) b5 v" zecho %p:~6,3% #显示第6个字符以后的3个字符,即aa2
) ?: p$ j" ?/ l. Lecho %p:~0,3% #显示前3个字符,即aa1$ Q# x, W9 K7 `1 ~
echo %p:~-2% #显示最后面的2个字符,即b2! S1 y% x7 m1 M2 {" L: I) j
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b# U/ |% T: X# G7 J, x
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
- u' k6 a7 `) K/ }' x# P7 l# Z) zecho %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
' J4 d! `" }' Z) w3 Recho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
- k7 P/ [4 z/ F6 aset p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
8 s  v, N  d3 G9 n" t6 Dset /a p=39 #设置p为数值型变量,值为39+ B5 c# z! L3 o3 ?
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
! v& H, c, Y6 F/ l. kset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
' g" E8 Q+ k+ _- S9 ?/ sset /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
4 B& _0 I9 n8 ]set p= #取消p变量
( W0 }; S( `% F4 T4 R" z" B. b4 @9 Yset /p p=请输入
4 {& i* X* M/ ]" T6 T8 d屏幕上显示”请输入”,并会将输入的字符串赋值给变量p6 t: v( n) {& r
注意这条可以用来取代 choice 命令, Y: ?# x5 C& g) p0 v: A
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
; S7 L* R! O$ B) _8 s* e' {@echo off+ `! R& b4 q5 r, i
set p=aaa! P3 W$ E9 H/ @7 `
if %p%==aaa (
. b( R4 q3 `: f  }! t) Recho %p%' i6 G5 j' C3 l
set p=bbb
' K  Y7 U5 D& x+ Y* H  W6 N! Techo %p%
- y; ]+ r3 G$ _( H- A)
% L# S' S) r) J* h) R# ^: {3 c+ B结果将显示
" S1 m3 d5 F+ `5 g. ~2 Taaa2 v: j# H7 c8 d/ B( j$ l
aaa
- V" Q' {: Z* U! i  a1 d+ D因为在读取 if 语句时已经将所有 %p% 替换为aaa7 K9 X$ d) q, G7 E% p
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"* ~( }1 _. Y; D  j
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!* w  Z, ?. }" L  `0 s/ s7 s
@echo off* F- H1 Z2 ?; ]. A" Y
SETLOCAL ENABLEDELAYEDEXPANSION1 o0 S$ t. i( T4 u! s3 e% X% O
set p=aaa" o  H; w( I$ p2 x3 i! H3 Q+ [/ ^
if %p%==aaa ($ n. s, _3 }9 d3 I
echo %p%% A: J% k! }5 [' W" s1 g" m) n
set p=bbb
9 c4 c6 y2 y2 ~8 n3 V2 L1 ]. |7 o  Wecho !p!
6 l$ f5 z0 B$ G)( g# ^# ~7 z: o% a  |8 N% L
ENDLOCAL
8 l* V! \% p/ }# r4 Q! l1 x/ S结果将显示
6 F2 n- ?. w1 @; Z7 D+ l2 Baaa
: o  b4 m. R) A) g' |bbb" W; u; o/ o6 G' U3 }# _& U
还有几个动态变量,运行 set 看不到
) `# L; O4 \/ P3 o6 `: Z" L; p( ~- Y9 c%CD% #代表当前目录的字符串
) I- h! Q. |& z. U%DATE% #当前日期7 V' `( Q5 C! y/ n( [% y0 H  C( M
%TIME% #当前时间4 F8 W" h8 y5 U4 }/ h
%RANDOM% #随机整数,介于0~32767, m0 I5 w+ l4 J' Y( x& E# H5 G: M
%ERRORLEVEL% #当前 ERRORLEVEL 值. x: t/ b/ }) U
%CMDEXTVERSION% #当前命令处理器扩展名版本号
6 u) K# ^- A4 W/ M/ ?%CMDCMDLINE% #调用命令处理器的原始命令行
! X+ U6 o  B* r# V可以用echo命令查看每个变量值,如 echo %time%0 t7 _  Y2 E" g# k( m2 m6 g: p: H  [
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到4 ]7 e. A+ z$ P1 s* [/ f4 O: t7 g# o
9 V% n+ N  [# _6 h
32 start
$ Z4 `+ u+ g6 L$ g. @) z6 X) e批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令* [6 ~7 Z/ h$ K2 A
8 [2 ~+ O' V# z  D
33 call1 o- O& ~6 T5 p9 Q5 ?, {
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行$ S9 y$ R, G  z( F. F" E( l, C: d
有时有的应用程序用start调用出错的,也可以call调用
6 T" {* C, [) T4 l& D" p. F0 z4 v- U: a# y
34 choice (外部命令)! a  o: I8 s: Q8 i4 L9 q( q/ T
选择命令/ b* H. P; p2 f) P$ V. w. I
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……. K! h+ t0 A6 Y2 N5 M3 ]
win98里是choice.com' I2 {: T5 j- b9 w# G
win2000pro里没有,可以从win98里拷过来+ c" R3 Y( P. i4 E
win2003里是choice.exe6 |! n% Y. T& Y2 N; g6 R8 f: A6 \% m! K! _
choice /N /C y /T 5 /D y>nul# v9 R! I7 a! {  _5 h/ a: Q- |
延时5秒
5 U( A1 a8 f! k2 E/ t4 X
0 p4 ^8 t% E" _6 c2 N5 z5 I35 assoc 和 ftype2 _/ k% w# ~9 V$ C
文件关联! s1 n  i- c: a6 V3 Y
assoc 设置'文件扩展名'关联,关联到'文件类型'# I; y7 p! O% {: B- W4 l
ftype 设置'文件类型'关联,关联到'执行程序和参数'  F  f- t, J# N" P. {' K- A' p
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开# I5 A) i) A+ D: q+ N) G/ _
而是先判断.txt属于 txtfile '文件类型'8 e5 A+ W# K6 ?+ A
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
, E# ^7 ]8 h% n7 F) O$ e! N2 B* ]可以在"文件夹选项"→"文件类型"里修改这2种关联
* M( @, g+ H) q; _+ dassoc #显示所有'文件扩展名'关联
5 z* m' q' z! f& a0 M+ S  \; Cassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile9 t$ U  I5 g6 y4 X
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
( E: B# k( N9 v2 G" U) {+ Hassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile: g+ E5 `; _8 [+ K
ftype #显示所有'文件类型'关联
; [4 S/ H. D5 h, Zftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
% ?- e. |  m) ]! Fassoc .txt=Word.Document.8/ M! |" h6 i  L( q8 T
设置.txt为word类型的文档,可以看到.txt文件的图标都变了
9 ?( |- _; d4 tassoc .txt=txtfile. g! R/ x  i. r& j5 f
恢复.txt的正确关联# J2 |6 d5 F8 w0 B$ A+ `; U
ftype exefile="%1" %*" _& x  Y+ z9 ^& I' {1 F7 z
恢复 exefile 的正确关联% q) J. E$ X5 U. H- J0 x
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
8 W  `! S" J1 w
3 f, P+ \5 C' R; v36 pushd 和 popd
0 I+ o0 p/ c* N# w. e, ^切换当前目录+ ~( u8 J. r* _2 X! h8 I
@echo off- y- \  I& \3 h8 U2 `- b$ F$ h& T2 `
c: & cd & md mp3 #在 C: 建立 mp3 文件夹1 P7 |8 `5 Y. X( |. I
md d:mp4 #在 D: 建立 mp4 文件夹1 }3 i  q1 e# V8 I
cd /d d:mp4 #更改当前目录为 d:mp4# Z' K# ]  @  ]- k! [
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3! X, a( C1 |5 l0 `
popd #恢复当前目录为刚才保存的 d:mp4
0 B# F2 p# ]9 ]; |& P
& i, A  T0 e: M7 y* R- E" O37 for
; Q# o0 i! q) o% l+ y" ~9 S" P循环命令4 c1 U1 m5 l' [) I9 X
这个比较复杂,请对照 for/? 来看
& f7 ?5 _3 {6 M1 M# j& B  gfor %%i in (c: d: e: f do echo %%i/ e5 g% ^- ]0 n5 r  e. v
依次调用小括号里的每个字符串,执行 do 后面的命令
: E; Y/ p9 ~$ t' j注意%%i,在批处理中 for 语句调用参数用2个%8 m0 d& h' f9 l$ }
默认的字符串分隔符是"空格键","Tab键","回车键"
! a8 g# L& o  x! W3 p& ]6 M/ xfor %%i in (*.txt) do find "abc" %%i: K7 D- A$ \% ^" L2 f
对当前目录里所有的txt文件执行 find 命令& A6 |9 e+ p2 g* y: i$ j( D$ Y* _
for /r . %%i in (*.txt) do find "abc" %%i
! G+ f, `( r# Y' e9 W) _9 W+ l在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行) [: _$ p; ~3 a3 g/ b0 Q
for /r . %%i in (.) do echo %%~pni- T7 F; F5 X1 C' R5 v
显示当前目录名和所有子目录名,包括路径,不包括盘符
* M- s6 g+ {; P$ s- `for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt; ^$ C/ ^) R: v* h
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
2 k# n. B0 E# e2 Q( Wfor /l %%i in (2,1,8) do echo %%i
" |+ p0 J: o, t4 W* `  N生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1  A8 r; H, V# d0 I6 F' d
for /f %%i in ('set') do echo %%i
: c* \; l( ~& K* F对 set 命令的输出结果循环调用,每行一个
8 R6 ^* n7 R9 B3 j! ]6 Afor /f "eol=P" %%i in ('set') do echo %%i
9 a- Z/ i& F( ]. h取 set 命令的输出结果,忽略以 P 开头的那几行/ r( K" K  @3 g  b8 K0 i7 P0 }
for /f %%i in (d:mp3.txt) do echo %%i
/ |* d; ?1 T7 f8 Y, P- m显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称+ C- b4 f3 o2 [  W' u
for /f "delims=" %%i in (d:mp3.txt) do echo %%i
( K7 n: K4 P( q- ^' ?8 |8 r显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
1 Z1 w$ {' u4 Y7 Y% R7 Q/ dfor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
0 |2 N( P, g7 W- w. p4 N对 dir 命令的结果,跳过前面5行,余下的每行取第4列, b, x% G2 _$ r. w- r
每列之间的分隔符为默认的"空格"0 y/ G6 n2 m: Z9 t% J4 o( j
可以注意到 dir 命令输出的前5行是没有文件名的2 T4 O/ I' J' a( f% b, Y+ m
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
, \0 x6 x* `; ~6 T' Decho %%a
% N% X+ `% [' z. qecho %%b9 ^7 {: u/ l4 J$ |% [* M5 Y5 T+ k
echo %%c% M1 M( m& ?! |! Q
)
5 p/ D, p1 V1 `9 U对 date /t 的输出结果,每行取1、2、3列
( [7 e% W. Q- P. E第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
8 }1 a; \! V6 W8 U分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
+ l* V) Y3 H5 B其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
7 r) t7 H8 I" h7 g$ Ifor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
( k% |6 H% h: U- ^取第2列给 %%a ,其后的列都给 %%b: U+ U& ^. _! P7 |$ e9 ^" ]
9 Z! [0 Y9 |* F; |( w7 {6 V
38 subst (外部命令)+ p9 r5 v/ B( s9 i* G
映射磁盘。
( u# L/ m1 Z0 p" t8 i3 {& msubst z: serverd #这样输入z:就可以访问serverd了
; M8 I& H" ~5 u' ?0 rsubst z: /d #取消该映射5 i- I9 d4 }' ?# d
subst #显示目前所有的映时
; ^$ z! D& e0 [! S: G- E
( @3 a& [* @) ?5 G: s39 xcopy (外部命令)
7 n* y( d& M" S( }文件拷贝
* ^- n+ j, T" S' k/ a% _9 Axcopy d:mp3 e:mp3 /s/e/i/y
* w8 S+ E& a# m. G. @复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
4 b/ t, `# @/ R2 Z, i8 a加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
: P; [# ^9 Q9 w! c$ c6 t8 |! l5 R. Q. k/ B% w
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
    1 i. E7 ~+ H9 Y) k8 O8 s
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:
      4 Y  L- e/ h, I& a' U5 z, s6 N4 C7 p

    " s6 `9 D, |+ h2 [2 A7 I
@echo off/ \' C) i( O8 e0 x' K
set p=aaa" U) T; e+ U( Z0 P
if %p%==aaa (
6 y: j* a6 D: ^3 d8 {* p, oecho %p%: F- I5 r% e+ D: Y+ s
set p=bbb6 V1 u# m% {3 b
echo %p%' b" t+ x, ?3 U' q/ f8 O
)/ _. g4 e0 ~4 E
pause
  • 截图:4 S& x3 C8 Z9 |0 x. E7 I, r" D
  • 2.批处理.bat 文件中输出中文乱码
    - i6 T# ~" o- Q; [
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:& R- E9 f+ K, c
    • 效果截图:5 P. C" P6 V" Z9 S: U

      : M$ o9 k6 R( E% {

    ) o8 b0 K* _, Y* t* ~3 x2 Q

! {; `. F6 P0 X/ V. Q

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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