扫一扫,微信登陆

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

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

    - b3 R" l1 k% i! S/ V) o
    • DOS批处理和PS批处理。
    • PS批处理是基于强大的图片编辑软件
    • Photoshop的,用来批量处理图片的脚本;
    • 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
    • DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
      & q$ X. _# r1 x- [0 ?* b
  • 批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的! y* c# E  E/ c7 y9 ~" @( L
    命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行
  • 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件

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

    & N  J( n# K0 L& W. H
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
- B# a7 I: h5 @1 w, F! Z

$ C! D# E  v0 i! y# T# Y5 p* ~Windows Batch 常用命令6 w3 f% h/ ^3 ]
1 echo 和 @0 W& A8 M/ I/ o& j, `
回显命令
' n+ r5 g; a/ v6 m& S5 j@  #关闭单行回显2 E* ]6 X& }! A8 A, Q
echo off  #从下一行开始关闭回显* y- t# V+ k# S) O0 J6 N
@echo off  #从本行开始关闭回显。一般批处理第一行都是这个
# v0 G" Z4 N9 z0 L$ v  O8 Necho on #从下一行开始打开回显9 k- Q: e2 j9 h' J, P, o7 |
echo #显示当前是 echo off 状态还是 echo on 状态1 l( ]* u) z- k4 X0 x0 T& k) H
echo. #输出一个”回车换行”,空白行; d. Y% _6 b0 L" ~
#(同echo, echo; echo+ echo[ echo] echo/ echo)
1 f; g2 X) J5 L6 R
' Y0 |) {1 |8 v$ m, [2 errorlevel
+ z* G( b) t. r! hecho %errorlevel%; d/ v  ?6 w2 k- H  t  X& G  D% D2 X
每个命令运行结束,可以用这个命令行格式查看返回码
& q1 s. {; f- U7 E0 Z& c4 ?9 Q默认值为0,一般命令执行出错会设 errorlevel 为1
- L. g- i: ]9 B  v; v/ H
" ]- z! Q  K$ W- G1 s. S' p3 dir& t- S  r( r- h2 }3 o
显示文件夹内容% \* V+ M& v+ ~/ c7 N6 }- r: F; Y
dir #显示当前目录中的文件和子目录) S2 r" S3 h+ r. G
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件+ W2 U* G7 r0 C3 N' O
dir c: /a:d #显示 C 盘当前目录中的目录) c0 v; u$ _' c
dir c: /a:-d #显示 C 盘根目录中的文件
7 L' o2 N' N' `. y; rdir c: /b/p #/b只显示文件名,/p分页显示0 i7 q! D* V, G2 i$ W0 l
dir *.exe /s #显示当前目录和子目录里所有的.exe文件- Y" e3 }1 V. o" e) P( L9 A

* U4 h8 s# [7 J4 Q( X3 f2 i4 cd/ q/ a. b6 U- b! ^* j" o5 |( N
切换目录; _: {0 g& H! Y. d% B% x5 S7 Q% ^
cd #进入根目录
5 v( s1 s. J- {" ~! `cd #显示当前目录
. k( y, Y7 t7 hcd /d d:sdk #可以同时更改盘符和目录4 p2 I; n5 t; ~
' D3 M$ B4 Q( j7 @
5 md2 D; q, t; b, J# V
创建目录
9 B; ^- b& R0 J. p3 R% b2 {md d:abc #如果 d:a 不存在,将会自动创建中级目录; w( F; [. z3 q3 T
#如果命令扩展名被停用,则需要键入 mkdir abc+ s- E" r5 g) j5 |" }7 C3 p
6 W* w" @1 E1 N
6 rd" \! t' v2 P& X- T6 y' v3 e
删除目录
, D8 q, u1 v: u3 Yrd abc #删除当前目录里的 abc 子目录,要求为空目录
+ M8 N, l$ E" t) Q% {rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式/ \9 K5 S- W) E* z

9 I0 ]- e  Y, e/ ~2 T9 X( A' D7 del3 J+ s. O" ]+ d: t
删除文件
& s1 V0 S2 ?+ P5 F& [del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
# H$ k$ c$ ^' I6 T$ bdel /q/a/f d:temp*.*
6 s2 z; b* H, X! c$ @& ]删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录8 n! f3 T) s' g
del /q/a/f/s d:temp*.*; A; U% }/ O) s! n* ^4 z0 o
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
. {" ~: J8 j" h. p' P/ g4 f- Y/ g4 l& Q
8 ren
) b* }6 C9 m7 ?重命名命令
* r% |0 k4 W. X/ ~, Eren d:temp tmp #支持对文件夹的重命名
* G+ `1 x! c; ]. x+ ]% [5 ]
) ~2 S  q# {* @: c$ S9 cls/ f1 I3 }) H" i$ N: m0 B
清屏
1 Y) o2 U- C  j4 W: u10 type
, G. C8 D2 `1 }5 @, Z5 ~  O显示文件内容8 j! J) q: W: u! f
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
; {& U( v# f: ptype *.txt #显示当前目录里所有.txt文件的内容/ C( f$ B/ _; V+ R% m/ E+ m

% _- f6 ]6 E7 z0 C" B( s11 copy
4 a& }! N. v; T' [- B( S( j7 g拷贝文件
$ X2 o; k" E# v! u' `copy c:test.txt d:test.bak6 z4 U: [. {8 b: h; U0 s! c
复制 c:test.txt 文件到 d: ,并重命名为 test.bak
5 f: S  U- r# }" h- e2 Ycopy con test.txt+ t- h4 ]6 Y6 @
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
* x- J! t$ w. acon代表屏幕,prn代表打印机,nul代表空设备& Y1 |" q4 T6 F" s
copy 1.txt + 2.txt 3.txt* s" y& _% x+ h9 S# F' X
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件, G; P( p9 ?1 \# J
如果不指定 3.txt ,则保存到 1.txt; @" n" A$ ~  [2 @( A
copy test.txt +" {0 V; |' e0 o. p% L# a
复制文件到自己,实际上是修改了文件日期
, `4 M! }7 B2 K# |, E1 P: \' T8 p# T: l
12 title1 B' O  f/ n) e9 A! }
设置cmd窗口的标题
7 _3 K+ T5 h% y' t- otitle 新标题 #可以看到cmd窗口的标题栏变了# E2 A) L& d: H! a" ]
  o4 Y0 @. ]( b5 e% O/ A+ s
13 ver- r% Y# Q4 w6 M- n) G0 K
显示系统版本
3 {6 T2 r2 B- G, n! K! N, |1 @
8 J0 t* ?) m! O4 E8 M; p6 r14 label 和 vol. u2 @: L) _4 x" l
设置卷标
) Z) v3 B6 o6 l5 |+ Z) t* v% mvol #显示卷标8 m5 @2 o9 E/ j. H: q
label #显示卷标,同时提示输入新卷标; k; f2 Z. ?* K1 a$ V2 Z- v; X2 P
label c:system #设置C盘的卷标为 system
6 s- X6 u) C7 W9 A& K4 H5 Q) S- n; l* u* p2 a( `+ F. g
15 pause# N1 F& b7 Y" ?0 r. f
暂停命令+ o! K  }" W1 X4 g' ^

5 e8 G! t/ b1 b' L  W5 X16 rem 和 ::& o0 u) H; O* s& O5 }- I
注释命令* r( s( {3 H. r. b* d
注释行不执行操作
8 Z4 L' [- a. z1 j7 N% U! d) c: m5 d- m0 y+ C! }! e% ^
17 date 和 time) O* e* t/ V: O% \" f
日期和时间! n/ n8 C) @! G7 e; c+ v
date #显示当前日期,并提示输入新日期,按"回车"略过输入
( _# c: I6 U6 R1 j: mdate/t #只显示当前日期,不提示输入新日期
' n/ w* ^7 L% A; Htime #显示当前时间,并提示输入新时间,按"回车"略过输入% c9 ^8 R( x+ k+ E8 {
time/t #只显示当前时间,不提示输入新时间
' m1 q) |7 z' R) B
# S6 @' h7 w! }18 goto 和 :  |. A' ^/ R6 Q& l
跳转命令9 b1 y  O" }6 u5 G5 _
:label #行首为:表示该行是标签行,标签行不执行操作8 Q* Q* D1 ^! {1 J2 c5 M/ j# I- \! X
goto label #跳转到指定的标签那一行4 K  |2 D' m; J; x
& B. i9 j+ \3 G3 j& y4 B5 x0 u
19 find (外部命令)
' r9 s$ [( q. r! E查找命令
5 L4 Y3 V3 \( [$ z8 E6 Bfind "abc" c:test.txt! C$ z+ O& x0 c& m! ~& H
在 c:test.txt 文件里查找含 abc 字符串的行
+ Q0 R3 [5 f6 D- l  I( {如果找不到,将设 errorlevel 返回码为1
" y! y" \! Y3 w3 _2 I5 Pfind /i “abc” c:test.txt. T8 B; K0 M4 }! K
查找含 abc 的行,忽略大小写
% T) q' m* r# }( {4 F9 O  U% o. o* lfind /c "abc" c:test.txt( W. q& ~# y) x6 x- v4 v- S- M
显示含 abc 的行的行数, D  ?% g* ~( J) e3 w: W

- h3 f0 x% X. y1 [- a20 more (外部命令)
, D, `3 ?, i. [; A# O; r* F- G逐屏显示. I9 t- S/ S, L% `
more c:test.txt #逐屏显示 c:test.txt 的文件内容9 A5 a  B% V9 O+ }

( P8 A$ Y; n3 \, K) O* A21 tree
/ a0 p$ Z1 a: o" F9 O显示目录结构; W2 }8 I; l- D! z3 c5 f
tree d: #显示D盘的文件目录结构+ H- Z$ Z, d! m

3 Z! f1 {6 u( M3 G6 H8 p22 &
  X9 F( r# Q1 p/ k顺序执行多条命令,而不管命令是否执行成功* r. S8 R1 n- s% Y/ P8 Z+ X
* Y3 K; J! l6 L2 E) o0 Q- ?3 }
23 &&
! S( m% L& }+ W, f顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
0 p* S: z( O/ }, ?; y9 Lfind "ok" c:test.txt && echo 成功
1 r& f' v% \+ A! A如果找到了"ok"字样,就显示"成功",找不到就不显示9 w6 H( }/ B. O4 Y6 C$ ]% y
2 j2 P0 Z5 U  F5 V8 U1 I6 `. Y
24 ||
% ^5 O( q. L1 [) N/ k. \9 ?5 \顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令7 n5 W* b3 Z, v4 n& I2 n- |/ s
find "ok" c:test.txt || echo 不成功! O, O; L$ R( c0 h! j* \( z, U
如果找不到"ok"字样,就显示"不成功",找到了就不显示
" C! A4 j1 v% h* `, C5 i  s: h& l3 ^
25 |* |& D  u5 u: D* \$ H" c  u/ F
管道命令
  l, u/ Z/ A7 [1 `& y- S8 ^- Sdir *.* /s/a | find /c ".exe"
2 i- x: N3 l6 O* U6 W5 P管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令" r" m3 i: U$ T+ b
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
' W; [, c* F5 H0 |* A) mtype c:test.txt|more
+ F' u  U0 [  T/ T' q: x) c这个和 more c:test.txt 的效果是一样的0 p- Y8 Y+ j- t

( ]/ \$ @4 ~7 w/ y; F  X26 > 和 >>
6 ]' J6 N& V8 H  Z3 d输出重定向命令
/ S* ]' l7 c! y> 清除文件中原有的内容后再写入
  m3 C- C; R5 `1 }8 f( w4 }  f>> 追加内容到文件末尾,而不会清除原有的内容6 y& }9 q: H. Q5 u3 \4 p6 E
主要将本来显示在屏幕上的内容输出到指定文件中
/ }! ]% T$ d% [指定文件如果不存在,则自动生成该文件( g3 W5 O2 c( ]/ @9 C* y
type c:test.txt >prn5 i0 k% z& ?) @- O" I
屏幕上不显示文件内容,转向输出到打印机0 ]0 Z' H+ l' ^6 L) y
echo hello world>con
( ^- ?% Y! x2 p3 }7 H2 I在屏幕上显示hello world,实际上所有输出都是默认 >con 的' q( M* _& R+ C9 ^, }, P% Q5 q
copy c:test.txt f: >nul$ E( N, S7 B! M4 S
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息% y( g$ B+ r, `: Z; I4 u& e
copy c:test.txt f: >nul 2>nul; R; m/ n0 D* Y6 n& M4 C$ ]
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息1 M, J  C) G5 P1 E! o, t
echo ^^W ^> ^W>c:test.txt
  s; _5 u5 b: J1 e- u! N生成的文件内容为 ^W > W2 n6 B8 R9 j! x: S3 Q
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号0 Q: f1 l( g2 T1 M2 \( T
0 U9 ]  r, L4 k* V) d' W& r
27 <2 z( k; g9 N) G9 _$ Q
从文件中获得输入信息,而不是从屏幕上* z: Z& J2 T4 X1 g0 `- E3 F
一般用于 date time label 等需要等待输入的命令" o( B7 s0 r) u+ j7 _4 d
@echo off' ?" b: K5 {! q4 h( I, X
echo 2005-05-01>temp.txt3 j" y$ W; ?( D3 c; g! l
date <temp.txt
. @! N; N5 P. ?% s) rdel temp.txt
/ L( a- c' M  o3 ~. v: B这样就可以不等待输入直接修改当前日期: N* T- p+ L; Z) i" I9 z
/ v7 S: k- C8 b4 \3 p$ {
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
9 A& v. ?" B0 ?命令行传递给批处理的参数: B+ c# V8 y9 ?8 w$ C
%0 批处理文件本身7 y: C6 H( ?& m) z! \9 x
%1 第一个参数
1 f$ z+ r/ t% S+ p0 I%9 第九个参数
/ C6 ]( w) `9 j! W$ w! i%* 从第一个参数开始的所有参数& S/ `5 C+ Y5 u& r0 e, `
批参数(%n)的替代已被增强。您可以使用以下语法:
+ h) Z6 c7 x. q& z%~1 - 删除引号(" ), 扩充 %17 U+ h7 Z, l0 B/ @0 ^
%~f1 - 将 %1 扩充到一个完全合格的路径名7 G* X* w' D+ n7 M2 i  Y
%~d1 - 仅将 %1 扩充到一个驱动器号9 ~% n( N. n4 h0 d+ ?  Y2 x; X' k
%~p1 - 仅将 %1 扩充到一个路径% O6 D/ _6 o7 G
%~n1 - 仅将 %1 扩充到一个文件名' S9 `$ {  i5 |* C/ x1 y% i
%~x1 - 仅将 %1 扩充到一个文件扩展名. G8 o, p5 P% w- E  H
%~s1 - 扩充的路径指含有短名
+ n/ B5 t+ k0 ~6 E! G) p. b- {%~a1 - 将 %1 扩充到文件属性
6 e3 B2 u3 Q! K/ E0 S  M* V%~t1 - 将 %1 扩充到文件的日期/时间8 l* s2 x1 i& @$ E6 F# M, N
%~z1 - 将 %1 扩充到文件的大小
) i3 N6 I, c2 Z( V, A8 D; d& b%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
3 H, a  _- r; C扩充到找到的第一个完全合格的名称。如果环境
  ]  I; i* A* m& K! c变量名未被定义,或者没有找到文件,此组合键会/ W% O* x7 d4 B
扩充到空字符串) D3 b) `' I+ U6 {" N
可以组合修定符来取得多重结果:* a0 a" g3 j' u( N$ y" c3 o
%~dp1 - 只将 %1 扩展到驱动器号和路径
& o; G2 o. g+ w' t  m7 B& X3 Q6 f8 y+ {%~nx1 - 只将 %1 扩展到文件名和扩展名+ e7 ]. q+ e" h! Z1 X
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,7 U8 ~& j: v1 R& B# ^+ [
并扩展到找到的第一个文件的驱动器号和路径。2 K! y" {& i1 o( u! d( T
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
+ ]" t  h/ c1 w. z2 {( |4 C可以参照 call/? 或 for/? 看出每个参数的含意
3 y& E+ h% W2 Y) ^6 g, D: {) decho load "%%1" "%%2">c:test.txt: B4 W8 z/ ~$ i
生成的文件内容为 load "%1"  "%2"
! y  ?; u. q) {: A# q; e批处理文件里,用这个格式把命令行参数输出到文件2 b/ i* z  p4 b0 S, x$ f4 I" h
3 N- a- C! D- s) H; B/ J6 x
29 if! P  I. k- S  C* F% c1 `
判断命令
' f0 p* F9 `. G. ]if "%1"=="/a" echo 第一个参数是/a9 O8 O& g7 M; _% `. @1 `
if /i "%1" equ "/a" echo 第一个参数是/a
6 E5 H6 d( ?7 B4 k7 Q9 ]% g/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
: {4 t# i9 I% z0 Mif exist c:test.bat echo 存在c:test.bat文件$ ~" p: w4 h4 J! y9 s
if not exist c:windows (
7 D: P- T2 ~3 {  S  ^8 p5 N1 Qecho 不存在c:windows文件夹7 _/ ?( @$ u$ U2 T  t8 d" M
)
, t) ~* l& R: ]if exist c:test.bat (& N* W( E  Y( T( }  u
echo 存在c:test.bat
( f! J& k( o7 y( |% j$ g+ x' P* h* x) else (
: n8 ]# R" f2 g3 O5 _2 P' I3 i( F1 E6 oecho 不存在c:test.bat3 [' M' D& ?8 x0 R) P
)
) p) ?) Q6 r$ `. D30 setlocal 和 endlocal
# B' Q* U/ O9 M, V8 H; k: u4 ^设置”命令扩展名”和”延缓环境变量扩充”
. r" w8 ~* F; ?6 h. CSETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
* _' \& @1 s( F3 V( u: ~* xSETLOCAL DISABLEEXTENSIONS #停用"命令扩展名": y* U# H7 N4 |1 M+ N
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"0 f/ _' Y- n0 T
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"# t& X3 f6 z9 Q4 q2 `9 K
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态$ e7 n9 g, f9 @2 s
“命令扩展名”默认为启用
, C1 v1 ~% @) w( M“延缓环境变量扩充”默认为停用
7 P! R- d; i- y: c0 f$ n批处理结束系统会自动恢复默认值9 d" P! T7 E( C% Y$ h6 R
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
% o& u4 a/ q4 y4 U序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
* V, K7 E( U5 ]* r" w1 Z4 Q' h保程序能在其它系统上正确运行
9 H0 l3 N- |  B1 q"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
3 q* T' g& ]: q, @9 W0 x/ \$ p- j2 K: M
31 set7 `' w6 Q9 s3 C4 {
设置变量) q$ _7 d  s: ]+ ~
引用变量可在变量名前后加 % ,即 %变量名%
+ t# ~5 |7 [0 d/ |set #显示目前所有可用的变量,包括系统变量和自定义的变量
# J9 }3 a8 }. C* Decho %SystemDrive% #显示系统盘盘符。系统变量可以直接引用6 G9 Y+ _* u5 h) ~4 A% X7 u3 g# m
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
6 `% [3 v* e7 r# h1 m8 Cset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
: B" c8 V1 \" v& J' Hecho %p% #显示变量p代表的字符串,即aa1bb1aa2bb2! M+ ]. P& n' D+ z, X0 N5 Z- a6 X
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb27 P! |6 F: h6 l( \- ~8 N
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2$ ~6 h4 O# k, j7 F9 c$ b1 p7 R
echo %p:~0,3% #显示前3个字符,即aa1
5 d5 h" m) L! Y5 `! Pecho %p:~-2% #显示最后面的2个字符,即b2
7 s' \+ \* X2 {4 W. L5 d. Gecho %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
/ _3 a: R( ?* J. k* i  D& S0 m! z8 {echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2( n5 B1 M/ y  q& T+ A# }) _) X
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2. c: P+ r2 F# s
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb24 f! |) A: W4 ]) A1 G
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2* e, ]' R8 b1 h( l% V
set /a p=39 #设置p为数值型变量,值为39
- g4 Q: I  m0 @0 z3 I4 uset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
+ b* x5 ]$ B# |8 f% Eset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
; S8 O* v- w6 _- I5 [" R# ~# A5 Gset /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
+ t* W& C' K, {( @: ~5 ]6 kset p= #取消p变量
* X3 p. A" T0 Y3 N) Sset /p p=请输入' A) G0 J4 ?3 x% q3 r. ]% R
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
9 N& Q; F( h/ w5 A注意这条可以用来取代 choice 命令
1 @; a. S; {8 w3 }. [  `) ^注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
0 P- N. P# h* f- A@echo off
, E4 r. ]9 `2 Q& v3 \" wset p=aaa0 R6 a9 {. O0 \6 F5 ~
if %p%==aaa (
4 B$ P. ?2 o2 decho %p%
) V  G, O/ [6 t/ L+ `9 sset p=bbb
: K* F+ g6 U4 ~- lecho %p%, F+ e5 Q% J& I6 A
)
* U+ ^* \2 ^( |$ Y9 h* C* u- E结果将显示
+ W- Z! `( I' i" B& f$ G) {aaa
6 L( q6 G" @6 |% ]0 ~- t2 \aaa
" z3 e6 @+ c! K  |( f. z: J因为在读取 if 语句时已经将所有 %p% 替换为aaa; v9 D" N9 {) J. n2 I2 |& |
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
  v& J" S9 y( F可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
- L  ^1 Y* \3 D( |& k0 K  O( ^0 M' u5 l@echo off/ @+ D2 s4 P" N) g) ~/ x% S
SETLOCAL ENABLEDELAYEDEXPANSION7 A1 V7 w1 ^/ ?
set p=aaa1 M4 ~& `& T0 Y6 Q; p5 H
if %p%==aaa (9 j6 G2 j' J6 I9 U/ P% u( B4 k
echo %p%+ A5 Q& ?3 h# G; I- `; X
set p=bbb
* m' L/ y$ k4 }4 O9 }( c2 }" Y$ V$ Eecho !p!1 w# i1 @( J2 ^: s
)
) _" _2 ~  z+ u) z+ k/ o- j  kENDLOCAL/ [+ ^# F$ T, }  Z
结果将显示1 v# S$ W1 X$ a4 x! ~7 _
aaa2 v8 Z7 n/ p' S5 H" S
bbb: I/ e- l9 a9 O2 l5 X
还有几个动态变量,运行 set 看不到
, L* Q7 g$ P% {2 l' A( M) T" v%CD% #代表当前目录的字符串
% ]! z) r% U+ r%DATE% #当前日期9 g$ @% B% ]* D
%TIME% #当前时间; r; A9 }5 ~. G+ S
%RANDOM% #随机整数,介于0~32767
, i2 |9 A7 Q; o2 R% M- T1 P%ERRORLEVEL% #当前 ERRORLEVEL 值$ f/ ]" R  s! k5 J
%CMDEXTVERSION% #当前命令处理器扩展名版本号
0 l+ S( g3 n6 m1 H$ h%CMDCMDLINE% #调用命令处理器的原始命令行' Q4 {2 `- O. u: u4 [
可以用echo命令查看每个变量值,如 echo %time%
* b$ q$ k( k( N8 G; V( l注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到) n6 m& k0 O! ]3 |9 h; v
6 `! B  E8 W8 S4 O! P
32 start
; B& b7 m! A4 E% o- E* W批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
# _7 C* s& S: n0 c( I3 Z
; _- d$ N$ a% m% p$ l33 call! K$ x1 S) K8 E" |8 ~! @' a
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行5 e# h2 y  {- i  B
有时有的应用程序用start调用出错的,也可以call调用
9 {! C8 e8 J6 \! |% Q* ~: O0 k$ X$ O/ B: X' C+ R
34 choice (外部命令)* m. D0 \7 ]& d% h) h- s
选择命令% T3 P9 R4 D* Z, a. ^# ^
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
, ?( T; N  |! k% t) xwin98里是choice.com
# F- @0 [1 }* [' |' Awin2000pro里没有,可以从win98里拷过来( I* ]& z% ?/ G2 O; g
win2003里是choice.exe/ m* R5 z' S6 n1 H3 J. w
choice /N /C y /T 5 /D y>nul" X* u+ x8 E) ~  j/ p: i) r
延时5秒7 |) C- U; i: @1 S3 r; K

' J: E8 C8 h: |( u$ J35 assoc 和 ftype
( f" {" \; K, o# W& r* l文件关联
( }, w# |( [- _- e6 j- z* I1 Uassoc 设置'文件扩展名'关联,关联到'文件类型'+ A6 R. m6 `  a0 l. p4 u4 t4 m
ftype 设置'文件类型'关联,关联到'执行程序和参数'
. w) W! y+ M8 A6 a" ?0 a当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开3 U' S* n+ k7 l! Q( G! G
而是先判断.txt属于 txtfile '文件类型'  y- j- w9 L$ e
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
1 H; }2 {7 n3 w: l3 S可以在"文件夹选项"→"文件类型"里修改这2种关联6 z1 _; ~+ H: G
assoc #显示所有'文件扩展名'关联" j9 v, S9 u- O6 G: }
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile! F  P3 L2 h) M/ T3 h! X
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
" g1 w( M& x6 T" Z5 Tassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
2 e- X, w, ^5 \% u" x9 J" L% ^ftype #显示所有'文件类型'关联7 I: S) }, v% P/ k- S; h
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*4 ~2 t  o3 b4 j, j6 }! y$ A* K* W
assoc .txt=Word.Document.8. i! X* `) h5 [2 R, y0 s
设置.txt为word类型的文档,可以看到.txt文件的图标都变了
/ j) G+ f9 t. G$ f. x! x8 ^# Q& y) kassoc .txt=txtfile
  [- v" X& ?% B' h恢复.txt的正确关联% ?, @' ~- T9 S; u; f: w6 r7 F. J% u
ftype exefile="%1" %*3 z+ |' G( u4 W( M( s+ l6 b5 m7 R
恢复 exefile 的正确关联7 v7 S1 [# O4 U2 z3 D0 U% \
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
  n; U; F. b1 s" M1 e
8 A; A: ~5 s: o8 ?36 pushd 和 popd0 |: Z) u! h9 M" e) K  N
切换当前目录- E2 Y  z( o+ ]4 j; ^. n/ c
@echo off1 m  Z1 O# E% a5 h1 x" J) {3 g
c: & cd & md mp3 #在 C: 建立 mp3 文件夹
: V) Y: U' W$ D1 ~" xmd d:mp4 #在 D: 建立 mp4 文件夹7 {+ O* f* V$ L$ Y$ g
cd /d d:mp4 #更改当前目录为 d:mp4/ U# h& b* z( Y2 X& J0 B
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
9 c& i" D$ Z  c8 xpopd #恢复当前目录为刚才保存的 d:mp4% f4 O2 Y  A) j# S, ], B

7 h+ K2 S' j0 e6 t! k37 for% f( B/ Z5 @4 a& E7 \: r4 ]2 _; u
循环命令0 q4 G7 r- w9 P0 G
这个比较复杂,请对照 for/? 来看+ Q! K/ X0 r8 ^" C( {& M& K) t% `
for %%i in (c: d: e: f do echo %%i6 r# ]$ r4 _& j0 i4 r
依次调用小括号里的每个字符串,执行 do 后面的命令
7 d9 N# r) Q: W( G注意%%i,在批处理中 for 语句调用参数用2个%- b8 _7 a+ s0 ^% }# Z' E; ~
默认的字符串分隔符是"空格键","Tab键","回车键"! ~/ J6 h. A9 W; k, Z
for %%i in (*.txt) do find "abc" %%i6 O6 Q3 S5 r% Z0 f3 [7 b
对当前目录里所有的txt文件执行 find 命令5 y- K! k9 Q0 H/ K( j; {
for /r . %%i in (*.txt) do find "abc" %%i: k; s1 x6 ?* ^, n! ]
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行  }9 v# ?, N9 t2 ~
for /r . %%i in (.) do echo %%~pni
3 Q; }& a; N* r9 m4 }显示当前目录名和所有子目录名,包括路径,不包括盘符
& `; j3 Q7 c4 {for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
5 S* k! r4 c& E; i% ], Z把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
- w" Y/ K0 a* Wfor /l %%i in (2,1,8) do echo %%i' B8 h9 V& Z" o" ~2 Q
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1/ B9 N; f$ n2 q
for /f %%i in ('set') do echo %%i
- d; R% L2 q1 ^% l6 R4 u% r对 set 命令的输出结果循环调用,每行一个
- S' U( _; A, Z3 p5 tfor /f "eol=P" %%i in ('set') do echo %%i
$ Y& T* E' t0 k" `6 ?) S* b取 set 命令的输出结果,忽略以 P 开头的那几行
* F+ n, D1 \/ V( Q, ?for /f %%i in (d:mp3.txt) do echo %%i2 i9 n7 B' E) O  G+ ]' }" k
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称+ _6 ~5 F. T3 h4 O' |9 u9 o0 c) L
for /f "delims=" %%i in (d:mp3.txt) do echo %%i
: t9 U3 K, @4 r3 A显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
& w# v" @  l1 V, ~9 B- i  sfor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a9 J: D0 f2 q5 R, v6 M; T3 E
对 dir 命令的结果,跳过前面5行,余下的每行取第4列; s; B$ ~6 }6 u. G( a
每列之间的分隔符为默认的"空格"5 `6 S" S- s8 o' K2 Y
可以注意到 dir 命令输出的前5行是没有文件名的% A. B2 O1 k6 F/ c2 `
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (( e- \. D8 D0 {% u7 U
echo %%a
7 q0 H/ Q" g$ W8 k5 ~6 B! z, pecho %%b% p* Z4 Q- w) [) i) k$ i
echo %%c
7 }2 r; y$ |% S)
3 r% }: S2 ?4 Q2 @5 y" F% O+ d对 date /t 的输出结果,每行取1、2、3列) Q/ ~: D5 H# U- O3 |6 E
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
) Y" P; y9 y/ J/ _- @  j7 i- e分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"" E- G. N- b# @0 n
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的3 J8 j+ d+ b/ f0 y
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b) c9 ]0 m: W, Z0 ?; ?- W# Z' Q: d4 |
取第2列给 %%a ,其后的列都给 %%b
) J4 S9 r- G+ A6 [# Y1 ~( z# ^9 s: }2 Y
38 subst (外部命令)
4 r6 b7 e# I% W* z3 S& B9 W, F/ m& m映射磁盘。
0 F+ {4 k5 Q! A/ z* H8 c: ?subst z: serverd #这样输入z:就可以访问serverd了
$ @0 r* W/ T4 ^7 D2 j1 g1 P  ssubst z: /d #取消该映射/ u- b! J2 A  S- I  I
subst #显示目前所有的映时" s9 G/ V. r, i3 `  Q2 T

( t0 k+ }1 Q8 i( Q! m; \39 xcopy (外部命令)
- d$ i9 P* B% z6 @( Q! }文件拷贝0 t# }8 q/ _3 x1 M( \) u
xcopy d:mp3 e:mp3 /s/e/i/y* ~9 O' v! d& n3 h# j! T' X7 O
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
: p/ T% t; U( z加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问. P( J0 ^& i- c7 K3 F& q  F

7 K7 y5 M& r4 _常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
    / z2 K; P, y. F" X: s: a: M
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:& ?! w2 V' K. c
    8 u6 p: E) ^$ w, K
@echo off" x/ k7 a+ S7 E" W1 f( y
set p=aaa9 s- B* l; g* \6 Y0 n7 c0 p4 c
if %p%==aaa (! H6 {- E: a6 A1 l8 p
echo %p%
  m6 d: @! b( S7 }. wset p=bbb$ D1 H* I' J4 @
echo %p%
5 B2 d+ t* W6 Q8 W. x)0 A( L2 a) ~: U1 }4 y# W" U4 K
pause
  • 截图:' n7 O' V7 f9 P" M
  • 2.批处理.bat 文件中输出中文乱码
    # Q  S8 A2 V$ V+ c/ Z% ^
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:
      2 y' ]. e% E  ~5 l; L
    • 效果截图:
      : _% ?- Z9 L  p* I; ^. F6 k) t. B6 Y5 v% l. @& y* o& L

    * R; u; n' R8 W& }
! p- \/ t/ m2 F3 f

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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