扫一扫,微信登陆

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

搜索
查看: 1519|回复: 0

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

[复制链接]

307

主题

335

帖子

1897

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1897
QQ
发表于 2021-6-25 19:48:12 | 显示全部楼层 |阅读模式
Windows批处理(cmd/bat)常用命令教程
简单详细,建议收藏
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
  • 2.批处理.bat 文件中输出中文乱码
  • 解决方法在文章末尾!. O/ p7 g7 e' V4 G9 o
前言
  • 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效8 m& W; c: ?* l% r! h3 F/ k, I4 p
在Windows中善用批处理可以简化很多重复工作
什么是批处理?
  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展0 z6 \& c; R0 p8 Z: X9 X
    名为bat
  • 目前比较常见 的批处理包含两类:
    + i5 G. X, P( g! g6 _3 l
    • DOS批处理和PS批处理。
    • PS批处理是基于强大的图片编辑软件
    • Photoshop的,用来批量处理图片的脚本;
    • 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
    • DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理/ T  e. Y$ m& A  ?
  • 批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
    ( |# S' i# t; z& ?. F: p命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行
  • 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件

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

    + X+ n/ ]2 B9 G; Q
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
; e; A  A7 t8 K: Y$ c
& V0 Y' l9 e/ j) C9 D
Windows Batch 常用命令( B5 Q, d$ [2 S- B, W- P  z: b
1 echo 和 @
  b+ m, N( V( w9 w* s* x回显命令
9 U7 M" _4 ~5 T  y. k% R9 f@  #关闭单行回显
2 @% \5 H2 T% H- E' q9 y, techo off  #从下一行开始关闭回显
9 ]% z2 o2 ^1 y9 S. x@echo off  #从本行开始关闭回显。一般批处理第一行都是这个) ^3 k& `- t$ n) V, C3 A3 g; U% p6 r
echo on #从下一行开始打开回显
3 h$ D7 X9 s' u7 X. `2 recho #显示当前是 echo off 状态还是 echo on 状态! j: y  N5 Y" }4 B! M3 N9 [
echo. #输出一个”回车换行”,空白行  P. H* u0 m4 d1 [4 l  c: [3 _% Y
#(同echo, echo; echo+ echo[ echo] echo/ echo)9 c$ `' f$ Z9 L: H0 ?$ _3 K, m3 n
& t- @! K5 G- W; u9 H, v2 x
2 errorlevel
! c1 d1 x& o" a" h& b4 Wecho %errorlevel%
, j6 C4 V# Y7 T9 q+ ~每个命令运行结束,可以用这个命令行格式查看返回码$ e! o7 Q; o5 Z( o  W- N
默认值为0,一般命令执行出错会设 errorlevel 为1! h: G, R7 c. r

" Q8 D1 D5 V7 {( U5 I7 F. J) f3 dir/ g0 h+ S3 r7 i& A5 P9 B$ z* V' d
显示文件夹内容5 f5 r: d, X8 o" p, I& f
dir #显示当前目录中的文件和子目录
) ]& q' n1 i4 c" s! v0 V* |dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件) j" }: m" D) [7 e: R% Q: B
dir c: /a:d #显示 C 盘当前目录中的目录
  U' i7 h+ V- q2 F9 P( Bdir c: /a:-d #显示 C 盘根目录中的文件
: J3 Y1 z8 E9 ^0 K, adir c: /b/p #/b只显示文件名,/p分页显示$ L" x9 w4 d* j0 \1 C% g! R5 ]- e
dir *.exe /s #显示当前目录和子目录里所有的.exe文件1 B6 }: W4 ]. |: E' i$ u# B6 z* l
1 ?  w, t! x  J
4 cd
7 |& {3 z9 t0 F/ f, b- v切换目录" x0 l/ P5 N0 p# U( `
cd #进入根目录
/ Y; V. _, F& I6 v+ f) i# j, ocd #显示当前目录
: i# T% Y: w- T* I& T- \) I% o/ [cd /d d:sdk #可以同时更改盘符和目录" }0 @/ Z2 Z; w; P
% Z+ v2 [  {6 `" P  ?4 k1 D
5 md2 Y: n& j7 f) I- |9 E, _$ \5 x5 x
创建目录
# A" f* N( l# B4 f3 @" dmd d:abc #如果 d:a 不存在,将会自动创建中级目录
+ P' a! C9 b  g: ]. I#如果命令扩展名被停用,则需要键入 mkdir abc
+ F- d& \4 Z3 C. G" ]6 h6 x( @$ J/ ]+ c
6 rd
+ w1 U( K; L; Z6 J4 Q删除目录
. l9 \% g; j7 b7 Z  A' V1 qrd abc #删除当前目录里的 abc 子目录,要求为空目录* W  a+ F: R. {! y2 L
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式4 m$ |7 {1 D$ q( `
* b" k5 T# T2 @9 v" C6 l# b% M
7 del
$ f" v* B5 G" z$ R$ _删除文件7 r, B# X( q  V3 [0 H
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件# N/ z5 J- ~' c) s# D1 {! \
del /q/a/f d:temp*.*
1 E4 D$ H# L5 f3 M& l2 p删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
4 V/ G! j+ e( a! |del /q/a/f/s d:temp*.*5 T, O  I  W7 ]0 W- J( p- J
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录6 ~; d- {7 b. o

9 F1 d0 I! o# g8 ren
7 K6 m  }5 a. g  i7 n6 M% o$ Z/ M& t重命名命令& e, s" P8 y# V2 U" Z$ P
ren d:temp tmp #支持对文件夹的重命名2 O7 q9 b* y; e& Y1 Y

4 ^& D+ O# K7 h, a0 I5 |' }. W8 q, \9 cls9 ^# p) t' d0 A: ?9 H* V, p
清屏- }! Y  X5 P$ Z+ Y1 n2 z
10 type' _- }% J* j5 ~# |# @3 V
显示文件内容
5 d- F( z* b4 N0 I/ otype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
0 D9 o6 _6 b& b4 O+ r$ o; S( ktype *.txt #显示当前目录里所有.txt文件的内容
! [" J; x! L% E% P; e( `* Z) _
: e  u: i# k! J5 _, E; `; S11 copy# _, ]) v4 L$ A' u# F2 W
拷贝文件3 A' \; p. V8 e
copy c:test.txt d:test.bak
1 [3 F/ _" @0 q% G复制 c:test.txt 文件到 d: ,并重命名为 test.bak3 d$ ]) w6 Y4 z' J" k; A3 C/ `& q
copy con test.txt
% z: q/ J5 Z* U8 _* R: `6 _# ~从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
& e& U% h0 I& Lcon代表屏幕,prn代表打印机,nul代表空设备5 d5 W2 d- ?7 d& r8 x: c4 w
copy 1.txt + 2.txt 3.txt
9 S3 T: s. j7 q2 |* Y  ]5 o合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件- G3 `! q( L% q3 S: i& u
如果不指定 3.txt ,则保存到 1.txt# p6 ^- O3 R7 l% z7 X3 t; j
copy test.txt +
) _* Q4 L# X( ^4 Y复制文件到自己,实际上是修改了文件日期7 Q7 S' |4 q& V8 h5 z+ N7 p
: I7 `6 D4 h" {. j0 m
12 title
4 n; n( e0 e2 _设置cmd窗口的标题
3 E8 x* R# _& `- l9 U- {title 新标题 #可以看到cmd窗口的标题栏变了
  n9 \4 Q9 w; \! E! k1 c. F2 T& L( p3 c6 I
13 ver4 A  _. [% v7 J8 d
显示系统版本9 K% g6 F3 ~% z7 X% H: S
0 c. N+ u  l' t* y+ d# I1 y
14 label 和 vol
5 Q; s2 o9 }) V4 f设置卷标9 G$ v! n' ~1 d
vol #显示卷标
4 E& v# ], N% Mlabel #显示卷标,同时提示输入新卷标# _$ p6 `* z3 Z. o. M
label c:system #设置C盘的卷标为 system
7 r5 g( k8 g8 ]0 c5 o5 A% y) A  z1 w) P# e7 Q
15 pause# f' k. D; f* j2 Z; D% g
暂停命令
& [, a8 I) C9 u& e" S- u: b7 ~7 h% L& N6 X
16 rem 和 ::; h1 E# r( ]/ a8 x
注释命令1 Y2 v# O. ]: C7 L- r' V
注释行不执行操作
6 k* i- S2 O6 k( I
1 R# ~% |1 T' X) I* Y$ d17 date 和 time. U  k: j5 P3 ]% B6 a# n
日期和时间7 n7 ~2 ]$ ^. _2 D
date #显示当前日期,并提示输入新日期,按"回车"略过输入* {$ @" }2 z% o! H
date/t #只显示当前日期,不提示输入新日期4 K6 S: p, _+ e$ d9 c$ \
time #显示当前时间,并提示输入新时间,按"回车"略过输入
4 \# \, h% v) [% t7 ^: i+ rtime/t #只显示当前时间,不提示输入新时间: M4 q1 v& A- A8 J; q4 C3 P/ d

% X3 P1 z3 Y) g! U/ i; \4 B18 goto 和 :8 z! i% E  Y7 a5 F
跳转命令# W- C$ N$ J: l  M5 V
:label #行首为:表示该行是标签行,标签行不执行操作
) J4 V" k8 M5 Q9 z; Bgoto label #跳转到指定的标签那一行
* W4 S3 ?6 @6 A! L: x/ o
* g4 d+ e/ Q, c. d  A4 U/ V2 z19 find (外部命令)
! m7 b9 b- T0 m, c0 i3 h5 S# G查找命令
+ t9 s3 {8 s* L3 Q! T6 Jfind "abc" c:test.txt$ O# _) S4 d' `
在 c:test.txt 文件里查找含 abc 字符串的行, {( ]6 [& y; X% h0 _% D, [( ~5 I
如果找不到,将设 errorlevel 返回码为1
( w4 y- k; q  Z3 q5 f: pfind /i “abc” c:test.txt
3 _* H6 ^- s+ d查找含 abc 的行,忽略大小写/ i, E8 _. `, x. ~5 }$ y
find /c "abc" c:test.txt
6 y6 f( V7 C5 I+ b% L显示含 abc 的行的行数" A0 B3 z0 G% A7 p5 c; b7 Y* X
0 G3 Q8 F& q2 f. v$ \5 d/ q
20 more (外部命令)9 o) U* E1 B) Y: l: x& O
逐屏显示5 v* ]  G$ @* a' W$ b- h
more c:test.txt #逐屏显示 c:test.txt 的文件内容
1 r8 k5 P& Q3 l! {  k; W9 y6 V( h6 m8 G. s: F- c* G+ v
21 tree
. D0 m4 N( n7 J% P显示目录结构- D4 u& m2 e8 T$ l* ^% H. O
tree d: #显示D盘的文件目录结构' Z" ~1 {* e8 l6 u

" k: z1 V) d# }22 &
$ f0 w" t* t' q) I( x% `9 j顺序执行多条命令,而不管命令是否执行成功
- A, f) p. o* A+ y  i$ a! p$ W" z
9 B' V# w, J' u: D5 X, e9 p3 n2 n3 R23 &&+ b* ^+ T5 ~1 W) O) ]: I( U* W- Z
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令2 N! I/ N2 t; v# Z* P" P5 U2 |
find "ok" c:test.txt && echo 成功
8 V) y4 l( {- x5 @& h$ s如果找到了"ok"字样,就显示"成功",找不到就不显示
% T  j& Z% C$ C) b  F" W- b
& B  Y$ ]3 A1 @2 y6 [  i24 ||
* a0 V. t4 }! i- m9 F顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令$ p3 d" y( R( J  _" K8 J$ d
find "ok" c:test.txt || echo 不成功# d8 X0 P' L- A& C' M+ b% m
如果找不到"ok"字样,就显示"不成功",找到了就不显示' Y2 {3 E8 G1 o% D5 s, k# [
! ^4 e  e* W5 N
25 |
- w1 X! P, V/ G' w5 _3 D( ~管道命令
; N1 W; @; ]; t! n. `$ Kdir *.* /s/a | find /c ".exe"
/ a" x: J$ G$ N$ o, C. Z$ K! U管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令" {- G9 a' @9 G/ [
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数* A# G: X/ \* s" p+ x: \
type c:test.txt|more7 C4 X* u- t  q  ^9 ]1 n
这个和 more c:test.txt 的效果是一样的9 Y, s  _3 m4 z( D2 K& l
6 h; x4 B5 ^% n' Y1 ~
26 > 和 >>3 F, k: D) x8 _( d+ r! F: F
输出重定向命令' A" O% C) F, _& @' q+ c9 m
> 清除文件中原有的内容后再写入
8 K* U! A3 l. c* `  @8 i: q>> 追加内容到文件末尾,而不会清除原有的内容
. @+ y" x" J0 j8 K$ Z主要将本来显示在屏幕上的内容输出到指定文件中8 c" j& N. ~' f% `5 v6 U
指定文件如果不存在,则自动生成该文件
+ y8 W; g. w/ i/ V$ D3 Gtype c:test.txt >prn7 }" A3 d" g; D8 o% l; }7 i
屏幕上不显示文件内容,转向输出到打印机) _; A: r, `6 I5 L
echo hello world>con
3 H* l* F. E, f5 }在屏幕上显示hello world,实际上所有输出都是默认 >con 的
8 x# c. G  X" f5 W; d+ @copy c:test.txt f: >nul
3 N5 H2 i6 q0 }, [6 S) G" V, f拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
: D+ ~9 R$ L: {copy c:test.txt f: >nul 2>nul% H& U  T  {4 G7 c) V5 c7 H0 M5 _
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息, ]. T! `) b  a8 V, g
echo ^^W ^> ^W>c:test.txt
* W0 c2 I+ @) @4 {生成的文件内容为 ^W > W
9 y% M/ x, ~% l^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号7 M  q1 ]$ x" J- I0 p. H
  W( m6 ]' ~5 u/ S/ L* @$ b
27 <
# [; J5 i0 [" }& M0 X% o从文件中获得输入信息,而不是从屏幕上1 Q7 }0 O' H) T2 p9 D
一般用于 date time label 等需要等待输入的命令6 u' E" d3 l  }9 G4 p* j
@echo off
; n) S) u4 m. G, cecho 2005-05-01>temp.txt
5 _% U" U1 d; R6 @: O7 Zdate <temp.txt. o! E5 ?. ?9 i* ]5 d6 i$ A2 H
del temp.txt
# q8 b% r' w3 S- R; @! n3 Y这样就可以不等待输入直接修改当前日期
& P+ {' C1 c! L. r0 J1 v1 l4 E( P% C# X2 P# k
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*3 Q5 m1 x) h2 a0 S" ]
命令行传递给批处理的参数
+ S8 e( A* a5 Q%0 批处理文件本身
  r5 f) [# F+ ?%1 第一个参数4 P+ c& m# s* W( H, G* c
%9 第九个参数
$ C5 H& U4 X" }/ N$ K%* 从第一个参数开始的所有参数+ O& c9 o, L) H
批参数(%n)的替代已被增强。您可以使用以下语法:
+ c  @5 L2 x) o/ B%~1 - 删除引号(" ), 扩充 %17 ~! K. x3 g8 Q$ {8 K$ {$ u! u
%~f1 - 将 %1 扩充到一个完全合格的路径名  E9 p  n5 |( }  D8 ?
%~d1 - 仅将 %1 扩充到一个驱动器号$ B/ `( D$ }' T: q6 |, A
%~p1 - 仅将 %1 扩充到一个路径
" ]" \, |* f- p%~n1 - 仅将 %1 扩充到一个文件名
6 }) Q, x* A2 h9 A5 a9 D%~x1 - 仅将 %1 扩充到一个文件扩展名
! O. K/ r. W0 P% ?' d: V: C4 K%~s1 - 扩充的路径指含有短名
4 |# X& u* z* s9 |* ^& u%~a1 - 将 %1 扩充到文件属性
0 {- m" T3 h  |9 `7 v2 O; X%~t1 - 将 %1 扩充到文件的日期/时间& Z8 ?& Y1 Y& b+ |0 j
%~z1 - 将 %1 扩充到文件的大小" h$ B, |: j+ O( j9 U: n$ ?
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %16 G; q  [% J/ A
扩充到找到的第一个完全合格的名称。如果环境
. ?/ K. {# ~4 J: `4 z; q" z" K9 q: @$ t) @变量名未被定义,或者没有找到文件,此组合键会
8 G3 Y* j0 N( ?$ }6 z3 G扩充到空字符串
& v4 i9 U2 a2 B可以组合修定符来取得多重结果:0 G. a4 g2 p/ I4 k: C2 F7 V. v
%~dp1 - 只将 %1 扩展到驱动器号和路径$ O8 A& J2 A# }$ t2 g
%~nx1 - 只将 %1 扩展到文件名和扩展名3 I( s! P- Y5 B+ m" {9 m2 k$ T/ H
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
  q* O% r; b! Z7 h2 M6 [1 i; Z并扩展到找到的第一个文件的驱动器号和路径。
" N9 \6 S9 G0 w' R0 q. t) ~# A/ h%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
# [0 A& o  R: ~2 I) G, K5 {2 w可以参照 call/? 或 for/? 看出每个参数的含意6 \4 p/ E/ P7 ~: S, r
echo load "%%1" "%%2">c:test.txt( Q8 ?4 U6 y* J8 [
生成的文件内容为 load "%1"  "%2"/ N1 P! k% n; y% f2 l; b: R
批处理文件里,用这个格式把命令行参数输出到文件0 P! n+ p; {, o2 B4 N

: o. ~9 b! S! Z( j. h' Z. k) z29 if2 E/ q" Q3 ^5 L% U, G% @
判断命令" e1 W) H" d( V# i4 \
if "%1"=="/a" echo 第一个参数是/a
1 V8 X5 ~! C7 h  S5 Nif /i "%1" equ "/a" echo 第一个参数是/a9 g& m" T5 ?' ?  j' x5 u9 i
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?4 B4 T$ L/ \& M+ m! s
if exist c:test.bat echo 存在c:test.bat文件$ P4 N0 h; E+ @) q
if not exist c:windows (
/ m# T+ J8 C4 L7 ?& Q/ recho 不存在c:windows文件夹
9 _/ c8 ~6 d6 a4 v# r)- O% A8 {, H' b5 k
if exist c:test.bat (
. C- h1 l9 X0 ^& D6 Becho 存在c:test.bat% P& G1 X1 O4 Y& I1 b/ K
) else (3 O, C% o1 g& r% d# _0 O
echo 不存在c:test.bat: i7 h6 `, P( g, U% n
)2 c/ o7 p) T# i  D  C
30 setlocal 和 endlocal6 [9 O: y2 s2 }6 `
设置”命令扩展名”和”延缓环境变量扩充”( N+ w0 H" u$ ?: k3 ~  K; ~" L5 n
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"- t5 D8 |7 L; M6 L& B- f
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
, \/ q8 x, a6 O/ R3 |& p# XSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
2 `3 J6 P: n3 qSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"; u" F" o: T( H( ]
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态
# L5 C  G% x; W; Z0 T  H7 l( o, e“命令扩展名”默认为启用
1 ]5 ^) y$ ^1 N, h0 G: j“延缓环境变量扩充”默认为停用
$ x" q% C7 a' R% \批处理结束系统会自动恢复默认值# z, W" s8 V( Y& e( L
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程5 }! I# B" i/ Z8 I- t! q
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确, v: v, X" F8 ~$ w& c  Q
保程序能在其它系统上正确运行
( \9 c$ `) W" z6 b. |- p0 l7 r"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程* N: @; D1 n3 V- O, n
- @! T# C* c* L3 M
31 set5 ]9 Q& l6 s% o/ a
设置变量
- x! I6 q6 W3 Z3 q7 f; J引用变量可在变量名前后加 % ,即 %变量名%# U# ?( x: {! I; F4 j
set #显示目前所有可用的变量,包括系统变量和自定义的变量9 d0 [& u; ^! E: |
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
2 j# f9 d! ?. G" V" @set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1' m  W: [4 R8 _
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2  R' K+ O9 o; X
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2" q1 b" r& P: P5 I
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
; c% O& @1 h4 @' s( O% }; a8 Jecho %p:~6,3% #显示第6个字符以后的3个字符,即aa2: p+ B( q1 I  I% ~4 g
echo %p:~0,3% #显示前3个字符,即aa17 p& m3 E* q1 O, w
echo %p:~-2% #显示最后面的2个字符,即b2! {9 H& b3 ^# }4 _7 _( y* o# t
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b* C  d+ g2 G0 B: e8 F
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2; M/ h$ m% R/ M1 @' x0 b# o
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
: s" e. t8 `# Y$ Necho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
& h5 p- y' G3 m4 V+ ?set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
8 ^5 B" b4 i2 |5 w3 vset /a p=39 #设置p为数值型变量,值为39
1 S7 D- C$ a9 _8 w& m* V; B2 D) oset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3) I% |* T) B! u0 `3 H6 r$ Q
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
7 \7 J( }1 O9 bset /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?$ E% x8 p# @2 V9 [9 q0 k9 b
set p= #取消p变量5 n) W/ o1 }' D6 f! a: @
set /p p=请输入& V6 J9 Y6 p& X
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
* I$ q7 Z; U0 k/ O- M9 H注意这条可以用来取代 choice 命令
' b$ P5 `, [, @1 `' v5 K注意变量在 if 和 for 的复合语句里是一次性全部替换的,如- `' ?7 |3 ]8 q
@echo off
; K$ i$ `8 |. p6 U6 S# B8 G8 |set p=aaa
! Z0 F. S" S% r% `* b: w5 n9 t; Hif %p%==aaa (
% ]( j) d! r0 g( n/ fecho %p%% ?  E5 Z) T$ [1 c' a
set p=bbb
5 \9 w( y8 d+ \* Q8 Q# w( lecho %p%
( b) A+ y; M" Z# n! i5 B)7 d: x, z& |9 r+ H
结果将显示
1 T, Z. j3 Z! yaaa
! R% s% ]) u3 p2 m6 C4 t  Raaa& |* ?7 c) d: b, S9 e
因为在读取 if 语句时已经将所有 %p% 替换为aaa
( w! o. v% X- b: W% X8 b这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
$ G) c$ y" v) x# o# T7 W8 u可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!  L' s# V6 U* c- i+ g1 a
@echo off! W: g& p5 N: W2 ^5 G. q% q5 A  a
SETLOCAL ENABLEDELAYEDEXPANSION) m( E6 @( q6 i  d: H
set p=aaa8 t0 f( J4 x2 O. q" V
if %p%==aaa (
* }; A2 d0 C; i* S- o! Becho %p%: l& m2 l" d" G' O
set p=bbb
( y% q* ^, ?% A8 H  G$ |echo !p!3 p# [/ H4 |( R+ _- h- W! w
)! s' w! k. \) u" M
ENDLOCAL- ~7 w+ ?# C0 S& k' A5 m+ ^
结果将显示
/ }$ R. O& }" k3 Iaaa- {5 X) k% s9 e) ?$ J4 O
bbb7 I* k) J7 W" O
还有几个动态变量,运行 set 看不到6 P! p$ w! C, {
%CD% #代表当前目录的字符串- A& }+ I  b) D8 b' D" l
%DATE% #当前日期
; I% L) E& C3 K& O! i& V%TIME% #当前时间4 a' L2 ]* j' L
%RANDOM% #随机整数,介于0~32767
( o& }9 L8 `( F# v7 k9 X; |: ~$ N%ERRORLEVEL% #当前 ERRORLEVEL 值
& ?4 K3 C$ J9 ?$ d* j%CMDEXTVERSION% #当前命令处理器扩展名版本号+ B& c& C  d" y4 N, |: m; x4 B
%CMDCMDLINE% #调用命令处理器的原始命令行
( n. f" |$ u9 g5 N8 i5 D0 G可以用echo命令查看每个变量值,如 echo %time%# A" @8 P4 B6 {# Y
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到1 b0 J8 |) I9 U9 i

; ]$ @) E/ O7 B) ~0 L' I32 start
( a" L8 K# m6 q/ m  d. d批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
+ t( @4 O, M' L, y  R/ [3 l  ?5 S9 B' Z
33 call
( z9 z+ j+ T- F- I, F批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行9 @% m  X! h0 H8 p- ^
有时有的应用程序用start调用出错的,也可以call调用0 s. ^; r" [& l) o. e7 N

  q" Q3 N3 q) g% P0 E# P34 choice (外部命令). {% s5 r1 t& o8 _
选择命令9 P1 ?  v% W5 m4 w6 t# \, b5 B
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
$ R7 A" _0 L- q7 zwin98里是choice.com
) d* \+ t& o6 ^8 l/ L. {" Ewin2000pro里没有,可以从win98里拷过来
4 t' P3 a4 f) d! b. Y: Uwin2003里是choice.exe& Q4 c( m1 f/ x/ w( o
choice /N /C y /T 5 /D y>nul1 y! ^9 O) I+ a- I+ b! p
延时5秒! g9 v; J9 g! x$ m9 m9 a

" d& J1 p! n0 U. r35 assoc 和 ftype
  R5 G* b6 X6 D3 m& @文件关联
0 S( L$ F2 Z" f" @assoc 设置'文件扩展名'关联,关联到'文件类型'( N$ J  e+ l+ k; X/ S
ftype 设置'文件类型'关联,关联到'执行程序和参数'
: t* \+ x5 r: [# m$ y3 Q' l当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开. k$ p) g* W# f9 X& F0 F$ D
而是先判断.txt属于 txtfile '文件类型'2 N# g1 `: y" e: ?% u" S2 l, A
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %14 h3 z  \$ q8 \$ N' @! H; Q9 ]
可以在"文件夹选项"→"文件类型"里修改这2种关联! S: p" v0 b! U2 H' F
assoc #显示所有'文件扩展名'关联
1 v7 Y' [. W% }) C# o3 S1 N, Jassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile4 q4 e6 y7 n6 R1 Q1 c! W9 R
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
" Z  E) l* M  }4 b+ Q0 g1 qassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile0 Z8 m( G) |) h9 h) i; c& T7 B
ftype #显示所有'文件类型'关联( \  r; W0 S& H3 g% R
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*5 d- P; R$ J2 y. |
assoc .txt=Word.Document.8, N2 G% {! z. x# o; K+ F/ h
设置.txt为word类型的文档,可以看到.txt文件的图标都变了9 R+ M3 A& _- ~6 |+ Y. }. }& ]
assoc .txt=txtfile
* H& F  e  n- b7 q# A& k恢复.txt的正确关联+ n2 X: d7 S$ ]
ftype exefile="%1" %*% ^1 e6 S3 ]+ _6 `/ g
恢复 exefile 的正确关联
% @6 o# Z  T8 F, [* G# |3 d如果该关联已经被破坏,可以运行 command.com ,再输入这条命令. @' j% T" d7 n& j$ k2 ^* g
) y% z5 G! W$ R
36 pushd 和 popd
* s$ g5 a  j' `, V  m切换当前目录! u6 b, z, h0 V0 o
@echo off
3 ?2 H$ E9 [+ g$ e2 W5 E, h5 Ec: & cd & md mp3 #在 C: 建立 mp3 文件夹. A* t$ i, q. O- c9 i6 U
md d:mp4 #在 D: 建立 mp4 文件夹
; K0 Y. y7 q) Zcd /d d:mp4 #更改当前目录为 d:mp4
% c- `2 d% y( I. [pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
/ c9 P% t/ x9 ?. a: o* }. ppopd #恢复当前目录为刚才保存的 d:mp4+ {  ?% C7 e* M
% r) M* e  G0 E7 c# I4 u
37 for
# Z9 h  {- {6 E8 t循环命令
& O; Z$ v0 S3 U4 n" \! W% P; {2 o这个比较复杂,请对照 for/? 来看
/ C, X. [1 N$ ?# F' ]( Ufor %%i in (c: d: e: f do echo %%i
  B' _- J# E% V# B依次调用小括号里的每个字符串,执行 do 后面的命令
5 p8 s  @: k9 I1 \! X注意%%i,在批处理中 for 语句调用参数用2个%
/ [" [0 V0 f% Q( P默认的字符串分隔符是"空格键","Tab键","回车键"
4 `3 a& [# V8 t# ifor %%i in (*.txt) do find "abc" %%i
; ^6 q- c( k$ b* }对当前目录里所有的txt文件执行 find 命令
! Y8 n. B' Y) j" W4 Z" a) A7 Dfor /r . %%i in (*.txt) do find "abc" %%i
  f, e: p" G) a+ G  \' x在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行+ `$ S% d- Y# a7 h- w
for /r . %%i in (.) do echo %%~pni
: F) }& N3 U9 |: q% [( {显示当前目录名和所有子目录名,包括路径,不包括盘符, K- F/ w' H# Z
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
& X- F, l/ v5 ]) k0 X* M. K把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
, S: K+ D1 y9 f$ r# B# Rfor /l %%i in (2,1,8) do echo %%i' m$ t2 `0 o+ X/ J5 x$ n3 V
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
4 c; u. F) G8 }; c) gfor /f %%i in ('set') do echo %%i: f  Y# O3 [  ^! _
对 set 命令的输出结果循环调用,每行一个$ i8 j" C7 ^8 H" G
for /f "eol=P" %%i in ('set') do echo %%i" d9 r& ~6 c$ O* N- P3 A( K
取 set 命令的输出结果,忽略以 P 开头的那几行
, y0 P: L' A3 Qfor /f %%i in (d:mp3.txt) do echo %%i
, J: I, {) ~$ D* z3 U* M显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称; ?2 c+ n8 R; y) K* O, x2 O# w
for /f "delims=" %%i in (d:mp3.txt) do echo %%i
' ]- k2 z2 s" G# W1 }4 Y显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称6 d/ c9 `5 I& `3 `0 c. S
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
- d, h& V$ Q4 q, w9 E% _) f对 dir 命令的结果,跳过前面5行,余下的每行取第4列
1 Q" U+ @/ v8 b/ X每列之间的分隔符为默认的"空格"
+ p# ]2 A: e; P/ l  [( I; H可以注意到 dir 命令输出的前5行是没有文件名的
, \9 n/ R3 C7 t" y' |: c3 Q5 [for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (4 T. K" \6 F! F9 z5 g! E- ^
echo %%a
9 G$ ~8 N) g5 `# J  V( Jecho %%b
+ U. a1 ?9 N0 ?8 Q7 }echo %%c+ N" a, G! z4 g, @' P/ m
)& U, q* D+ w% @- W" r
对 date /t 的输出结果,每行取1、2、3列
* V5 p+ }8 v2 ~3 L% Z. X0 P, A- a7 s第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列, O( n7 T! y9 m  [: q2 r% Q
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
! z" g7 Z2 p+ j* ]/ ?" `其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
% e+ e  c1 f( Z  {7 c, }- mfor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b7 L' C$ W. {0 {2 E2 x
取第2列给 %%a ,其后的列都给 %%b
# f$ O, `2 V. R* h% k; y! j4 E, m* n
38 subst (外部命令)& T  E# U' [- p9 u
映射磁盘。9 S/ K0 _6 v0 R/ h% U- U
subst z: serverd #这样输入z:就可以访问serverd了; K* D( R6 w/ p5 u
subst z: /d #取消该映射4 v9 `. A1 K2 V( ?  o
subst #显示目前所有的映时: c) l7 f/ |/ n* D  h

9 v0 o5 Y+ P; x# u6 s8 v39 xcopy (外部命令)" b8 U0 P% X; O. E7 J
文件拷贝
5 X' C4 S' [! I- j/ n9 Y% `xcopy d:mp3 e:mp3 /s/e/i/y8 |) m3 q' _* I$ S6 _- O
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
/ n/ F; Z* ^3 E9 l& H加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问; X) H  ^: c2 A6 m5 y+ C7 j

: `& |7 z* M; I3 b; o常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退0 }5 y, P. y, c7 E! E
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:
      7 ^; ?2 U3 Y5 \/ P

      ?1 h. y1 x5 s' \2 Y5 s( F9 ?6 b
@echo off
/ e' P" ^+ M9 s; y" Tset p=aaa: q  ~+ w6 m9 T9 O% C0 d8 N. a+ O
if %p%==aaa (; t% m1 M0 i3 R- ]8 W7 f
echo %p%6 P3 ^0 P% t8 \1 L8 h, y/ `
set p=bbb+ t; M4 \( u, i) g; d' ?
echo %p%; Q  \0 H! [. [" a  c
)7 {" n7 E+ [2 k! m6 l4 G
pause
  • 截图:
    / s! E  P1 e; @6 h9 c+ N- G1 V% n
  • 2.批处理.bat 文件中输出中文乱码

    # [+ V( Z: k" C  {, c; H
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:. |, h8 {# a( m: A8 s, r
    • 效果截图:
      # J$ l+ U& \+ q  V2 n5 S5 u% Z7 G* Q% j( m

    8 N5 s$ I/ s" w3 E/ d5 ?2 E" l

! B' Y3 n$ @, a# k# c

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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