扫一扫,微信登陆

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

搜索
查看: 2080|回复: 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 文件中输出中文乱码
  • 解决方法在文章末尾!
    5 V1 _- T% t& _
前言
  • 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效/ u+ E0 a! U8 a3 k
在Windows中善用批处理可以简化很多重复工作
什么是批处理?
  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展2 q5 L' s# m% L: t6 G
    名为bat
  • 目前比较常见 的批处理包含两类:
    % U. C9 g* A8 M
    • DOS批处理和PS批处理。
    • PS批处理是基于强大的图片编辑软件
    • Photoshop的,用来批量处理图片的脚本;
    • 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
    • DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
      * `& Q! h% U- ?5 h
  • 批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
    , e% o5 y% A! }6 y: z! a# f命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行
  • 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件

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

    ) [1 _6 `$ z, [" z9 C: y/ Z
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
0 c+ O4 n6 q, O  s" @$ g& x+ q

* Q! X! U0 v& I8 {Windows Batch 常用命令) j0 H2 ~; {6 B: Y& a- }7 C7 k: u
1 echo 和 @
6 a/ `9 D8 M4 q; b回显命令
: B* T9 O0 C3 _6 X5 }@  #关闭单行回显
! h# t% [; [$ w5 z- w4 oecho off  #从下一行开始关闭回显# n5 x) n+ l6 u) Q1 x/ e
@echo off  #从本行开始关闭回显。一般批处理第一行都是这个
) [) B5 s) w. R  ?6 F6 ?echo on #从下一行开始打开回显
7 ]1 P; h: x3 M6 x. Q% Y) h8 |8 Cecho #显示当前是 echo off 状态还是 echo on 状态
! v6 d* b; S) I% ?echo. #输出一个”回车换行”,空白行
) ]. @4 X3 \2 z2 z, |, ]#(同echo, echo; echo+ echo[ echo] echo/ echo)# V! ]7 B% f' _6 J
5 u; S$ H: x; m5 H2 y0 X! I7 A$ N; n: G
2 errorlevel
; K  G, {. ?6 a1 R3 i1 g) d; Recho %errorlevel%$ r! q) S' U- ]" {* ~0 p& q
每个命令运行结束,可以用这个命令行格式查看返回码
  D! F- e$ {  P( w默认值为0,一般命令执行出错会设 errorlevel 为1
8 R9 C4 f3 G/ m: g
( V* \. C5 t! m; ~, a7 H0 h. k9 n3 dir
. p$ W; c) C6 c2 Z1 c) {: H显示文件夹内容& e2 m+ X, D3 p
dir #显示当前目录中的文件和子目录
1 W' G) m8 `( e$ D  ~dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件1 r7 C. x( a- s
dir c: /a:d #显示 C 盘当前目录中的目录
, Z7 r& E  Z! j+ Ydir c: /a:-d #显示 C 盘根目录中的文件- A$ p9 o) j1 u! b" ^, H9 a9 Z% B# a4 v& K
dir c: /b/p #/b只显示文件名,/p分页显示
6 H& A5 e0 b: m, F9 J1 v! S# udir *.exe /s #显示当前目录和子目录里所有的.exe文件7 b! C( L0 h8 J5 r9 G
* A8 b' L7 ~& {( D6 d0 Q
4 cd
/ {, q* i* s, J3 v切换目录- u9 G0 F! v9 j5 X! k: P
cd #进入根目录7 q  ]4 Y, ^. V6 d4 I! Q
cd #显示当前目录
0 G/ T4 y- h: jcd /d d:sdk #可以同时更改盘符和目录
4 U5 q; m- o! f1 L: k+ F1 `6 b5 |
# L5 _5 e) @8 G# p5 a, t) E" X; P5 md
( O$ X8 h  s  w) b. @9 \2 q创建目录$ H/ I( t& {, g: [* ?
md d:abc #如果 d:a 不存在,将会自动创建中级目录7 f, k2 `" V2 ^+ z9 o+ T
#如果命令扩展名被停用,则需要键入 mkdir abc
1 q8 t6 `( ^! O7 Y" U7 s6 O9 ~& t3 `
6 rd3 z2 w' M1 D4 Z3 ^& s! q# {
删除目录7 S6 r% ^5 @1 f3 p% C
rd abc #删除当前目录里的 abc 子目录,要求为空目录, P) {/ b1 {8 }# J3 W
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
5 G: R# k; W0 N+ D' |5 R) V+ O
/ T2 `" l4 C* \7 del" c, d; i+ ?  j. W+ {. ]4 ~  Y
删除文件" a+ r. \' {3 a: `% `/ v& X
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
0 Y! f! W" L. K( \4 g( ldel /q/a/f d:temp*.*
1 m1 r2 G. T7 r: z$ g删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录/ G9 }+ S- O& M$ D' A0 F% Y. A
del /q/a/f/s d:temp*.*
. j$ w2 c7 t  p2 B+ T删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
  z7 r" a6 r+ L5 r! [
4 R4 Z$ l; W: _' L$ h* O8 ren1 F  T0 U, [  h( _. s
重命名命令
4 _& h2 x( _5 Gren d:temp tmp #支持对文件夹的重命名
. Z: o% C" I- h- S, v- h6 `) X: _- p) `
9 cls1 a, w( n9 M' j, h2 |5 v5 |* @
清屏
/ _& X( F% t% j10 type: e' a4 r, h6 [) Y2 B+ T
显示文件内容
, m8 _1 V$ h3 b9 j6 x5 u. Atype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码! G# U! y; ~4 F
type *.txt #显示当前目录里所有.txt文件的内容
8 r3 s) o) @, i+ v2 B
7 D$ K" _5 I6 g4 s6 Y11 copy
3 J3 R1 q# P( Z. ]拷贝文件
% O% {0 ?% \2 L8 r$ b7 scopy c:test.txt d:test.bak
% e5 H( p# S& z# p复制 c:test.txt 文件到 d: ,并重命名为 test.bak
) {+ n# b* t6 x( G0 dcopy con test.txt
- m! E) ~5 `$ m" X9 l% h从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件, p% X1 U3 v. b! D) H' S
con代表屏幕,prn代表打印机,nul代表空设备! V1 i/ Z  L* Z( i) O  N
copy 1.txt + 2.txt 3.txt
0 R: B) |$ R7 d7 Y" f合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
6 j! F1 V: K' n0 s# b* }如果不指定 3.txt ,则保存到 1.txt: L9 W2 ]1 h0 W1 l& r& |) A7 ]. b
copy test.txt +3 `: O, d# Q0 h0 x! U; W
复制文件到自己,实际上是修改了文件日期
' G4 N7 a: ^! h( s$ }8 @  h& \
- ^9 T7 O3 q# k3 j4 E3 j. f0 o12 title
) h/ ^: U' A9 J! {设置cmd窗口的标题
9 [* ?, P& W5 v0 E  Ytitle 新标题 #可以看到cmd窗口的标题栏变了
& w% M5 I. m  G; o+ \( h9 }+ u9 i5 K* f9 [
13 ver8 s9 F) Y  I8 w$ X( X
显示系统版本
7 L% D' o" ^5 E) ~* C  j7 U! K
9 O$ [" M% Y# q3 h# s+ n14 label 和 vol' R8 Q! S3 q0 L0 @0 E
设置卷标
6 Z  ]6 K# w9 [vol #显示卷标
; _' |; w) o* I3 Glabel #显示卷标,同时提示输入新卷标0 C6 c5 P# l' W" r' W
label c:system #设置C盘的卷标为 system7 }) S/ ]$ z# W

/ W0 |0 l8 h! c( r+ B15 pause/ {1 x5 g- x* [) C3 k- s) }" g
暂停命令' g/ g7 H4 a$ f- u! ~$ i
; j8 y, J8 p4 H1 v+ J
16 rem 和 ::
4 B$ l4 C! J) P. W注释命令+ p4 Q/ q! b) [1 c
注释行不执行操作6 x7 d+ _& G! s) |
1 m9 H7 U2 K) K! \; @6 Y, C, O: B
17 date 和 time
8 P1 R. D8 O  S4 p日期和时间
$ \) B( B' h5 G7 f, ?3 W) Ddate #显示当前日期,并提示输入新日期,按"回车"略过输入# Q7 W$ A" V  U) v0 ^
date/t #只显示当前日期,不提示输入新日期
+ z. @  ~, X5 r8 R$ M3 ~time #显示当前时间,并提示输入新时间,按"回车"略过输入8 t+ d+ u6 K) a# o/ j4 E
time/t #只显示当前时间,不提示输入新时间' A8 @3 b+ j% w, O9 q

* R& @( V3 v2 D18 goto 和 :. N2 q1 n7 t) }2 G5 I
跳转命令
' D) p3 i- V3 R; g:label #行首为:表示该行是标签行,标签行不执行操作
1 N" J& q  {6 _7 s4 J. E9 s4 r" Ggoto label #跳转到指定的标签那一行$ a) s" {+ U; F* Q8 C( m# ?
8 ~9 i6 C. B# @0 F
19 find (外部命令)
; i) z/ t9 x7 J5 U9 G4 n0 |/ C查找命令
4 H+ j, U5 @& q" ~% b) ?2 N  Qfind "abc" c:test.txt
" l9 |! L4 m! q$ \9 f) m: }- y6 p在 c:test.txt 文件里查找含 abc 字符串的行0 K/ Y# L3 E3 G$ L
如果找不到,将设 errorlevel 返回码为1
) Z. s% j! s- i, ^find /i “abc” c:test.txt4 X8 R: e2 D1 w# m  r; d1 z
查找含 abc 的行,忽略大小写
! p6 g. T; h! N. E( Yfind /c "abc" c:test.txt
2 Z/ I6 y0 u  l/ G% P6 `3 P8 j) P显示含 abc 的行的行数" J) D7 v" m6 l8 r6 V
6 G+ h% ?% K. u
20 more (外部命令)4 k. R% s' |5 Y
逐屏显示
" \* B3 ?) k& j* M7 umore c:test.txt #逐屏显示 c:test.txt 的文件内容( Q5 @- W  G; W0 Y8 M
$ w8 N1 n  X7 i# F
21 tree' E: u+ J2 c! q7 G! ?! f% B$ l
显示目录结构1 H' {1 }6 c6 p' s
tree d: #显示D盘的文件目录结构0 A: h4 ^+ u, K  i% z

4 x7 N+ e6 e+ T( V0 k22 &, c2 h  P. h, W$ h* P/ ^5 }
顺序执行多条命令,而不管命令是否执行成功
; u( ^6 s: `. k% c- C2 c1 E: i; @0 o' p
; S  m" z+ i. z* I% C23 &&
2 q  {7 Z# ]/ @顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令5 r3 o  ^1 O9 C8 D' D
find "ok" c:test.txt && echo 成功
% w0 C! p, C0 @如果找到了"ok"字样,就显示"成功",找不到就不显示
8 R* `/ Q( H7 P, P7 G: U" a
" u5 Q, B2 T4 M* g0 l24 ||
' `  h  W. E) v8 Z顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令( t" S8 r7 u" ^5 e2 p  [
find "ok" c:test.txt || echo 不成功, P) t6 \  w2 v8 j, Y
如果找不到"ok"字样,就显示"不成功",找到了就不显示
9 w+ \' j' [7 i4 ?# b/ \( p2 o, }, d  p( s9 u8 [0 ]
25 |
# h9 t; ~( M2 z' O- Y管道命令/ P# P2 a0 u6 z! D; A; K, N) X
dir *.* /s/a | find /c ".exe"! s% t! q0 i& e& j$ W0 b1 v
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
8 t' k6 C3 W3 x该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数& [4 u5 I5 z5 L0 ~$ c
type c:test.txt|more% F/ h& f, ^* k4 ^) y
这个和 more c:test.txt 的效果是一样的
' H2 v! W) R: |7 B/ e  B4 g* `+ r+ T7 h3 b* W
26 > 和 >>
! i* d6 S1 B; H& M: P输出重定向命令* h7 e6 v2 |9 @# n9 I5 |( x3 m' m
> 清除文件中原有的内容后再写入
* e, C8 ^) H8 _, J' q: B>> 追加内容到文件末尾,而不会清除原有的内容
, |- r& a: c% K& i/ ~主要将本来显示在屏幕上的内容输出到指定文件中
3 S# R0 f$ I- `% e指定文件如果不存在,则自动生成该文件: C( c; `! `0 W2 e. h+ I
type c:test.txt >prn
0 S6 O% \7 u0 m- j! z( T屏幕上不显示文件内容,转向输出到打印机  z6 A' G  r. {" m9 I  ~
echo hello world>con6 O4 \/ D7 Q3 F+ F# C
在屏幕上显示hello world,实际上所有输出都是默认 >con 的  C( d; p' q3 l: _5 P+ x* P
copy c:test.txt f: >nul; h. s2 x9 P& w% r3 C9 G
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息- {0 F0 F. a5 a! _& F$ h- d
copy c:test.txt f: >nul 2>nul
! M9 n" Y' o! c! p; R不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
& [/ @$ R' W! \& Z8 Kecho ^^W ^> ^W>c:test.txt8 a) Z' i- r0 K
生成的文件内容为 ^W > W5 K3 K( r  u; _. G2 y
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
( S: E# j3 x; n3 ^6 U* A7 b2 h1 u! O' ]; Y- s! j( m
27 <4 [. t7 r8 m1 e% C
从文件中获得输入信息,而不是从屏幕上+ y, v/ h; _4 V: T
一般用于 date time label 等需要等待输入的命令6 W" k5 {+ E+ V  W- O
@echo off
6 S  j0 k* ?8 ?, n& }$ w6 V7 z2 H# Mecho 2005-05-01>temp.txt
: G" K, k- ~& {7 o5 n, ]date <temp.txt
' m' {( c2 l" Q7 b% Hdel temp.txt
3 s9 q! X& C/ [) J这样就可以不等待输入直接修改当前日期' @* @9 O# [9 B8 E& ]0 A

  A6 `  c5 y2 \, e. L28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*0 K( ~# ~+ c0 J# s5 s6 j4 L2 O
命令行传递给批处理的参数
7 V7 y2 w8 |5 l( ?$ ^%0 批处理文件本身$ M/ h& y7 w8 `" E
%1 第一个参数# S! p( Q8 V$ L/ {
%9 第九个参数, ~% P6 M; |4 ?7 K5 E) T- u7 W3 }
%* 从第一个参数开始的所有参数7 }% I; v; W8 [3 ^/ h: _: i
批参数(%n)的替代已被增强。您可以使用以下语法:
5 x$ }5 g2 ]# s%~1 - 删除引号(" ), 扩充 %1- L, v# d, S+ t8 C8 F; v  U
%~f1 - 将 %1 扩充到一个完全合格的路径名
4 {9 X! ~3 u, E. N%~d1 - 仅将 %1 扩充到一个驱动器号- S6 q  ?6 {% \; @0 a
%~p1 - 仅将 %1 扩充到一个路径
$ f* h) w8 C3 G! j6 i%~n1 - 仅将 %1 扩充到一个文件名$ E, w; [0 b0 A/ R4 `7 P6 [+ \
%~x1 - 仅将 %1 扩充到一个文件扩展名7 e# G3 g- _4 T7 q1 i% s8 a  j3 S
%~s1 - 扩充的路径指含有短名5 x% u  ~- o- P# X; ~
%~a1 - 将 %1 扩充到文件属性5 Z% h% v8 D% t9 c. L
%~t1 - 将 %1 扩充到文件的日期/时间
6 u4 G" n- z; N$ M( h" E" [%~z1 - 将 %1 扩充到文件的大小( x$ C9 f  L# n- O. @/ F
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1( Y8 f# b7 p! l9 ~* H7 N* }
扩充到找到的第一个完全合格的名称。如果环境
( Y* w( [$ O* ~9 b变量名未被定义,或者没有找到文件,此组合键会8 l$ N, d# S' V% a6 p5 q2 J2 n
扩充到空字符串4 v1 u+ D* k/ J, v5 O$ \+ T
可以组合修定符来取得多重结果:6 n; K* v1 [; x
%~dp1 - 只将 %1 扩展到驱动器号和路径3 {( T+ D( U8 x0 I
%~nx1 - 只将 %1 扩展到文件名和扩展名: T8 r/ C% c7 k) K: a
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,* j2 q9 W$ f% l- x; ]
并扩展到找到的第一个文件的驱动器号和路径。- D+ g" j# ]9 k2 e4 ^- L) e0 B
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。$ N! C( N, F+ k- m$ q
可以参照 call/? 或 for/? 看出每个参数的含意* P+ P8 A* R* n" j0 T* l; ^7 c! F
echo load "%%1" "%%2">c:test.txt
6 z( ~, L: r" d" J8 F) @6 @生成的文件内容为 load "%1"  "%2"
+ M, _+ ^) k4 C. ?, b9 z批处理文件里,用这个格式把命令行参数输出到文件/ _4 k8 U; G* K& X
' K& m  g3 ]  R( f+ |5 u$ U2 V
29 if
9 g% [9 v# u  ~1 o) O" x* T判断命令0 M6 o6 @6 j  V
if "%1"=="/a" echo 第一个参数是/a
6 \, j/ Y- a. j$ a, `if /i "%1" equ "/a" echo 第一个参数是/a
' g5 \) W1 C) X$ T$ \- [/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
6 p+ `/ N& v  f& |0 s: q2 p- Zif exist c:test.bat echo 存在c:test.bat文件
- w+ \0 X, K4 ^6 ~4 J8 Q6 k* cif not exist c:windows (
1 Q. }/ c- {4 [: Recho 不存在c:windows文件夹
# Z- w" c* `- o  c4 d' ], I- O, B)- `; i# t1 i5 w; b3 z7 X  g
if exist c:test.bat (
& N/ b$ C$ C+ R1 H( L" S( t# Hecho 存在c:test.bat% a1 M0 J8 [$ L
) else (
+ E" F4 x; B# X+ E" p4 zecho 不存在c:test.bat9 s' A0 x9 _4 |  c! |# A1 |: H2 h
)- Y/ {! U  G. S6 C+ {4 b& D
30 setlocal 和 endlocal
: N& z% ^9 q4 B  \设置”命令扩展名”和”延缓环境变量扩充”/ }- T& `! r) P/ D
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名". H, L& t) _( V  f  O" a: B- h
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
% |$ v4 g" a8 i: [  X" W  _SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
: v  |1 ~6 H# E& \, A% wSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"* m0 g, n2 ~2 b8 ]  I  ~
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态
6 O" O5 H! G7 ~7 e7 b7 {“命令扩展名”默认为启用9 x8 ?; I- I* ^3 h
“延缓环境变量扩充”默认为停用* J5 M6 N8 |( l/ H4 c: F
批处理结束系统会自动恢复默认值
# p/ ~' i: m1 Z可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
( f! B7 C+ D! h; N序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
6 e& @, x4 G1 g2 H保程序能在其它系统上正确运行4 }/ `0 T4 s# ?
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
% l2 z2 F+ w  s( q/ h. h- W) r- ~! ^; n3 \
31 set! E( e+ p- _# u1 d& r( k
设置变量( }% E& ^# A; T+ l: D, p
引用变量可在变量名前后加 % ,即 %变量名%6 {4 \0 Z9 J5 R+ C" `
set #显示目前所有可用的变量,包括系统变量和自定义的变量
- X* O( }( M+ G5 F- U& s  Vecho %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
8 S, [7 z9 l) `/ v% w) vset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=13 r2 {3 k5 m3 s! {  \
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
4 q% \' h: q. V" zecho %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
" D/ T) g; i# o& T+ E2 eecho %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2( W, l7 x" |1 C! ?, Q3 H7 |" b
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2: A* Y7 I; l5 c3 [
echo %p:~0,3% #显示前3个字符,即aa1
- y9 X1 E' A0 K+ x  l5 K8 }% Secho %p:~-2% #显示最后面的2个字符,即b2/ f* e! b2 ?9 h+ K9 D/ O
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b( u$ u. x9 e" ]0 V" t5 R  \5 H2 C
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb22 @. v+ A2 U2 @- R, ?
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
$ y# \! v# P) jecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
" h' r' [  Q3 Kset p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
/ }1 k+ W7 |' C2 E- M8 Oset /a p=39 #设置p为数值型变量,值为39
" B$ d# g( w+ `/ @) _2 k8 r) {( r) d% }. Yset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3  l( R8 c: B8 ?  o
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
0 ]3 a2 i% m& T$ I4 {# {& iset /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
. l/ D  U0 S$ Nset p= #取消p变量
* \  `( t4 F3 [: E9 dset /p p=请输入8 c6 \; a9 X7 d, `( e  o$ d3 L
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p! [& M& F8 j$ m! n, y, ]  o
注意这条可以用来取代 choice 命令2 `6 ?; N: \+ U7 H* f6 F
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如3 d0 A) \0 O* G9 p* U! e
@echo off2 a$ u# o( S! R$ _
set p=aaa
& ?9 V2 t: E, g+ F0 B6 B& Tif %p%==aaa (, a4 v0 A' F* N! v# Q' t
echo %p%
  B7 u4 ^6 e' h6 _; H  j7 p' |% Cset p=bbb0 d% [3 p. ~+ T, S% O
echo %p%  y8 n4 y; E- F6 x
)" Q$ v* F: g% \. s% Z; ]! i
结果将显示
: a3 q" `- m1 ]  Baaa
/ {: U3 w& ~% K3 T  l" ^& Jaaa, r, @- j$ V, X5 p$ t
因为在读取 if 语句时已经将所有 %p% 替换为aaa* d4 C" t" G: `; @0 k
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
$ c9 z; X0 A( y* D3 [2 D6 A可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!. s: u+ P4 F6 Q
@echo off
) E; I3 L8 F- ZSETLOCAL ENABLEDELAYEDEXPANSION
" \/ i# E& D2 P# k$ Kset p=aaa' |7 ~6 E( u* ~/ Z% z
if %p%==aaa (; G8 c. l% D' S% r# A
echo %p%8 m3 _; D; g: L
set p=bbb
% j6 R! e! p$ Z- f* O) S' ]5 R. secho !p!
; z1 [$ r5 v/ d# L# V, E7 q)
; W- L) U7 b/ D4 i5 I& }7 S, |ENDLOCAL
7 n) ~4 C/ N( P% W+ S. e结果将显示
6 l4 G/ ]- J) C( m& iaaa5 G+ B6 @0 K$ S; Z# _5 Q
bbb' o4 P; g& Z/ N! E
还有几个动态变量,运行 set 看不到% O( N& k3 [% Y+ y/ Q
%CD% #代表当前目录的字符串8 d) H7 V; A* u6 Z' [( i
%DATE% #当前日期
$ ]+ a5 J* s$ |0 ^%TIME% #当前时间9 U2 T) j- y9 e: b! ]
%RANDOM% #随机整数,介于0~32767
6 I) u0 N3 u: \; e" p# P%ERRORLEVEL% #当前 ERRORLEVEL 值
% w% k* m; a; O/ V%CMDEXTVERSION% #当前命令处理器扩展名版本号. D/ J$ V# G* o7 K9 l# L4 X
%CMDCMDLINE% #调用命令处理器的原始命令行
6 {2 H4 f9 S! N3 i7 `* K: u) B可以用echo命令查看每个变量值,如 echo %time%
& F+ a& M& t: J* [9 f5 F7 Q注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到3 x7 P$ x5 @9 k3 J
+ q; w& ^- w  n
32 start/ Q7 c1 ^9 P0 U& u2 i
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
4 n/ C! l/ L% _. C% g' n. k1 y" S4 E/ R
33 call& U, Z, A8 n8 d+ h8 P
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行( e  o: v9 F1 p/ X# c6 U
有时有的应用程序用start调用出错的,也可以call调用
+ O+ p$ f* e5 a. N$ ]! q0 F$ y* O4 e+ ]( i: l# E; j, n
34 choice (外部命令)
$ ?; E5 L' k$ Y' I! x6 W* S# y选择命令
3 K4 x2 R$ k0 w让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
1 r* u0 J* @; L6 Gwin98里是choice.com" R7 ]7 A  D  g- L
win2000pro里没有,可以从win98里拷过来
$ p; Q2 a  C1 p2 ^! X- v, Hwin2003里是choice.exe7 b9 C; n' P9 @9 @+ U4 M) f7 m) [
choice /N /C y /T 5 /D y>nul
3 i, y, w" s8 Y. y/ R- s+ {- k延时5秒; {, H% ^' l0 x
! t! Z: B, Z7 j3 A: e, U; R, [( \
35 assoc 和 ftype
8 C+ {: c2 u% u- y/ t' M1 b5 E文件关联9 v# a# L0 [0 E3 c+ ?7 u) Q, i
assoc 设置'文件扩展名'关联,关联到'文件类型'
8 `1 V& j- E  zftype 设置'文件类型'关联,关联到'执行程序和参数'7 e, w9 s" c$ C2 Z
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
0 U2 F, k- ?$ b$ u: B/ b" u而是先判断.txt属于 txtfile '文件类型'7 Z! C% w0 b! B& H2 o$ f8 x
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1/ B+ P+ l4 w. P9 r6 k4 w
可以在"文件夹选项"→"文件类型"里修改这2种关联) {+ H) M" p+ [7 f7 p/ ~9 b2 {
assoc #显示所有'文件扩展名'关联
  d# X: H8 G6 l# hassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile' `& x* R& m' W& V+ c
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8& l9 M, R: d" X& a
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
+ I$ R$ F% K6 o9 J# l% a* v' Mftype #显示所有'文件类型'关联
5 D" ?" O8 ^( v# c2 sftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*/ [3 ~4 W$ ~: }( Y
assoc .txt=Word.Document.8
# G; u9 X! q) ?设置.txt为word类型的文档,可以看到.txt文件的图标都变了
  O! Z5 M( M8 \assoc .txt=txtfile
4 m9 M; x9 v# R' z恢复.txt的正确关联
! `0 A* t$ a& ?/ V9 v7 k! ?ftype exefile="%1" %*+ K. s4 \8 A, L1 t% ~+ U& G
恢复 exefile 的正确关联
" E1 T; Y; _9 q* J如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
) i5 |3 b( X" f- `, ^- U' f- v# g) P9 T
36 pushd 和 popd- V# s: [4 r) S9 d. M
切换当前目录
$ l0 i. x" p3 y6 m. x; ~@echo off
- J5 t, H6 \1 _% }c: & cd & md mp3 #在 C: 建立 mp3 文件夹
4 d+ b6 j- `, Y- bmd d:mp4 #在 D: 建立 mp4 文件夹
5 l, C" e5 G' I" j3 Lcd /d d:mp4 #更改当前目录为 d:mp4( O) G1 l% g5 `" V
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
2 Z0 V, m5 ^$ X  b: k* F; |popd #恢复当前目录为刚才保存的 d:mp43 ~, k3 z: p+ a7 z* P2 l0 s1 e

' r; e9 `, A# V6 U: T6 {37 for) T1 G/ C- U9 B: J. M
循环命令
3 @: V3 H( {7 S8 e. `这个比较复杂,请对照 for/? 来看
2 R3 e  r& A) ?  V; m( V  ofor %%i in (c: d: e: f do echo %%i
2 P( N7 Z; J- W- q) m依次调用小括号里的每个字符串,执行 do 后面的命令3 ^8 k8 B" v% f, M: x8 j
注意%%i,在批处理中 for 语句调用参数用2个%- h$ r8 Q' P/ z( o/ H" p7 @
默认的字符串分隔符是"空格键","Tab键","回车键"
9 q+ a1 ~3 o3 O7 ~for %%i in (*.txt) do find "abc" %%i% {9 Z2 i1 D% x4 W- s- z% W: K1 E
对当前目录里所有的txt文件执行 find 命令+ p: e2 [7 `' E, ^2 D5 B7 [
for /r . %%i in (*.txt) do find "abc" %%i0 O4 w" C* _9 H# b. N, I  Z
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
# h+ o' M- {/ ?& afor /r . %%i in (.) do echo %%~pni
1 o8 W' h9 N" I" }% N显示当前目录名和所有子目录名,包括路径,不包括盘符
! ]$ S9 @& J( Y7 m, b: bfor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt  y' i% `; T7 e5 ~! ~
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
* w: y4 A" M6 L7 T" dfor /l %%i in (2,1,8) do echo %%i0 d8 k3 t1 ?7 J- @
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
0 ~% |- A- Y; G) S  i3 g( r' qfor /f %%i in ('set') do echo %%i
( g, R8 ]5 z$ A6 N7 M8 q4 H# L0 Z  O, @/ \对 set 命令的输出结果循环调用,每行一个) b0 {1 \2 |. R; M7 t3 I
for /f "eol=P" %%i in ('set') do echo %%i
; d3 Q- Z; r9 B$ ~3 p取 set 命令的输出结果,忽略以 P 开头的那几行) G; j6 x, k5 j7 y& c- @3 I) @) y
for /f %%i in (d:mp3.txt) do echo %%i
# P+ i# _6 H/ l; p显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称# F( u  D- f6 X6 z8 R+ U# @' Y  {5 V
for /f "delims=" %%i in (d:mp3.txt) do echo %%i
6 m: @& d$ v" Y# _  k6 G$ U- {显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称% R" `! f: U2 i* d$ `
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
6 P, Y2 g+ Y+ k. T对 dir 命令的结果,跳过前面5行,余下的每行取第4列9 i$ r" G0 k& Q; d9 g! s
每列之间的分隔符为默认的"空格"
+ W8 J% ~( q9 I" n, e4 i' }可以注意到 dir 命令输出的前5行是没有文件名的
5 z9 Y& ^& Y8 S4 @0 N( Lfor /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (" d2 z6 K0 R. G- v1 w$ [" _' J
echo %%a
4 J$ p3 D5 R5 ~9 o8 _6 M+ eecho %%b
8 F* i3 k) X; A+ z8 z4 L& Q* Recho %%c
# s9 d  i4 l7 o* c7 L3 c)4 k: M0 w% y$ _5 p
对 date /t 的输出结果,每行取1、2、3列
% `9 n  I# D! k) O5 C& x第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
% r- v' E6 x1 y7 S2 R分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
8 p# E$ K7 G7 }0 h) P, n其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的7 F( [* m1 I2 B7 T' g5 O0 ?2 p  E: z. g6 h
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b% E$ [& B8 ~; `, t' \. V
取第2列给 %%a ,其后的列都给 %%b
0 t: @  ^0 A7 `. ^( n+ K* |5 J! E5 T) c+ f+ ]
38 subst (外部命令)
. b) K# p0 o2 V) e映射磁盘。
9 e( m! k$ V! W* R. h' dsubst z: serverd #这样输入z:就可以访问serverd了5 t: [, R  ^& e3 X- z% e0 ^
subst z: /d #取消该映射
! J- t! @9 o4 [% F2 \subst #显示目前所有的映时4 R( `: }1 U) b3 S# {  d+ F

# j0 ?! s$ t7 k6 [3 w% y39 xcopy (外部命令)8 C) B8 Z7 N- u3 e* G
文件拷贝9 ?( g6 U! j5 j' x5 [, z9 a
xcopy d:mp3 e:mp3 /s/e/i/y
8 a8 Y2 s8 r9 P% {0 s" U复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
: s# O$ F( U1 ]加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问5 k1 [, h9 @# m0 {

# @; c; x: u: d+ |! p( N常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
    / @% V9 K8 A. y, e7 p4 K7 J
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:5 V$ W1 a$ b  h% {. f8 U; [4 ]. B* l

    . ^% i& v& v- G' i/ P
@echo off
6 S% _7 W6 M! S( Uset p=aaa, _: n. u6 P8 v) G+ K2 _+ H
if %p%==aaa (
: e' p/ S" D+ l* V2 y% H5 _echo %p%
* m" g( s7 k* ]: {4 Jset p=bbb
# @- @: s# ~; _* @2 Zecho %p%6 G, z0 ^( f: Y/ W4 i- V
)$ f4 z. u+ t  W! J
pause
  • 截图:
    0 h. T7 p. l2 t; x4 o7 n: |
  • 2.批处理.bat 文件中输出中文乱码
    0 ?# F5 h5 `: X) i) x
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:
      + H8 s# q, R; D3 Z- S* d
    • 效果截图:9 \; A) e7 v( B( n
      5 ?( _7 p4 p. u* X4 J) o

    2 o8 w3 H4 W% W  R) u" n
" J4 k3 P; D% O+ [+ _/ O

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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