请选择 进入手机版 | 继续访问电脑版

扫一扫,微信登陆

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

搜索
查看: 432|回复: 0

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

[复制链接]

190

主题

211

帖子

1055

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1055
QQ
发表于 2021-6-25 19:48:12 | 显示全部楼层 |阅读模式
Windows批处理(cmd/bat)常用命令教程
简单详细,建议收藏
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
  • 2.批处理.bat 文件中输出中文乱码
  • 解决方法在文章末尾!7 H0 K) A% V/ {$ K; y& {
前言
  • 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效
    + }- f! f4 J! h/ V
在Windows中善用批处理可以简化很多重复工作
什么是批处理?
  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
    # U! j3 O3 L+ w0 f9 H* z名为bat
  • 目前比较常见 的批处理包含两类:
    # l6 B* [; \3 E( F8 H' V3 H; M' N8 x
    • DOS批处理和PS批处理。
    • PS批处理是基于强大的图片编辑软件
    • Photoshop的,用来批量处理图片的脚本;
    • 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
    • DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
      / |; U' k  @' M. p$ _
  • 批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
    " \; }* R. K# a- Y; V8 x命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行
  • 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件

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

    3 t" p( R; J/ t- s1 ~8 G
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?

  l9 M' q" {" w* @3 T$ R5 W3 ?& R( O% R2 c; D. a" q
Windows Batch 常用命令5 g6 S; N% t) t- i/ n' P) N1 g8 P
1 echo 和 @- ^, |3 o- H, o4 `7 U" T: }
回显命令7 B1 Q9 e8 \- I& `; Z9 i
@  #关闭单行回显* O" k3 ]. \$ ?' L
echo off  #从下一行开始关闭回显0 `3 f; Z3 ], m3 i
@echo off  #从本行开始关闭回显。一般批处理第一行都是这个0 ^5 T# _% A0 x% F
echo on #从下一行开始打开回显
  I1 ~  ]: X) I3 gecho #显示当前是 echo off 状态还是 echo on 状态
  {7 T+ R% A7 h3 a0 [1 _5 L; N- Fecho. #输出一个”回车换行”,空白行  M: }/ i9 U7 \# Q/ f* o
#(同echo, echo; echo+ echo[ echo] echo/ echo)
% E* W3 _8 e8 }2 p% f4 _
/ ]% ~7 |  n* R* K2 errorlevel
4 p4 k0 G5 F5 \" F% secho %errorlevel%
; F2 ~3 e0 ?# @( x每个命令运行结束,可以用这个命令行格式查看返回码
3 z, o8 ^: r+ Y" f7 C/ t默认值为0,一般命令执行出错会设 errorlevel 为1( @$ [. Z, |6 \4 A. x$ P& B! ~9 \

' F3 F! F# }/ t- q4 q" M( j7 A3 dir* u9 u5 e. N4 g' h! c- m: s1 E
显示文件夹内容& D/ g  o9 w: {' b
dir #显示当前目录中的文件和子目录8 V# o$ ~! E* T  M" h
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件  [, D) b' c4 t5 _3 F& H0 w
dir c: /a:d #显示 C 盘当前目录中的目录
. Z! @) L& `7 |7 L  |) P8 adir c: /a:-d #显示 C 盘根目录中的文件
$ ]  U" x) H- z* ^* g5 udir c: /b/p #/b只显示文件名,/p分页显示
) }5 W6 c6 Y) G. _dir *.exe /s #显示当前目录和子目录里所有的.exe文件
2 Q9 L: `* o, w; M/ D- ?3 u5 `- ?- H9 \- S1 @
4 cd- S; I1 L" T9 ]/ U1 w; ^* a! |; j
切换目录3 t6 J+ v% Q- u6 i9 B
cd #进入根目录" o9 J1 W, M- P. m: x6 x
cd #显示当前目录* ?7 X* e( q; D4 l- Z$ A
cd /d d:sdk #可以同时更改盘符和目录
, S. \  X8 U1 R9 J0 V- k1 |* j1 z2 f- U  g; S# r: X
5 md
% ~% f. k; k3 v3 R创建目录. L9 K6 g8 B* ~+ m/ ]
md d:abc #如果 d:a 不存在,将会自动创建中级目录9 C, h) R2 t6 U* q
#如果命令扩展名被停用,则需要键入 mkdir abc
- B/ y% p  ~1 f
& N' f4 q; y# I: L" F6 rd
) H6 l9 t+ ^+ [删除目录
1 J5 ?/ u6 M& W- ^- [5 {rd abc #删除当前目录里的 abc 子目录,要求为空目录. n4 a4 w7 ?6 G7 l" D/ f
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式1 Y0 J  \% O* [

* X) x8 K- e' v7 del
3 L3 g, y. g8 F5 j; \3 t删除文件: g" i' n# y1 v
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件( i5 G! U* M; O, `
del /q/a/f d:temp*.*# c& ^+ V& M8 z
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录9 o2 r7 U) k7 U1 s6 }. G( Q) v
del /q/a/f/s d:temp*.*/ r( m3 c" `3 e# K) p4 U
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
( u" ^9 ^5 m2 j9 \
6 w  j$ g! a% ]$ r/ N, E8 ren
* V6 S; S- L2 H. s# O/ ~' m重命名命令
& m* s& C+ k0 i( y2 ?ren d:temp tmp #支持对文件夹的重命名4 c4 ?  [  V2 r- t

; k7 @" @9 n9 e) U# D- }9 cls+ z: S+ u' F2 h3 F# @5 n* q
清屏
# N; C" m0 a" l! F( u10 type
' e+ k* C1 C7 r. A+ C/ f# Y显示文件内容
) a) P7 Z$ n: @+ ?type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
# ?2 H: n4 v, e) dtype *.txt #显示当前目录里所有.txt文件的内容, f5 B8 s. Q6 R: G6 {

: C) u8 n5 ^# C2 U& b7 L- O9 l6 l9 U11 copy
0 @; _7 a$ v0 d. W& x拷贝文件
3 z0 h9 X  z% `copy c:test.txt d:test.bak1 i- y* `; ^: L1 m# \. P
复制 c:test.txt 文件到 d: ,并重命名为 test.bak* N8 u: q  t4 r3 t3 n; p* v9 V
copy con test.txt
# @9 Y2 Q. E  m6 q3 o从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
: h5 J7 V9 o5 K0 Y8 w) g8 Ucon代表屏幕,prn代表打印机,nul代表空设备2 a8 E) K6 L- ?3 x, W
copy 1.txt + 2.txt 3.txt
, w/ j# [* q: y' o- t# R$ p合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件4 v' Q: m1 t/ [8 o" K
如果不指定 3.txt ,则保存到 1.txt1 Z8 }1 z7 b$ E% c+ ~
copy test.txt +
* Q$ X8 q* u6 q4 u' e  _; p8 g& U复制文件到自己,实际上是修改了文件日期
4 k& v& o& x+ L4 N# g( P$ K% v
; R# H+ _, G. t5 u4 v5 U- G12 title" e2 j' ]; V9 d7 f9 }
设置cmd窗口的标题
. T$ ]9 A! r' R- m- Vtitle 新标题 #可以看到cmd窗口的标题栏变了
" X' Q' Y8 ]( b5 a
- x0 p( g5 B( I13 ver' U- H% q% g5 ?
显示系统版本
% s% W/ Y# ~- r, U% d' w, i
( M6 P; ~, G+ R! z* |. }- h14 label 和 vol
" [( H2 O1 |, o" [0 {设置卷标
3 U; M- @& M% d7 lvol #显示卷标
0 f# O% k- N: y# G6 W, y5 G" H3 F9 nlabel #显示卷标,同时提示输入新卷标
) `9 ~* y) \# ^. J& ]" v0 ?4 `6 blabel c:system #设置C盘的卷标为 system8 [9 K+ N; |5 @6 ^9 {  G

0 ?' {9 \- D- K15 pause1 M/ i9 Q+ ], o2 ]( d" \
暂停命令6 z4 M: z. _! W6 U
$ F2 I6 Q" S: V" f' A. x; E. J8 O
16 rem 和 ::
/ j; Z7 E# R  Y2 s注释命令# _  \* E  b1 u8 R) d. r$ x
注释行不执行操作
5 |1 j7 F9 ^6 d. l2 E1 a$ ~: b3 r0 }  P  z/ @" S( ~4 x. J3 A
17 date 和 time7 L( W5 ~- D. L# y7 ~8 w4 T
日期和时间8 i1 j  T% ^1 f7 _
date #显示当前日期,并提示输入新日期,按"回车"略过输入
  ?+ n4 J1 n" }/ p2 X. c9 x, jdate/t #只显示当前日期,不提示输入新日期
9 S. S! M; G) V% n$ D! jtime #显示当前时间,并提示输入新时间,按"回车"略过输入
$ |: k* Z; L+ [1 b3 e1 x6 s9 ^, Htime/t #只显示当前时间,不提示输入新时间2 j* N% O; U& I4 g5 ?
; d& @) i4 _# U' a9 ]
18 goto 和 :. X6 M0 \  X7 h+ g# \6 }
跳转命令
2 P" K7 y# i" M  y0 b( S. I+ i:label #行首为:表示该行是标签行,标签行不执行操作) j3 f6 d# A8 t. {. J: D
goto label #跳转到指定的标签那一行  H) S5 x  S$ P& r2 F

4 C0 }! p* U; ~. u, t( {  s19 find (外部命令)/ o; N$ l( W0 \
查找命令
7 C7 E, r# ?1 f# Z- E& M$ X* Nfind "abc" c:test.txt
0 D6 W$ Q8 K5 u! H在 c:test.txt 文件里查找含 abc 字符串的行( u( |" f; j, K1 [9 U, e
如果找不到,将设 errorlevel 返回码为1
- P  h. x8 A5 y% s" T+ rfind /i “abc” c:test.txt
# g4 B% d# ?& j9 }查找含 abc 的行,忽略大小写' \& m; u: Z3 r1 q. y
find /c "abc" c:test.txt# B5 ]& ^% _- [7 }5 Y+ \2 k- P+ X3 G
显示含 abc 的行的行数) v6 E9 p4 m; I$ E* h3 O# @
- l: x; A6 P2 E) z- s
20 more (外部命令). n9 s1 n- r7 b; a6 U0 [
逐屏显示
5 P9 r  p1 q! l: o0 Umore c:test.txt #逐屏显示 c:test.txt 的文件内容
0 I( q  T# p0 E" i6 B' X! P, |( R$ Z
21 tree
5 O4 y3 w. q  L( o, T3 t  |& H显示目录结构
- q% v" t; E' T2 w. |; M; \tree d: #显示D盘的文件目录结构
; Y, u6 s2 k2 x1 g5 z% C9 `; P5 C) X& j
22 &5 r0 X, p0 y8 `( f% ?7 v, A% C
顺序执行多条命令,而不管命令是否执行成功
3 s2 T$ i, f1 C. Z& `( ^* I
& ~+ D4 C. |0 n4 v, `/ T) t% j1 ?23 &&, z% A/ K# B* o# Z, l
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
+ ^# V& f/ A# w; @; y4 q5 Tfind "ok" c:test.txt && echo 成功0 n4 ~5 \  w" S  |7 j8 J
如果找到了"ok"字样,就显示"成功",找不到就不显示, ], ^& G3 Z( u$ {* B# G0 X
% \$ @3 C9 V. u  H) _1 M9 ^) [* X
24 ||9 B" X4 @* i6 C2 x) v
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
. w9 X7 F" T# A8 Z+ _8 q" O' Xfind "ok" c:test.txt || echo 不成功" Q( i: j$ i  a% s8 g( D$ a/ [
如果找不到"ok"字样,就显示"不成功",找到了就不显示
( E, c! I# P+ n( F" J! v. |* C3 w& r3 r$ J+ t+ x
25 |
; C+ s/ h3 h* l" ?3 B管道命令
2 z+ H) l  x/ X" L! F! Tdir *.* /s/a | find /c ".exe"
6 Y5 r5 m$ q' c+ j3 V5 _管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
0 S$ m! c9 o% P1 Q7 o- W: U该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
6 h+ z7 e4 ~7 q4 w# T3 dtype c:test.txt|more, L  ?, e6 M& n- `, X
这个和 more c:test.txt 的效果是一样的
: M  K+ Y. {: ?/ t
  ]; w9 V) a" U! }* E26 > 和 >>9 @. F; q, R1 F9 o3 V* v2 ?
输出重定向命令
6 r7 r0 t* k" |5 X3 T# [; W> 清除文件中原有的内容后再写入: t9 n' A) e9 |3 l: s
>> 追加内容到文件末尾,而不会清除原有的内容
9 r8 Z3 c1 K1 }3 N( d: }主要将本来显示在屏幕上的内容输出到指定文件中
. Y" a. F( Z5 @指定文件如果不存在,则自动生成该文件
  f* ^' R2 k! }6 ctype c:test.txt >prn% @. z, S+ s8 f& X
屏幕上不显示文件内容,转向输出到打印机
  U4 z$ c0 {0 O2 }* @) j4 J2 v. Uecho hello world>con, R/ H% R# Q- X2 a6 O
在屏幕上显示hello world,实际上所有输出都是默认 >con 的+ s  D6 m3 _: s* G4 [  j! ~" q1 K  T
copy c:test.txt f: >nul
/ p) @! S4 _* `# E4 V拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
7 n1 J" C7 ^, scopy c:test.txt f: >nul 2>nul
% C' }3 j" R6 [6 G8 m. E8 e) D* K) v% i不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
2 ?6 _# w2 f! [8 ]1 Eecho ^^W ^> ^W>c:test.txt2 q; f+ O# ~- w
生成的文件内容为 ^W > W
9 r$ f: _: n: f9 z2 a^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号; N, t8 i5 p, M8 n( Q' J
; k9 `, A1 R; M8 c
27 <, N  Z! b1 T" g. ~) b$ @" ~0 G
从文件中获得输入信息,而不是从屏幕上
8 W2 n" \7 A- v3 c2 R) c1 _一般用于 date time label 等需要等待输入的命令
+ A$ K5 u" L" X/ d# w@echo off
1 {/ d, ^9 p8 D7 t* r& Iecho 2005-05-01>temp.txt
% s# ~+ B9 f. |! r, W+ H3 m- Edate <temp.txt
% i  e. x7 r: c6 b. Cdel temp.txt
5 E8 C6 T$ Q" n/ E2 Q+ X这样就可以不等待输入直接修改当前日期
3 M3 i) m( F, {( ]) N: `/ [- _; d! x( O, K/ E: o  |9 J* A
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
9 V" d, A' H0 c7 [/ T" ?" J3 ]命令行传递给批处理的参数
+ f- @% t* p8 Z, |2 d%0 批处理文件本身$ L2 F) S2 z* b( o
%1 第一个参数
6 P  E2 `! X# J9 v1 a  k%9 第九个参数+ M5 T; G. C( A$ I* A
%* 从第一个参数开始的所有参数7 K/ L9 ]7 x9 r$ G2 O! p
批参数(%n)的替代已被增强。您可以使用以下语法:
# P  c* B7 M; V6 W" @%~1 - 删除引号(" ), 扩充 %1
1 }  G" O( g2 `%~f1 - 将 %1 扩充到一个完全合格的路径名3 c- K6 A" Y0 H0 a
%~d1 - 仅将 %1 扩充到一个驱动器号" b) O- k! |1 [2 v7 d; ~8 ?
%~p1 - 仅将 %1 扩充到一个路径
, Y: b; w8 c$ z' C9 a%~n1 - 仅将 %1 扩充到一个文件名6 B' m) \6 q- q; k1 n+ L- Q
%~x1 - 仅将 %1 扩充到一个文件扩展名. N. k" A$ f+ |
%~s1 - 扩充的路径指含有短名
  [% w6 s- H$ D9 x* _& I6 z' _, ^% J%~a1 - 将 %1 扩充到文件属性% l- U- J$ M- j  p
%~t1 - 将 %1 扩充到文件的日期/时间
/ z4 P) Z2 m& u4 G2 N& l0 A0 ]%~z1 - 将 %1 扩充到文件的大小; C/ H) i2 m% l1 M
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
& t8 v; E, C5 }: X+ [扩充到找到的第一个完全合格的名称。如果环境' ?8 m/ Y) T; D* ~; M2 p
变量名未被定义,或者没有找到文件,此组合键会
, ]6 I1 Q+ q+ }# N- F- }+ p扩充到空字符串
- M3 u" k3 {* Z+ s可以组合修定符来取得多重结果:/ Y% {4 q# C8 U
%~dp1 - 只将 %1 扩展到驱动器号和路径9 [5 J' Y% E& N2 q4 S2 v
%~nx1 - 只将 %1 扩展到文件名和扩展名/ g& ^: U6 Z) \) J' f
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
2 f# E; J) X) v9 ^, \4 j并扩展到找到的第一个文件的驱动器号和路径。$ z+ n0 e* C3 B/ t+ W1 E! s
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。3 D9 V. Z: g* n% L
可以参照 call/? 或 for/? 看出每个参数的含意
2 _2 a) _5 n6 secho load "%%1" "%%2">c:test.txt
$ t) [% H! X; D生成的文件内容为 load "%1"  "%2"
+ B  O. V) D, p! o' B批处理文件里,用这个格式把命令行参数输出到文件# g5 D; E( O& y, u: @. c
' q% h4 t# ^8 c6 b
29 if
- L& Y9 E. `8 i* y+ b- \9 A5 R判断命令
* J6 t  J/ f, |, f6 r7 s1 cif "%1"=="/a" echo 第一个参数是/a  s( X5 ?/ [, S; G  P
if /i "%1" equ "/a" echo 第一个参数是/a
' |8 B5 i4 K, T8 b# P0 c) E+ N/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
. Y+ l' @3 ?* O3 s# @7 tif exist c:test.bat echo 存在c:test.bat文件/ |; K2 [# A5 \# ^9 X9 ]
if not exist c:windows (
) I" R, @2 R' Q/ B  Aecho 不存在c:windows文件夹
# y/ v3 w4 x7 H8 ^8 N' Y1 c)! S% w& J7 R2 n
if exist c:test.bat (7 r$ T  u! s# G: V9 B! K4 w8 ]7 X  V8 Y
echo 存在c:test.bat6 K2 {8 X( B$ p+ k! j; y
) else (( I  V9 F: W( d/ ^) m1 E. W9 h+ W
echo 不存在c:test.bat
' X# T3 T- G* K; L" H$ B)
6 B0 B* }5 ?+ i" X30 setlocal 和 endlocal* N3 R6 x& E: k! [8 _& C
设置”命令扩展名”和”延缓环境变量扩充”
: P% Z3 G4 r0 @SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"1 Y/ w6 n( @/ e! _  v
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"4 _0 b) @1 i& ]( g! d- F
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"# k( Y, {3 t  r
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
( Y/ b- U' O" {. \  R4 `$ JENDLOCAL #恢复到使用SETLOCAL语句以前的状态
& r+ F# B5 M. J/ B“命令扩展名”默认为启用
: D7 ?4 B( [. {& I( h# [1 A$ z“延缓环境变量扩充”默认为停用( `6 T; }" V" B$ o, W! d) f3 l' V
批处理结束系统会自动恢复默认值
$ ?- B% m! C  Z0 ~: c0 J可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程/ y4 B+ y1 \: z( T; x' d
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
3 X& c* \' V8 @1 B# ]保程序能在其它系统上正确运行
# v. i& v0 n; g5 H"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
) [- J# z+ Y3 r" C7 S+ F3 _7 R! h. x& A& i! [* C
31 set& H" H3 Q+ x. q) w& j/ x
设置变量6 U. j9 {1 l$ ]: z
引用变量可在变量名前后加 % ,即 %变量名%
( E5 m9 \8 t" l% B4 Aset #显示目前所有可用的变量,包括系统变量和自定义的变量
& o- E* N4 |8 \: becho %SystemDrive% #显示系统盘盘符。系统变量可以直接引用* Q  Q# H: i& q8 v: b; q
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
6 m+ ]+ O9 Y9 K2 w, Y. b9 Oset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
* Y1 Q+ V. K9 R5 c2 q5 O0 ~echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2, x, P- J- ?8 E0 o+ a
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2; Z3 j1 u6 K" B' y) l
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2
5 n; ~# k/ Z# d$ s2 Q$ Vecho %p:~0,3% #显示前3个字符,即aa1- z" ^- |( B/ T$ }: F) l
echo %p:~-2% #显示最后面的2个字符,即b2
. k1 ~+ A/ w- I7 G# f1 Pecho %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
& Z7 u- L- V: i& {" becho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
  u* q& Q0 ?6 x: R  S# Mecho %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
$ j  c' T2 [& D5 Aecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb20 z3 l8 O7 Q  G6 d
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
+ @4 e. J$ y. N; Rset /a p=39 #设置p为数值型变量,值为39
* `. k( q; s. U$ o7 v% }set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
; L7 n) v" t3 q+ mset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用/ {3 y, g* ^! i, c% b/ b
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?: {5 h" J$ i8 T2 s
set p= #取消p变量  T7 i8 @% D- h1 Z, S  Y) J
set /p p=请输入$ q1 Z2 f: d4 s" j8 _3 F# k
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
4 _, }( V4 W" T注意这条可以用来取代 choice 命令
) ^" m7 W2 [6 S注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
, ?* `: R# p7 ]- C5 W6 T3 U4 _@echo off% L4 F% I( D7 [* h
set p=aaa
8 z7 e6 z$ S  L" b$ f; g( f+ Pif %p%==aaa (
# E7 F0 l5 o6 O; t2 g( ]echo %p%
" t) u% N& a1 w* jset p=bbb7 G1 ?8 i  ~2 ^' y
echo %p%
6 R& d* s) C$ `3 ]/ C( g). F( O7 w9 k9 y3 F* }  }
结果将显示) i  |% }% m- P4 ]! h* |$ I
aaa
( ]4 `& p: h4 m1 p7 m' j! Gaaa
& x' ~" P  y, L* w因为在读取 if 语句时已经将所有 %p% 替换为aaa0 d4 p* S" {- o4 A3 G
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"7 s! @) V' U* ]2 ~# Q
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!6 H, D- R  t5 x/ u1 ^
@echo off% B- B; T# q5 r4 ?7 D% w
SETLOCAL ENABLEDELAYEDEXPANSION
3 a) _) S1 ], `2 }+ l7 Eset p=aaa
$ e+ d3 s4 S% {9 e% Iif %p%==aaa (" p# ?9 L3 v7 v4 Q! a4 }6 ]' o
echo %p%
% s( y; h/ k5 D! S% Hset p=bbb
7 u1 @8 P( ]& X; j! ]" @echo !p!2 K3 l! K, m* t% J
)
4 E; e6 `# ?' q) g  [  O* TENDLOCAL0 z$ J9 m& _; l; ~- i. q8 y
结果将显示
: z! c; `% C% v( R+ ^! Z" A3 ?aaa
' H* B( m2 k' ^/ lbbb
5 N& m3 f2 a" s7 ]6 L, z) n0 w# c还有几个动态变量,运行 set 看不到# n9 r1 x3 Y/ i: w2 D
%CD% #代表当前目录的字符串' d0 J% ]0 z: ^; Z* n* G% W
%DATE% #当前日期
' K. e" c% K4 ]* ^%TIME% #当前时间
% J7 d1 K1 ]6 I' q6 E% c9 w& }%RANDOM% #随机整数,介于0~32767( J( b+ [  ~: a
%ERRORLEVEL% #当前 ERRORLEVEL 值8 {6 f6 c7 c% W0 t
%CMDEXTVERSION% #当前命令处理器扩展名版本号
  @- u9 r% |: h: {6 i$ e; e/ \- y& _%CMDCMDLINE% #调用命令处理器的原始命令行8 v5 a, O  R2 \7 e9 w! R
可以用echo命令查看每个变量值,如 echo %time%2 R3 b: g. X6 c
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到$ M  p( _7 S  s" O9 x

8 C% B: K5 N  ^  b8 `& @% h8 N5 _32 start; D+ a+ }" g8 z! v1 h3 V
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
& a/ K! s; _& [1 g7 ^
3 g" n0 u" e% r4 ]+ A. e# ~33 call9 |; P. n" ]5 S% G" B8 d4 r# W
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
6 q/ L1 e+ S, ]有时有的应用程序用start调用出错的,也可以call调用
$ u) m& V$ ?7 W7 w' @$ @6 {5 |8 R% P$ q0 w8 s/ Z
34 choice (外部命令)
; q( l' g: x% {* B选择命令
6 i* }: r8 M0 j% F8 A. g让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
) Y$ S5 }$ F& L& q# `win98里是choice.com
# q- R: Z5 ~7 I8 |( B/ lwin2000pro里没有,可以从win98里拷过来* H' B' R3 e4 B& J- `
win2003里是choice.exe5 \4 ?* F' f% j* S" p  P
choice /N /C y /T 5 /D y>nul
1 M; I' }% k- z; @延时5秒) G  [. v) E6 g+ Y; C* O" q
- O7 l9 t: {; F, I. l- e1 M; x
35 assoc 和 ftype
& b+ C4 N/ N1 ^) w文件关联
# ]6 W2 M7 [: d, j6 q) X  b& R0 Wassoc 设置'文件扩展名'关联,关联到'文件类型'
6 H, t" @1 t/ s$ ], ^* Cftype 设置'文件类型'关联,关联到'执行程序和参数'  m  o' W" F6 ^/ V
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
* ~7 [9 b& Z% w# g而是先判断.txt属于 txtfile '文件类型', Q) ?8 O' G/ N& o
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1* m, T$ C* U: a: @
可以在"文件夹选项"→"文件类型"里修改这2种关联
3 O& U/ @' a$ Rassoc #显示所有'文件扩展名'关联
: @$ A- \. u7 E; x' q3 b) A4 c& x! Nassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
, ^/ T" p7 }3 b  e) |assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.87 G$ @, c% o8 G* ?# Y
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
& m- k$ x# S2 _; s5 Bftype #显示所有'文件类型'关联! J2 X2 _0 k* S2 R6 y& A
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
4 R, F. n5 r: I& zassoc .txt=Word.Document.84 P, v9 ?* z7 |! @' \, }
设置.txt为word类型的文档,可以看到.txt文件的图标都变了% O1 p+ X- u& `5 ~2 O3 C  a- t
assoc .txt=txtfile! {4 F; x, R) H$ I
恢复.txt的正确关联- a5 Y2 w4 _$ b# v
ftype exefile="%1" %*
3 F% y& z: b3 X9 ^& \- Z恢复 exefile 的正确关联
& }/ @( o5 p# c" z6 b# ?如果该关联已经被破坏,可以运行 command.com ,再输入这条命令/ r7 o( A3 r: m* y; I: R. x' |" Y- ^' A
9 r$ \9 O: O+ E' u
36 pushd 和 popd
3 y3 r* Q1 w. r7 \切换当前目录
5 \5 ~% T7 }" K, u; d% d4 L@echo off
$ K1 _" D% A4 ?c: & cd & md mp3 #在 C: 建立 mp3 文件夹9 j7 K3 [+ r& t& ]
md d:mp4 #在 D: 建立 mp4 文件夹
: ?  m1 I; e4 i4 Vcd /d d:mp4 #更改当前目录为 d:mp4
& K& N0 B7 Y- o3 o: Ypushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3- D3 |7 x; k; a0 H, i$ y
popd #恢复当前目录为刚才保存的 d:mp4
! Q# N/ i* \( N$ e/ r
- g/ \) X6 p% Z8 n8 Z37 for7 Q+ s8 `+ M5 T9 ]. F
循环命令4 P6 P4 E0 j- Y% P% f
这个比较复杂,请对照 for/? 来看4 @4 _) ]: l" O  @" t) V
for %%i in (c: d: e: f do echo %%i& E" Y9 b3 c0 ~8 j8 O& R
依次调用小括号里的每个字符串,执行 do 后面的命令
" [1 }' L6 B6 N/ F% m( b注意%%i,在批处理中 for 语句调用参数用2个%: p3 u" r- [% Y6 J. S
默认的字符串分隔符是"空格键","Tab键","回车键"4 a0 I& M& l' p2 A- |/ j6 f
for %%i in (*.txt) do find "abc" %%i
! I; H3 G; P) K0 J* w3 w* u对当前目录里所有的txt文件执行 find 命令
0 ~3 k) b- w+ C; Xfor /r . %%i in (*.txt) do find "abc" %%i
* L$ Q, q9 k- {) V; |' [  c# {在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
( B3 }) s2 y+ e5 m+ q( ofor /r . %%i in (.) do echo %%~pni
- _& c* H: k- [8 k- u- t; @3 S显示当前目录名和所有子目录名,包括路径,不包括盘符
' B& h2 P9 j& {; ?; o  K9 wfor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt! c! \" v. _( F5 e7 F! l0 o5 @  o
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去/ n% Z1 T5 E7 z; J3 e6 i6 V
for /l %%i in (2,1,8) do echo %%i
5 U4 B& s# _; b生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
6 z6 j3 U4 o- x; U: _for /f %%i in ('set') do echo %%i
. r  K' N- H6 T6 C7 [对 set 命令的输出结果循环调用,每行一个- \' F4 b9 w# I: h  J' x
for /f "eol=P" %%i in ('set') do echo %%i
0 M# X' L9 w9 I" ^; n取 set 命令的输出结果,忽略以 P 开头的那几行
6 c: U# p% K$ h7 ]' |6 M9 A, }for /f %%i in (d:mp3.txt) do echo %%i
# ]: F* d& ~, U& m# b) a. Z+ \" y显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称. t& P/ ]) O9 r/ f+ f! u2 H
for /f "delims=" %%i in (d:mp3.txt) do echo %%i: m# C; ~& o2 A. z( W
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称- v) U0 h$ \1 j& W) j- G
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a9 {4 `8 I8 K+ o- F
对 dir 命令的结果,跳过前面5行,余下的每行取第4列
) d5 g) ?2 u$ o2 K. N/ r每列之间的分隔符为默认的"空格"
' \, u4 y2 F. g可以注意到 dir 命令输出的前5行是没有文件名的
+ |% c, [" Z$ W, `9 B0 @4 Yfor /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
- D) e1 X# ^! mecho %%a" {9 i  J$ ?* F1 O0 g" N1 E7 y2 R$ W
echo %%b1 b2 G$ P: t: w
echo %%c  H2 t* H" ]! V7 T% L$ ]
)
0 T; u- F7 X0 D' a: y( n" g2 d对 date /t 的输出结果,每行取1、2、3列
0 I4 E/ j+ }. c第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
) G: x' Y& }! d5 j分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
5 C, z* w3 O& w8 r  J其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
6 [: i7 \: j. L8 D- m5 wfor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
) u. L* ?# x0 @取第2列给 %%a ,其后的列都给 %%b
6 N6 |- t$ Q6 a
2 [; a1 |2 t# ^1 l% q4 Y) w' l38 subst (外部命令)
! T3 c) q, N0 s& c' i映射磁盘。
4 x7 T( |0 r2 f% g, v; Psubst z: serverd #这样输入z:就可以访问serverd了% `4 J3 G' P7 S# M
subst z: /d #取消该映射
& c: O( x6 C& o' W7 Jsubst #显示目前所有的映时
  o  Y+ u& F& ~5 m& b+ C: I( [- L) N& ]
39 xcopy (外部命令)3 t* }+ x# e5 L) z" t
文件拷贝/ N# {; N4 l3 q2 O
xcopy d:mp3 e:mp3 /s/e/i/y+ N2 }" d  W" i6 [. w
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
; U7 f, d* f2 i- q! P: b加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
9 J# X+ n8 h/ I& p, i3 x$ `6 m. D7 H5 f! a+ |$ C7 b
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
    4 e) k+ z" {  c4 z2 A# _* A: g
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:
      5 z6 ?( [6 a  f$ \! A

    ( d$ _5 }1 v1 P/ G9 S0 {% B
@echo off, P6 l: s( S- P# ^4 B. \4 h5 [
set p=aaa' r1 K9 h1 ^8 l8 f
if %p%==aaa (4 Q) R1 Q* ~4 E% O9 p' ~
echo %p%
: h( B/ s7 x$ G- ~) t6 uset p=bbb
* w0 n/ p( I4 R+ a* X9 x$ t' Necho %p%
7 n* s) V# M+ x8 ~)
: h, K  s5 I0 r+ S: w7 M; ~pause
  • 截图:# G0 x+ @5 g( d
  • 2.批处理.bat 文件中输出中文乱码

    " c5 f( n7 q3 l! L( ~
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:
      ; q* w# D6 z% @( O' y! ]
    • 效果截图:- e$ ~/ g& d& t- ]
      0 V& E4 p/ H! e. T
    4 q- q* T9 V& d6 S- `

+ I2 I7 A. {3 x$ q

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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