扫一扫,微信登陆

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

搜索
查看: 1684|回复: 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 文件中输出中文乱码
  • 解决方法在文章末尾!3 \. z- B5 W( L% g5 k$ q
前言
  • 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效
    % d: j9 w/ B, }& ]' F) k7 J
在Windows中善用批处理可以简化很多重复工作
什么是批处理?
  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展7 A3 ?$ w/ l1 c7 _( z- |$ s1 M. E0 ?. r
    名为bat
  • 目前比较常见 的批处理包含两类:

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

    / v5 e$ L" ?8 O. z  F( r8 E
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
( e  z( k4 U1 R1 x. ?) x( n+ Z

/ f' X; h7 ~: P/ E6 y$ |; aWindows Batch 常用命令
/ g5 [8 O0 \9 }) J1 echo 和 @
& O: |& ^$ c6 Y; y: D9 ]回显命令
; \' u+ d' t& p( @' v) c# C@  #关闭单行回显$ j* C# U. x. V) T
echo off  #从下一行开始关闭回显
! ~# a; ^. D3 K@echo off  #从本行开始关闭回显。一般批处理第一行都是这个" r2 W( d1 |! m; f
echo on #从下一行开始打开回显
  Z$ z1 ^, ]0 R8 L. ?& ]echo #显示当前是 echo off 状态还是 echo on 状态. I3 i' m/ i1 p3 ~  ]
echo. #输出一个”回车换行”,空白行
" l) ]/ a) I* y: ^9 V. W+ e#(同echo, echo; echo+ echo[ echo] echo/ echo); `) d1 I; f# m6 N

  f) j2 e& X& c8 [2 errorlevel( {& e- M. D; i, Q1 `+ n: x1 t! Q
echo %errorlevel%
: T8 d" P% x& F, U2 {每个命令运行结束,可以用这个命令行格式查看返回码
. K( U# ]" I$ h1 l6 n默认值为0,一般命令执行出错会设 errorlevel 为1
0 F3 |' g; s6 t' A7 {" y6 p+ }# l, n+ w9 |: `
3 dir  a$ L) s- e" h8 x7 n% ^1 v* }& u4 T" O" w
显示文件夹内容4 ~5 \2 F1 [2 G, @- K0 L
dir #显示当前目录中的文件和子目录. J: e& J# `( L. q$ D
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件& D3 {0 c. u# W1 t4 f6 q
dir c: /a:d #显示 C 盘当前目录中的目录
* E% U3 v' r7 _6 L& j* D. cdir c: /a:-d #显示 C 盘根目录中的文件
. `8 I( G  |6 A5 vdir c: /b/p #/b只显示文件名,/p分页显示, V. ~8 p/ D* l8 K
dir *.exe /s #显示当前目录和子目录里所有的.exe文件
# R" W4 `# W( a% b6 _: p: g+ s/ M* X; J5 y1 M4 g7 I. E! `
4 cd  H( v5 K* [$ I; x$ ?
切换目录
( a$ u& k( p& v3 K" o6 Dcd #进入根目录
2 \3 s0 R  Z, [: f2 ~( Ncd #显示当前目录1 Z7 _6 H* R( x* e0 O) b
cd /d d:sdk #可以同时更改盘符和目录* z# w  r* x. P, C  }
1 Z4 C+ |5 D/ r
5 md, o, @. V& `/ C. L
创建目录  s) a  \* F% |5 d9 j& j
md d:abc #如果 d:a 不存在,将会自动创建中级目录
; b  G- v- u+ y  M#如果命令扩展名被停用,则需要键入 mkdir abc" v; j& j1 j4 E
/ t) U% m4 ?  J: C: I$ A
6 rd
8 ~' V1 k. ?# H删除目录
# f/ F3 [8 g) Nrd abc #删除当前目录里的 abc 子目录,要求为空目录4 d2 l5 o: d9 C4 g: d/ |! N2 o) O2 p
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式4 }; V4 P) H" ^" F- ~
! u. W0 D5 @0 Q' L, e% c
7 del) v9 c2 e) {+ r; q. F  v- Y/ Z
删除文件* v2 P6 O7 x8 a0 h) c+ ]' j9 R# _4 Q
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件( ]6 U, z" q- p3 x) @0 M" ~# u2 Q
del /q/a/f d:temp*.*
5 g& V! V4 c2 k" o( b# K删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录6 o2 R% z. F- b, z
del /q/a/f/s d:temp*.*7 C8 b& C1 z1 o, W& Q0 k
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
9 k7 L2 M9 |! j' `- f
1 L8 Z3 v$ t7 u' q2 Q8 ren; R+ J8 O. @, n: x' b; r
重命名命令) B$ a( V/ `, V. o$ I
ren d:temp tmp #支持对文件夹的重命名
6 Q/ r; _9 P! B* D( [2 f$ s4 q- S+ \9 e& M9 g2 r# W
9 cls- N+ V5 p3 V8 i6 B' c
清屏
) J5 I. f; Z0 h/ ]' @10 type
  n5 t2 U0 |6 r( A1 K显示文件内容
5 [% A) M7 k3 `6 Y: ztype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码  {! Y4 A' w: D( ]0 b+ o
type *.txt #显示当前目录里所有.txt文件的内容3 a' A3 h2 ~7 S$ k  _9 ]  i5 Z
, @0 c7 Y2 {8 D. E( w
11 copy/ q0 e1 b# b" }6 x- o
拷贝文件- E0 A! O& Y: y, h' g
copy c:test.txt d:test.bak
( {  X, V% [( N0 P( W复制 c:test.txt 文件到 d: ,并重命名为 test.bak5 Q6 b' }, {' Y' j# P" u
copy con test.txt! s" k, g: e1 Y/ g4 C
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件9 m" [8 r( s- y/ X, e/ W
con代表屏幕,prn代表打印机,nul代表空设备. w4 D. Z+ E' x/ I5 {0 u, r
copy 1.txt + 2.txt 3.txt" j+ m# y0 s- I# I4 w  q
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件# B" m5 t' M! L8 K8 ~) t
如果不指定 3.txt ,则保存到 1.txt0 r7 r2 \6 d0 i6 \+ {0 Z7 g
copy test.txt +: ^* r8 d( X+ L/ Z, c' _0 T: S) w
复制文件到自己,实际上是修改了文件日期
. D& Z, K+ k7 y: |0 o4 b! b0 Z# M" E# H2 N4 A  C2 o
12 title3 z) ~% w* e& |' d
设置cmd窗口的标题7 N- L1 h  e9 f  V
title 新标题 #可以看到cmd窗口的标题栏变了
5 s( o" r1 h1 v5 v' |( s# k$ F
, n1 Z6 Y% k% Y4 L- q6 b13 ver# r$ W7 A9 U, J5 k0 M
显示系统版本- S- Q" p/ S9 T: m- z7 }! H
' j8 n8 A6 [# D# Q0 t
14 label 和 vol, M; P9 C/ p7 J% A7 L3 {) z* t3 B- f
设置卷标
8 t- j4 g' R- H1 Bvol #显示卷标
$ q- ^( ?+ T9 x6 h9 o5 Slabel #显示卷标,同时提示输入新卷标
$ a5 \% ?8 y( T+ `& t2 `5 O7 jlabel c:system #设置C盘的卷标为 system
$ O6 b: R7 H: c8 J- [
8 L$ X, ?! w  Y* x: j$ G15 pause" \6 E! w% N! [3 n3 _
暂停命令2 U4 c1 c6 h1 B% l
! d4 c* E" I! D$ X' y' p
16 rem 和 ::5 h+ A7 i! }- k/ r* M
注释命令$ s& w" z) ]1 Y
注释行不执行操作# A0 x8 M2 i2 K

2 Q9 j. d7 m9 }) c$ [( _) b1 N8 d17 date 和 time+ J: k! O$ |& w& c
日期和时间
# e3 T3 k' w: q# v& H  J0 G6 odate #显示当前日期,并提示输入新日期,按"回车"略过输入3 a. I, A8 A3 ~8 z/ {0 K
date/t #只显示当前日期,不提示输入新日期
" \* R7 X; E% ?time #显示当前时间,并提示输入新时间,按"回车"略过输入* k3 u/ D" }7 K% w$ o( a1 B8 h, q
time/t #只显示当前时间,不提示输入新时间
7 }$ f1 a3 A( k9 M" Z0 _2 x1 A1 j1 c+ @% w
18 goto 和 :
) ~& y- Y! b1 ^, e跳转命令% j& u7 d% m% L& d
:label #行首为:表示该行是标签行,标签行不执行操作
  A! D: x3 T3 m5 R3 sgoto label #跳转到指定的标签那一行
8 W" t4 C) j  y  g1 X9 [' E7 }
4 x6 @/ t4 d- T! y0 U6 s3 O. Y. J9 ^19 find (外部命令)
4 w8 F- a8 ?6 o查找命令, `; V! N7 Z$ r: s5 [9 t  x0 ~) u
find "abc" c:test.txt
) s; H0 J. W4 Y$ S6 d在 c:test.txt 文件里查找含 abc 字符串的行. }7 ~& U4 ~0 ?7 X7 x: _
如果找不到,将设 errorlevel 返回码为1
4 e. I6 ^4 F) l3 ?! m3 wfind /i “abc” c:test.txt
. N  M0 n: E8 Q) U查找含 abc 的行,忽略大小写
1 @4 m: n- R! T9 u; ^- ^$ Ufind /c "abc" c:test.txt+ r& K% N; o! K7 D
显示含 abc 的行的行数
. R0 C0 v  \; x2 y
* o3 O/ c. d9 W20 more (外部命令)
$ w8 E7 ~/ O) r' i2 Q" h逐屏显示
. S3 S7 w/ A+ L. @2 _) U+ c7 ]more c:test.txt #逐屏显示 c:test.txt 的文件内容2 g) {; ~& `1 Y& b! ]; q
0 G3 l6 B1 C( E" x% k
21 tree7 k2 R$ z9 M* g
显示目录结构
* ~$ ^0 ?' a+ V- m7 X' U. ptree d: #显示D盘的文件目录结构
' p* X8 o4 \+ Z% L8 t" k" r$ o  k% b$ j% m! r4 Z- w
22 &/ n7 Z$ v+ ]* n* r% s
顺序执行多条命令,而不管命令是否执行成功
+ b0 y" @3 N. r6 J" U, P. y( S7 N4 F* D) e& U/ _" `
23 &&
$ m' [! U4 C, M8 \6 B  d# [顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
7 I  E8 |' B/ V! ?& bfind "ok" c:test.txt && echo 成功! y6 _! V  q3 O9 a# f+ c- C
如果找到了"ok"字样,就显示"成功",找不到就不显示. M9 o! {( M' {

8 E5 ]7 y! T, v1 }" Y/ t7 i24 ||4 s( y9 }2 T7 i
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令# w0 X. W- b+ c% l2 E& V+ d3 P! W
find "ok" c:test.txt || echo 不成功
1 f( Z# G0 j9 C% J& W5 s5 z- {如果找不到"ok"字样,就显示"不成功",找到了就不显示# @) X6 P- l( i/ ^% f

; H( E# Y! \, p( \8 \6 D% x6 j7 a/ L25 |( j" M- e8 {: O8 i' |; k. s
管道命令
+ o3 ]0 H4 c9 M# y$ O9 tdir *.* /s/a | find /c ".exe"9 M# f% V/ X  E; G  `
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令0 y- v3 D, S/ g7 L8 A0 F! K5 L
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
- M4 |; x  U" _' N9 w4 l! J; Qtype c:test.txt|more
6 j: \/ R0 S0 k+ C这个和 more c:test.txt 的效果是一样的' ]! A6 r9 U- p' u
  G3 @  U; T2 W( j/ M5 [+ a5 }
26 > 和 >>
1 L5 G4 f' a; q4 u6 J5 U" t输出重定向命令
1 r9 H2 r7 i) h/ B, W7 l) Z* G3 L> 清除文件中原有的内容后再写入
% _4 k" f4 {, o3 D+ b, r0 n; N>> 追加内容到文件末尾,而不会清除原有的内容
0 X% o/ p: \0 ]& |主要将本来显示在屏幕上的内容输出到指定文件中- F2 S9 ~3 K4 I( s2 e
指定文件如果不存在,则自动生成该文件
* t: l# z& E8 H* W& ~type c:test.txt >prn
1 k1 d0 x8 q4 g  {3 G, n0 e屏幕上不显示文件内容,转向输出到打印机
7 v2 e6 n: g! F( Q; Uecho hello world>con9 n2 K2 a* l2 c, Z1 V5 g2 l. `) e& U
在屏幕上显示hello world,实际上所有输出都是默认 >con 的; ^- |6 @/ e/ \% l2 N8 B# H% r
copy c:test.txt f: >nul
# ~9 Q: j+ [! P$ G( U! P% o3 k拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息- H* n2 R( G3 |  N8 X6 w% S, U
copy c:test.txt f: >nul 2>nul
7 Y/ W8 E/ B. N7 I不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息% g" _2 Y$ |, L! B% }- A9 D; d$ ^
echo ^^W ^> ^W>c:test.txt5 ^* x% N* r* X+ z, K
生成的文件内容为 ^W > W9 _; u8 w' l7 K
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号0 E) l0 ?5 N# F& W/ [7 k  }
& _  s  H3 P6 p( x
27 <
& Z2 F: _9 Y; D- t( G从文件中获得输入信息,而不是从屏幕上
/ T' ]' R9 y8 p1 e5 x一般用于 date time label 等需要等待输入的命令) {! b/ B/ W7 v3 k$ A  u. I
@echo off; X) ]# ?3 a7 U3 Z2 t. b
echo 2005-05-01>temp.txt9 t* Y- J" C% B" t. t9 k; F7 K
date <temp.txt( d6 X  h7 ?) P+ Y
del temp.txt
' W- W  G2 t/ l, q: v7 m+ a这样就可以不等待输入直接修改当前日期8 v& V. I$ F3 [6 Q& [; e

" z7 _* L$ c, I+ G& O28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*% Y  ]  A! ~  j' O5 S1 k
命令行传递给批处理的参数
2 U2 ~" `( @! R" S! r0 L$ T%0 批处理文件本身
( F! x& x! J  r# w3 N; k%1 第一个参数
' x1 A6 w' _' Z" g%9 第九个参数
6 X' q6 N/ L1 f8 g8 B+ k+ p%* 从第一个参数开始的所有参数$ T+ Y* ^8 c% y( ?" n# ?2 x
批参数(%n)的替代已被增强。您可以使用以下语法:2 E7 p0 X& ^$ `' ~
%~1 - 删除引号(" ), 扩充 %1
  D) T' T( A; b%~f1 - 将 %1 扩充到一个完全合格的路径名
$ S6 ^3 I( n$ k2 V& }: y%~d1 - 仅将 %1 扩充到一个驱动器号
# n+ V/ @- {: p2 `4 Y6 z7 D%~p1 - 仅将 %1 扩充到一个路径& W8 }2 f- }$ m. \% p. k  t! \
%~n1 - 仅将 %1 扩充到一个文件名; ~7 }; l  D7 F9 o
%~x1 - 仅将 %1 扩充到一个文件扩展名
# a* `. O  q# Y0 W# @%~s1 - 扩充的路径指含有短名
! V$ F) E4 }3 L% v$ K  C%~a1 - 将 %1 扩充到文件属性7 b! N+ I3 v; \
%~t1 - 将 %1 扩充到文件的日期/时间
1 K* ~' ]6 O" [! g  J%~z1 - 将 %1 扩充到文件的大小
; f2 |# R) g6 ^2 h%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1/ y) v7 j1 \+ v! [! V3 V) b8 A
扩充到找到的第一个完全合格的名称。如果环境
  B* n% l6 Q4 h7 z% Y变量名未被定义,或者没有找到文件,此组合键会% S; ^- {, A3 g8 `( ~$ S
扩充到空字符串
! H7 x$ B6 A+ z% i可以组合修定符来取得多重结果:9 n! D2 Q* b2 O2 D
%~dp1 - 只将 %1 扩展到驱动器号和路径2 p# y+ {+ w, S$ ^( ^
%~nx1 - 只将 %1 扩展到文件名和扩展名+ _7 S# X1 l$ T7 v* T5 q
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
6 J) R6 l  W( k' @: e- q并扩展到找到的第一个文件的驱动器号和路径。
+ M2 m& q# C& v: a& q+ g$ i6 ]%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。) C/ s+ C+ h" P
可以参照 call/? 或 for/? 看出每个参数的含意, a( v8 U* Y+ E8 a, e. G- E2 k
echo load "%%1" "%%2">c:test.txt; A, Q+ w) l' r& s: d
生成的文件内容为 load "%1"  "%2"- A+ f- x/ a4 e$ y' `
批处理文件里,用这个格式把命令行参数输出到文件. s& S. U* m" Y# T; A; d1 C
; l3 S2 o* R/ n4 {4 \1 @
29 if: a! x; R+ h, N* x3 q9 h( Q
判断命令* k% A: M: k4 j* x
if "%1"=="/a" echo 第一个参数是/a9 A, m5 H; X* H" O: A2 @' Q# P) s
if /i "%1" equ "/a" echo 第一个参数是/a, b; h, c" a( C+ {
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?  l, r) K6 Q0 G3 u5 h6 ~
if exist c:test.bat echo 存在c:test.bat文件+ h0 p- A/ L, {
if not exist c:windows (0 q2 X0 F7 ^, ]& W6 Z9 s
echo 不存在c:windows文件夹& j4 }4 n6 {: X. }- W* v# `
)
$ l6 y! i& |" H6 M6 i. E* `if exist c:test.bat () }9 y8 Y+ o8 f( i8 `1 H, V0 e
echo 存在c:test.bat) f  Q5 G" s0 ]  v) W
) else (
; y- ~+ v4 W. I# t/ J) a; J( A- Uecho 不存在c:test.bat
9 |9 x2 |# z2 {0 k7 b" T)6 ^# [  B) _3 n
30 setlocal 和 endlocal; |- q- I8 x( D' [
设置”命令扩展名”和”延缓环境变量扩充”8 J0 e: w. y6 H% J# _
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
/ @- v1 B% o0 {/ O. D9 P0 O7 |SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"( ~' M8 K; b/ L
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
7 p" W  i8 C  d- bSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充". ^, s6 m% s2 T
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态
  L. ?/ k  c2 D2 Q. f“命令扩展名”默认为启用
) @0 s2 ^5 j, k6 n5 f“延缓环境变量扩充”默认为停用
6 r0 Q3 ^7 _0 q4 z批处理结束系统会自动恢复默认值
6 ?4 I  U! ^+ y3 ^可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
. @) N/ w. H: d6 N6 H序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确: a+ m' G# u* j  G, v+ M- k& v
保程序能在其它系统上正确运行- }8 c- c- z  L7 J
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
5 H: A+ I7 j  ^' h% u, v9 O' p
; |# h2 V( R8 c* Q31 set$ z7 c4 j+ e; _! f5 |
设置变量
4 M4 l8 j6 T4 P3 z- a4 q引用变量可在变量名前后加 % ,即 %变量名%9 w/ G. P% l8 I. N5 A, F" j/ R
set #显示目前所有可用的变量,包括系统变量和自定义的变量$ H3 P% \. o1 ?# m/ f
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用; S0 O1 B( W  O9 E( V
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
7 R2 \" p( }; h: y% F- Uset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
2 F" l% q2 p" J- ^) @# V. Y7 f) j- Techo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2$ j" }8 C0 t, l; [) ^
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2' f: R) c% k# q" v; U. b
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2, x2 c9 D$ O6 ?( z( ~" N
echo %p:~0,3% #显示前3个字符,即aa1
9 U. K: Q+ T% M# V  vecho %p:~-2% #显示最后面的2个字符,即b20 f: Y# T; S" i/ u# K! W# m
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b0 i5 S# L) T7 @6 k& Z$ A) v
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2' ]6 q  w& N6 n- w1 G3 v; m4 v
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
/ D: P5 l: y$ Mecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2, o9 X, r5 F0 j: b( q* I. U
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
5 o2 H) _+ K0 e; C- ?3 ?set /a p=39 #设置p为数值型变量,值为39
% R/ E2 O) f0 s/ K+ ?* ^& {7 D" \- dset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
2 U) b4 v; K+ @# n4 U# R! A0 {& Sset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用, s6 K; V: n( l1 o' F+ ?: P; J  M
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?5 X# y1 I- ~: q; Q. I
set p= #取消p变量# P- J* W6 p1 X: k$ G. E9 v
set /p p=请输入3 e+ Y3 k% ^# m4 v- Q$ |. b
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
% Y+ ?  j0 U/ m# ^注意这条可以用来取代 choice 命令3 ?0 {3 h1 d3 D  `) t, f
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
* ?! G# o- l: P- L& [% g@echo off
! ~4 C- B- G6 E& M4 U/ F: Qset p=aaa" `- r' h7 r' G% w
if %p%==aaa (, _" y( ]& U* A1 d
echo %p%
/ U1 G1 v* r; Q  t, v, I, b/ Wset p=bbb2 W6 V+ X$ M- M% o; _# ]+ P9 U
echo %p%
2 w! Y1 Q* ~/ q! ?: I' ?: G, y)
  x0 V) L" z0 T; n3 V% `, Q  L结果将显示
! P0 i4 D2 m, _aaa; f5 Q8 O! Y* W8 p  G  F
aaa1 a8 t& O; y" ?- l
因为在读取 if 语句时已经将所有 %p% 替换为aaa
" u& O! ?! P% |: |% U4 B, m  k* |+ s( d这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"* D7 d$ P  v( V% W* h
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
& l) O. e# n4 j1 J$ c5 T  j@echo off
* r: L% A; ~5 q% t, b9 L& D* |SETLOCAL ENABLEDELAYEDEXPANSION
) z6 v1 u' c% M/ J& S- tset p=aaa- ?3 Y) N8 v$ q$ W, V' t9 m. b3 ^
if %p%==aaa (; f% L: e% U4 [7 q% z' L6 X! W9 X0 t
echo %p%( c4 s$ D2 @+ T, r. s& d
set p=bbb% B, v3 `5 `) U+ E6 `/ {
echo !p!
, h5 ^5 {% q+ p$ C6 j0 D. [)
) D% |' N% e' X3 z( ~3 A7 V  iENDLOCAL
: }9 J2 v1 P; B: S结果将显示+ e$ z. D% u! c2 W6 q# N- p
aaa
- f8 h+ P2 `& i5 \$ l  Y9 u- sbbb( Q3 n. m3 j# J5 e$ J. C* ~
还有几个动态变量,运行 set 看不到9 x: l) x6 A" Z/ r, K5 p" n# I
%CD% #代表当前目录的字符串
" l# J6 g: A. m+ ~4 R%DATE% #当前日期; c; u  d3 Z1 `6 E* _
%TIME% #当前时间4 {2 g# w3 Y& w6 Y% [% t3 w
%RANDOM% #随机整数,介于0~32767
  n, Q- o  f. N  R6 z& M0 M%ERRORLEVEL% #当前 ERRORLEVEL 值
6 Z5 J. E( Y6 H%CMDEXTVERSION% #当前命令处理器扩展名版本号/ I& l. K* ^+ d
%CMDCMDLINE% #调用命令处理器的原始命令行
1 z! I9 S; b/ r& _- L. q' W+ |可以用echo命令查看每个变量值,如 echo %time%
4 s7 w. P1 R* a8 |; ~注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
' K  F& C' S& T% O3 x- w5 J
6 |$ i5 s9 E3 _1 P32 start7 W7 I( p9 W2 o: G- X
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令: V6 S) j7 `4 C" k: N7 H' J

4 [# Y3 I6 q6 Q9 v# H2 {33 call9 M6 K6 ]) C# K5 l8 q
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行( w7 [+ |- M; g3 V* r  h
有时有的应用程序用start调用出错的,也可以call调用% b/ X  e6 ^# W) h

  o8 `( H8 X5 T% Q" `4 h34 choice (外部命令)
2 }7 F+ _7 }4 f$ A/ p; a9 r选择命令
$ Y* u9 o9 ]3 g/ m# [% G让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
0 C/ G4 d1 \4 V' k7 Twin98里是choice.com
  b6 S4 X. C4 l- P- nwin2000pro里没有,可以从win98里拷过来
9 Z- Z2 Y+ `8 G. W) Wwin2003里是choice.exe) |3 {" l# w$ ^3 v5 G* X
choice /N /C y /T 5 /D y>nul
' r3 x* A) j3 N; g5 P' p延时5秒
5 p8 R1 _6 Z. C3 {" G& G/ N" s* v# e8 `2 Y% R
35 assoc 和 ftype
; m% v1 H$ I5 H# m7 W6 E" I文件关联
& `9 [+ @2 Q9 X7 I& N4 ]4 Gassoc 设置'文件扩展名'关联,关联到'文件类型'; P* ?! Q7 C7 t+ Q  w4 n4 P1 v
ftype 设置'文件类型'关联,关联到'执行程序和参数'8 K* z. C! |5 z, ^$ A
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开4 G1 ~9 T! q. u& c
而是先判断.txt属于 txtfile '文件类型'
: t% W: L2 _2 v8 ~. y$ v再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %16 }2 @# Q$ z; A3 R8 G0 J
可以在"文件夹选项"→"文件类型"里修改这2种关联
8 J# N3 v0 K$ S3 r6 @assoc #显示所有'文件扩展名'关联* m  O+ _9 e9 q- [, _
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile* U# [6 n/ i4 m, u
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
0 z9 r+ `' k0 `1 G4 U. x+ massoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile1 g; b1 H+ ]) [2 R; `( y% b2 j
ftype #显示所有'文件类型'关联
; s+ I8 Y1 [; u  J: u4 ^$ uftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*: n$ r! v6 @6 O
assoc .txt=Word.Document.8
# K: ?) Q9 o( n' e% k1 d- a2 r设置.txt为word类型的文档,可以看到.txt文件的图标都变了8 W, D) @6 j4 i. |, p  o9 W- h
assoc .txt=txtfile1 g6 X; Y* m& G) J3 D
恢复.txt的正确关联
- }% g. w' r) u! @" k4 i6 [6 Qftype exefile="%1" %*
& w% m; M$ T, p# |! q恢复 exefile 的正确关联7 {) k, l0 z9 I- T2 _6 ^) i
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
- W& }( t: U* N1 [4 P/ y# u
  v( J" j4 z& S9 I36 pushd 和 popd$ J5 t8 @* u4 X' f+ s
切换当前目录
* o+ z- k- k* }0 h- D8 N@echo off
, t0 _! B- S2 U: o: nc: & cd & md mp3 #在 C: 建立 mp3 文件夹
7 }- {- }( Y9 o5 jmd d:mp4 #在 D: 建立 mp4 文件夹6 I5 N" V. w; a  R# M) b
cd /d d:mp4 #更改当前目录为 d:mp4
2 u; ?' g6 e0 P4 X+ Z: Dpushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3* ^  V7 A( R: |" P" P
popd #恢复当前目录为刚才保存的 d:mp4
/ e$ M/ q3 k; g& l/ J; Y5 L# H& j4 P- u" x4 B
37 for) g( _+ Y% \+ ]) j) h1 v8 J
循环命令
# B* p& w8 G, {! A这个比较复杂,请对照 for/? 来看5 }$ e: l# l) y6 L( q
for %%i in (c: d: e: f do echo %%i9 J* P$ a! D& |9 E0 S% e
依次调用小括号里的每个字符串,执行 do 后面的命令
; @7 q2 O  w; d  L$ ^注意%%i,在批处理中 for 语句调用参数用2个%
; o) S7 H; U" p. M: l" k8 `( h默认的字符串分隔符是"空格键","Tab键","回车键"  B. }# N! I- a
for %%i in (*.txt) do find "abc" %%i7 j+ {; l$ z( m- Z$ ?( T8 `
对当前目录里所有的txt文件执行 find 命令+ Z) @- g& B" M* i# Y* F
for /r . %%i in (*.txt) do find "abc" %%i( n) ]3 G( J& t, V0 O1 w
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行" N$ A( G& r+ _# J4 N$ y
for /r . %%i in (.) do echo %%~pni, V  y' o, ?6 E2 ^
显示当前目录名和所有子目录名,包括路径,不包括盘符5 p5 _) @8 n" ]
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt+ O# ?6 Q6 P( d; w  ]* U$ z& g6 [
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去: Y! y5 P1 M* z% R
for /l %%i in (2,1,8) do echo %%i
: ~5 a) t( \; w: U; C" ?" G生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
7 R2 d! u: J& W6 A3 f  {6 ?$ rfor /f %%i in ('set') do echo %%i' d" K* @) V2 k/ R3 K) q5 K. C  F
对 set 命令的输出结果循环调用,每行一个
8 E0 Q4 b# R/ j7 [3 F. @! ffor /f "eol=P" %%i in ('set') do echo %%i% |! O- b5 x1 P3 T5 r' Q: z
取 set 命令的输出结果,忽略以 P 开头的那几行# J1 ]; Z6 j' _: B" E6 k+ P2 G( O
for /f %%i in (d:mp3.txt) do echo %%i
+ q! ^: x. z; P1 y7 R显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
3 a- `6 N: G3 l  X" Z  ], cfor /f "delims=" %%i in (d:mp3.txt) do echo %%i" x9 I( I$ H6 I5 ~
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
7 u4 s. E4 V/ ?, nfor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a# M( M, D) {. y: e8 `8 J+ r
对 dir 命令的结果,跳过前面5行,余下的每行取第4列
" b* E1 v' ^6 O每列之间的分隔符为默认的"空格"1 {* ]. ]/ b' D' C
可以注意到 dir 命令输出的前5行是没有文件名的
" Y5 K# _8 u1 W! X  Q. _) wfor /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (, \. T) n: K7 c0 S& p' H2 g3 ^! D
echo %%a" j; ?7 T$ x+ j1 A/ v- c
echo %%b
. i% i, O$ s; O2 T4 L/ lecho %%c
6 Y( y2 y3 |! _9 T8 d! r)
5 A5 L- i  }$ k) u% \( q+ Y+ ^对 date /t 的输出结果,每行取1、2、3列
, [+ l9 ?3 l& T: g4 k7 a第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
! }, y$ I* [% `+ ]! K0 t. `! e分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
4 a+ _4 v! |3 b, U* z其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的# Z: ^! {6 B" C" J' s! U* g/ [
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
. h+ K7 f* B/ p. |! a& G8 P取第2列给 %%a ,其后的列都给 %%b; \' P  q: n6 y( y% H
  K- n# Y& x( o5 p
38 subst (外部命令)
" @( |1 p/ W" Y映射磁盘。
4 i* m( r$ R7 d% A& P$ Ssubst z: serverd #这样输入z:就可以访问serverd了$ e& a5 A$ x2 v- j$ Z  x1 A3 p
subst z: /d #取消该映射/ Y6 U4 k- Y- A9 W# U+ C9 z4 y6 m
subst #显示目前所有的映时
# N. h$ _- }% u4 Q& H* g1 J
: q& e. k5 P4 E39 xcopy (外部命令)
& D( N% n; N( n! N" C& B文件拷贝
) k; J+ L  Y( sxcopy d:mp3 e:mp3 /s/e/i/y
6 L* ^: X+ e3 N9 @9 q: y复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
8 I) c; s0 }, I加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
& e9 _# H2 ^7 e- q4 ^
  Z( a' f- h& g/ K) S常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退4 {' D1 }2 F. A0 g6 O; e$ Q
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:
      : z/ O9 o2 h0 P. t6 a

    / ]' q0 p0 ]+ J9 \* n* [; Z& b. S2 j
@echo off
6 \6 f7 {, y- c' U1 J- l0 A# Gset p=aaa
/ O- Q' y( q0 R4 K: U- Fif %p%==aaa (( z0 o1 k! E, V6 \
echo %p%
7 r6 \7 R( X/ \4 ~. e2 fset p=bbb
1 C) R* c6 d  T. I7 ^/ B# L" Vecho %p%( [, n) |" X0 s1 Z7 y- ^
)
+ q% g5 \# W) M' i5 t0 A: z3 D/ Epause
  • 截图:
    ' a) ^; K7 Y) \5 \) |
  • 2.批处理.bat 文件中输出中文乱码
    * f" k4 Q0 N4 _; f6 a
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:* R0 O6 M. o7 S. ]# K0 F5 y+ M
    • 效果截图:8 P- f  U2 y: }8 r- u7 q$ }

      1 E9 \9 h' O7 S+ G9 w" q( Z

    4 l5 r# Z9 |: A. U: x; a
7 m. [4 @8 e$ D* U, c% B$ _2 t

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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