扫一扫,微信登陆

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

搜索
查看: 1788|回复: 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 文件中输出中文乱码
  • 解决方法在文章末尾!7 ~  a" C5 R  j1 c3 r
前言
  • 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效) P  t) n  u% M0 \) x$ m1 E
在Windows中善用批处理可以简化很多重复工作
什么是批处理?
  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
    , N& L, D4 k. L3 p" F6 Z8 e名为bat
  • 目前比较常见 的批处理包含两类:

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

    3 h* G" S) o% s' j) Z
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
# n" r, K: c- v  p2 @: u; w* u
1 v8 v$ W" ~# l+ u9 a- u  V
Windows Batch 常用命令4 h4 [/ B* k8 h
1 echo 和 @+ J  \" M; H" O" U! i
回显命令
4 z/ j* p6 d) }5 I; k! e6 [, ?@  #关闭单行回显6 }/ |% q' H$ T' V
echo off  #从下一行开始关闭回显
/ j+ P7 j: b  B3 y, w0 E3 ~@echo off  #从本行开始关闭回显。一般批处理第一行都是这个4 K: f, u' {* {$ ~& Y5 o3 c5 C
echo on #从下一行开始打开回显/ y* L: Z( \1 c+ t, M0 }- f) ]/ M
echo #显示当前是 echo off 状态还是 echo on 状态3 p# G9 R& X3 K
echo. #输出一个”回车换行”,空白行# M* h. T2 V: f6 _/ ?
#(同echo, echo; echo+ echo[ echo] echo/ echo)
, m1 L1 ~( G' T& x' Z' S% Y) c  x$ F6 j3 W: V0 p; q
2 errorlevel
% l: Z! N) r+ Kecho %errorlevel%
  I& s& ?0 q" w, |每个命令运行结束,可以用这个命令行格式查看返回码, \3 H) z, t( B/ `) f4 r
默认值为0,一般命令执行出错会设 errorlevel 为1! q1 ^/ d0 d$ e" w$ Y& H6 M( q
( l) E6 e4 E. m( q  N
3 dir
7 r& }: M! N% N. j显示文件夹内容
( a/ e7 R  x6 H5 e2 `dir #显示当前目录中的文件和子目录0 X, Z9 r, v0 L0 n+ m7 M9 w& `3 K! q9 \
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
: ?6 u( B8 u; cdir c: /a:d #显示 C 盘当前目录中的目录
; R  G- v- \- Y6 S# R6 n/ Gdir c: /a:-d #显示 C 盘根目录中的文件
8 E/ K, r2 T  j5 x( fdir c: /b/p #/b只显示文件名,/p分页显示+ i* @0 f: u: |+ Z1 i
dir *.exe /s #显示当前目录和子目录里所有的.exe文件
# e0 A6 s: J7 U: y" G
4 \7 c' j7 V" l5 Y; r$ r" R4 cd
1 Y- g  k3 e) y7 u切换目录
9 q% j! |3 M) y. p( tcd #进入根目录
4 ]8 {2 i) A6 D4 N+ m0 E7 a* kcd #显示当前目录; p5 w# f+ T% U  Z1 \
cd /d d:sdk #可以同时更改盘符和目录  Z# W" y1 D4 H( M' }/ B

; d; x; G' B8 }5 md
2 S% R$ F: ]# V1 D3 P  b创建目录' C0 p: y( ~, i  G4 p$ e0 ~$ x: ^
md d:abc #如果 d:a 不存在,将会自动创建中级目录
: Z6 H- o2 g" t8 {/ p) s9 @2 B#如果命令扩展名被停用,则需要键入 mkdir abc
7 V& e2 y% K4 [3 j" H, L, n
6 C1 b; {  A7 t8 c0 X) C: T+ W5 h6 @7 K6 rd5 N4 A9 I# T! \; v- b7 u' W: Y
删除目录
7 g3 L" `9 `/ O/ Z. q& Q% Ard abc #删除当前目录里的 abc 子目录,要求为空目录
* Z5 N/ g6 m" Y% I* Y! rrd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
  ~" ~8 o; Z2 s7 f. ]" J8 r5 M- Q+ _$ N3 e! X0 i
7 del
' K7 V9 X5 v& k1 C# K删除文件
# ~5 O; Z$ h( h' l+ @del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件4 A7 l8 b* T2 B# B( N
del /q/a/f d:temp*.*6 ~0 N. p: R; o' h2 c+ i
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
# S- K" o- v- Q$ W+ P* _* T7 Sdel /q/a/f/s d:temp*.*
" e6 r! i; J1 {5 B9 {, L( |4 H删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录. U* m* a; U( u/ R( ]8 g

9 ~5 E& ]6 y, G5 K! R' r8 ren
2 k7 ^6 m2 o$ r: `7 ^重命名命令
% M4 {) C7 i7 I0 W1 lren d:temp tmp #支持对文件夹的重命名
) _4 U) o! [% z# z( n  H* k2 d+ E  S* P* W0 F
9 cls
6 X1 ^  E5 T9 z  ?清屏
! L7 B+ B. i9 g- d10 type
, |: Y' j. {' s1 [; Y( s显示文件内容' l, X! c% J4 X% x
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
7 F$ j6 N5 w& f6 H8 Ttype *.txt #显示当前目录里所有.txt文件的内容
0 z, O# Q2 N, o4 O. x
! n" `% |! I0 s$ i/ B: I' z5 I11 copy$ L, X: D3 V! [7 S
拷贝文件9 Q) M, l6 g( U4 Y; L. U! L
copy c:test.txt d:test.bak  T  k: s$ |. w1 X
复制 c:test.txt 文件到 d: ,并重命名为 test.bak% a( G5 h: f+ J- }7 G9 o0 a4 V
copy con test.txt( y) _3 N5 ?- K
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件' E$ N9 p7 o' r: c1 }
con代表屏幕,prn代表打印机,nul代表空设备) g, k8 z. E0 b- j: M, s
copy 1.txt + 2.txt 3.txt5 v' N4 Q( v" u/ P1 J
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
- _- b: X4 N- T4 v$ J; b如果不指定 3.txt ,则保存到 1.txt' d+ f. z4 B2 L) c4 c0 m+ ^( p' m# ?
copy test.txt +1 a$ n/ R1 M. S: M
复制文件到自己,实际上是修改了文件日期1 J' d4 K2 z: w; S* Q! I) [: U

: H) n$ \6 t! x+ C( d* Z' a12 title! c+ v* s5 o; B$ N2 s# t! v
设置cmd窗口的标题$ u) y: a) M2 `
title 新标题 #可以看到cmd窗口的标题栏变了( E/ h. [& X3 T1 W- |
$ c& x* v4 S- g. Y0 @
13 ver
7 X# H8 K) ?6 k6 J显示系统版本7 K( [7 R5 Z, D7 O( I) y! R

9 G% O; |7 V% L' j: S6 K, Q! E14 label 和 vol
' {# p  J. K% {! }6 _4 @设置卷标- Z1 P) G* `7 u/ V# U5 ?
vol #显示卷标" o3 G+ a2 ^/ X$ g) d" E* d
label #显示卷标,同时提示输入新卷标
6 y6 L/ k3 |7 Z( u5 clabel c:system #设置C盘的卷标为 system- W) Q. t/ `$ \/ J

$ X# t& [2 r. K9 Q* N15 pause# e3 C, w/ g+ g
暂停命令
9 j* i; `& E) c3 ~& T' U% A! H" f; {5 z: y% R
16 rem 和 ::
' {3 _: q7 C0 K$ r; B. j6 r注释命令$ E0 B+ m( A. x9 C7 Y# F& m* U3 f2 r  c
注释行不执行操作
1 R, t) h# \% J! L: l# K9 H7 b1 A. V2 x
17 date 和 time8 P- T0 ]2 [% g' l; |
日期和时间
5 ]+ W3 x  v8 `' X! _- [, Hdate #显示当前日期,并提示输入新日期,按"回车"略过输入$ K" u, s- `! l
date/t #只显示当前日期,不提示输入新日期! Z& C0 W% m9 C' j- l2 E
time #显示当前时间,并提示输入新时间,按"回车"略过输入0 N6 z4 }+ W" i* u
time/t #只显示当前时间,不提示输入新时间$ \) Y6 t6 O! `( `
" j* z/ G( a& D( p) o
18 goto 和 :! J: t, b  M% q$ O* L  i  c$ ~
跳转命令
3 r9 d9 f( T2 A% a7 h:label #行首为:表示该行是标签行,标签行不执行操作
4 t2 f" t4 Q6 e' @( jgoto label #跳转到指定的标签那一行
4 K; k" @* F5 p/ {6 Z: G: ]8 j! C, |4 s# Q5 Q0 H
19 find (外部命令)- ]1 ^  d) r/ W8 A/ N9 T4 H
查找命令
+ r) B) C. C! g7 h. Tfind "abc" c:test.txt' g8 G6 \. |9 K' @9 a7 {( H! m
在 c:test.txt 文件里查找含 abc 字符串的行
/ r' b7 s2 t1 |1 G& F2 p如果找不到,将设 errorlevel 返回码为1
7 a7 Q3 E3 g' ifind /i “abc” c:test.txt& _& \$ _; n2 j1 k  B
查找含 abc 的行,忽略大小写
* H. [9 P  V( k7 h& m+ A+ Qfind /c "abc" c:test.txt6 c( f+ n; I' W  K: V
显示含 abc 的行的行数' f! ?" o* p7 j* }( j+ x7 R0 c; K
( J9 y$ \& R) D3 Y8 V* J- _/ z
20 more (外部命令)
/ V0 |4 w3 Q4 {9 O4 B# K7 }逐屏显示
5 W, o5 P) s4 B' v6 `) w4 F1 Umore c:test.txt #逐屏显示 c:test.txt 的文件内容- ]+ Z+ J; @9 F6 J0 ?
, T7 O8 r) O: s: ^
21 tree+ ]9 x  p4 Y3 r9 }) _# s
显示目录结构) O1 j, q8 H( E$ S( M
tree d: #显示D盘的文件目录结构
1 n/ C! x2 x5 N& V+ R
! K; r5 M) P3 d$ y" G22 &
$ \- s8 X0 E( l0 S$ V' p顺序执行多条命令,而不管命令是否执行成功0 v/ I4 ~+ }1 ~& O

+ q  Z) P0 d" Q1 U- Q) D23 &&
6 s6 u( p6 E- Z* @顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
- c7 o6 m/ ^) w# J$ c2 Wfind "ok" c:test.txt && echo 成功
, A- o1 H- |2 s, d- D$ x; W如果找到了"ok"字样,就显示"成功",找不到就不显示2 _1 Z1 ?5 |( ^( h) `! }

3 Q; g' ]5 u+ x0 ^0 G+ L6 H4 M24 ||& Y9 L# c) U8 D
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令8 |. q6 N9 A* w  D
find "ok" c:test.txt || echo 不成功
4 e8 K* [- w( u6 e. Q- J6 |6 q, m  h如果找不到"ok"字样,就显示"不成功",找到了就不显示. h3 u0 l6 O/ O6 a$ M# l

, [4 V, z+ g; o$ v6 A7 n25 |" O# X8 D7 z6 \; k$ T
管道命令
" p- O- i8 g( }- P) ^- W6 `" kdir *.* /s/a | find /c ".exe"7 o3 f* }3 ?& `8 Y3 Q% P  j- Y
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令* z7 P* h  \4 t
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数* G# ~- V: B. ?& s& N( E# J& _' i
type c:test.txt|more
4 u8 G' v: G9 A: b' b这个和 more c:test.txt 的效果是一样的
+ y& `5 `" {$ {$ Z$ m/ n: O' Z6 H; t* v$ m
26 > 和 >>9 ^6 Y2 e: }, b* s
输出重定向命令
, S* I9 v& G7 T5 N8 m# y# ]; A$ Q> 清除文件中原有的内容后再写入( I; v" _  ^( @
>> 追加内容到文件末尾,而不会清除原有的内容, O" ]# U9 Z: n" J) W( Y
主要将本来显示在屏幕上的内容输出到指定文件中1 F" W/ o: J3 D" ~; S! q3 G
指定文件如果不存在,则自动生成该文件% A+ `8 \, v* s6 z- p; [2 z$ i
type c:test.txt >prn
4 y* k. f  V- |- H" Y5 Y- v8 D屏幕上不显示文件内容,转向输出到打印机
2 C3 X, y6 d, Y1 aecho hello world>con5 s) }# X' z3 l+ N/ o; [
在屏幕上显示hello world,实际上所有输出都是默认 >con 的( U2 T: Q! i6 i: H& ]# h
copy c:test.txt f: >nul
% E* b' v. Z8 x! L" `6 T( C% n拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息5 l9 H6 o2 T3 N( g! Z
copy c:test.txt f: >nul 2>nul
3 s+ q# l# w: Y不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
' e4 ?4 R4 o2 w- Hecho ^^W ^> ^W>c:test.txt! D& y1 R+ Q2 w) @
生成的文件内容为 ^W > W
* @8 D' m5 j' d! g^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号+ d3 F$ G+ r' D4 `( j
1 O( u& y* }: s1 K5 \9 z; n- Z# B6 o
27 <$ v# z3 N4 j7 y7 i, ^6 b
从文件中获得输入信息,而不是从屏幕上$ a4 u+ X1 {, a9 [* D& t) E9 x2 A) e" \
一般用于 date time label 等需要等待输入的命令$ ?5 G. n0 u2 |8 H  C
@echo off
; u% }' p3 q1 C6 a" Iecho 2005-05-01>temp.txt
" S; l) I$ C) Z! B6 k% _+ Adate <temp.txt1 B4 J7 n' W$ S1 _9 E1 c" C) ?
del temp.txt: M: s! @. B0 ~/ C0 v
这样就可以不等待输入直接修改当前日期. w! e* E7 p4 c4 @- D  c1 l$ R

9 l4 o7 e  }, o3 R7 |/ ]28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*; ~9 j/ m8 b6 w& y
命令行传递给批处理的参数
) p* Q: ~) _2 Y! ^. e! @# e%0 批处理文件本身, u; ?. v  S- h7 q+ S1 e. \* v. D( {
%1 第一个参数6 x/ Z' h. Z0 A2 U6 a
%9 第九个参数) z$ T! [5 f6 v. G& L) Y$ D: a, X) D
%* 从第一个参数开始的所有参数1 C: A( y4 Y: a! y
批参数(%n)的替代已被增强。您可以使用以下语法:
% g6 d& l8 E6 o0 ?/ O! g3 _4 g%~1 - 删除引号(" ), 扩充 %1
( e! \: ^: Q  S* e/ v- ~5 \1 i%~f1 - 将 %1 扩充到一个完全合格的路径名6 @$ s$ D1 n/ I0 g  @
%~d1 - 仅将 %1 扩充到一个驱动器号
- S1 i# E) s; X7 D# Q0 O%~p1 - 仅将 %1 扩充到一个路径
# A; b1 j" `, x' `8 s, U# H%~n1 - 仅将 %1 扩充到一个文件名0 V3 u2 h' J1 \7 C( O' v- C
%~x1 - 仅将 %1 扩充到一个文件扩展名& l$ @' ~* q% [& y0 s% C
%~s1 - 扩充的路径指含有短名1 y2 r) \5 U# e5 H' u
%~a1 - 将 %1 扩充到文件属性: ~+ u( C  K/ g- I. U: R8 T
%~t1 - 将 %1 扩充到文件的日期/时间
- i( f& b: D1 K) C%~z1 - 将 %1 扩充到文件的大小
8 k3 v" K: b6 I; O%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %13 ?3 @/ h  ^7 L* [/ ^  e; M
扩充到找到的第一个完全合格的名称。如果环境
  D6 b! j1 Q7 D( O+ C变量名未被定义,或者没有找到文件,此组合键会0 ^+ D/ A5 U2 o; k9 L8 ]7 @
扩充到空字符串
' Z% N, n2 h3 j$ w可以组合修定符来取得多重结果:) a; O, `& k8 O8 ]7 y1 a+ t
%~dp1 - 只将 %1 扩展到驱动器号和路径
5 X* d4 l, r8 U' c%~nx1 - 只将 %1 扩展到文件名和扩展名
9 ?6 I4 f: C1 i- a%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
- @, L5 z2 a9 |; v1 r5 F4 W4 O并扩展到找到的第一个文件的驱动器号和路径。
* M2 S0 Q' t1 m6 `1 `' n& c# h%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。/ b: R6 T: ~+ ^
可以参照 call/? 或 for/? 看出每个参数的含意
2 _# f% y. d& k6 }& ^. r/ Secho load "%%1" "%%2">c:test.txt+ t1 d4 G! p1 c
生成的文件内容为 load "%1"  "%2"9 Y" F. a, {4 t. C
批处理文件里,用这个格式把命令行参数输出到文件: k( }/ c! [9 U( h3 ?

; U% f5 V& q3 z' M+ y" e29 if
0 t1 S$ f/ B  |+ _4 t; D) Z, ~& B判断命令; z" n! f/ w& K5 z  s+ B; g
if "%1"=="/a" echo 第一个参数是/a% a& ~8 K+ K: k  A- D
if /i "%1" equ "/a" echo 第一个参数是/a
: p/ z% e9 L  q4 s: r/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
7 K$ c% {) P$ Q$ m1 n) Nif exist c:test.bat echo 存在c:test.bat文件
, j0 d0 g6 _; m% V+ {2 K: fif not exist c:windows (6 B8 F. y' r  S: A; r) }
echo 不存在c:windows文件夹" d. F. h2 K# L  U5 r
)6 W1 g' p: d3 l8 F$ J% z
if exist c:test.bat (
% j/ Q3 M, r+ M5 Q& V8 L" w( qecho 存在c:test.bat' H' u7 i7 H$ q: w' U! [
) else (
' k# _3 w. m9 D. N0 o8 Kecho 不存在c:test.bat! o6 ?( D: `/ \5 {
)
. h- C5 t, b0 L! S30 setlocal 和 endlocal6 o+ T! b) r& M9 `: M
设置”命令扩展名”和”延缓环境变量扩充”! u5 y) Z  T5 ~* P" l5 b" h* _
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"' y' z  S1 x  Z# q
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
& }" F: ?* f' g" w' @' VSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
$ b# R! s$ P  ~4 p9 x: Z0 o4 SSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"# |* K6 @# [1 Z5 y2 S
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态
* t7 u) j5 D, Z1 R“命令扩展名”默认为启用# l* Z* g' }. X1 w# ~
“延缓环境变量扩充”默认为停用& |* V; k% n6 [- U: ^* w
批处理结束系统会自动恢复默认值
) f/ q8 s9 j. T/ D可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
7 R( {$ v8 y" ]9 @# L序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确7 c. C7 p. O5 _8 q
保程序能在其它系统上正确运行
7 A1 E+ V3 X0 ?4 R; L"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
, {) L4 I+ W, q# y& U4 R  ^: Q1 [6 R: D
31 set
# q8 R% a3 S5 ]! g9 ]6 A8 I设置变量
& I4 V, N9 U7 @' X+ i2 y. U6 z3 v引用变量可在变量名前后加 % ,即 %变量名%# [- j: I6 c2 p! k) y- O" V
set #显示目前所有可用的变量,包括系统变量和自定义的变量
  Q1 [; S8 A! A+ u6 d$ ?echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
# P5 M$ p5 z" ^" Q' z  A* Hset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
, c' Q9 e& Z2 B3 n; Eset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2) ]: H- [# F# Y5 o
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
% [* Q" \  I, necho %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
4 F5 g3 l4 P0 q! @7 k: |echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2
2 O. a4 Y7 p% I; z* necho %p:~0,3% #显示前3个字符,即aa1
- ~$ Q' C9 v0 I/ a+ `$ J1 b) Decho %p:~-2% #显示最后面的2个字符,即b2. K* i1 ~+ Y/ ~9 m: Z: A+ D7 M' i
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b5 J3 R2 {& u' N
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2- Y6 a! A8 W; i6 G3 X: ]
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2* W! ?# A5 `, H. D
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2: f/ B8 I+ {0 U: Y$ x6 x9 i
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2. o$ V7 _- G8 Y
set /a p=39 #设置p为数值型变量,值为39
0 V1 h! V+ c) g& Y0 H- p8 W5 Fset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3( S8 Y8 g  A% ^) w2 o
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
: R/ i- c/ V" c  @/ F; w4 D$ Mset /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?( m! p5 m' p) d3 d+ w
set p= #取消p变量
4 ~" P" D$ a6 n; J& l9 P3 o8 G/ Hset /p p=请输入) W1 |. R( H$ F/ S8 i& `0 f
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
- ~9 o; w+ u* ?5 \7 O注意这条可以用来取代 choice 命令
% o8 a% e: M$ |5 E8 _2 ^注意变量在 if 和 for 的复合语句里是一次性全部替换的,如9 y" _  P' ~- |6 D2 \
@echo off3 i; G, j& S+ L) o: B
set p=aaa8 b, c5 Q! o$ M  Y. c
if %p%==aaa (* F! l/ J" i) z. |# E
echo %p%
: N7 o) l3 d& Z2 a8 w5 \' f% uset p=bbb
* h) d' ?8 r' Z8 B# Q  Secho %p%3 a  M/ Z; I2 @7 H2 f" H* F/ J
)! a5 \- v+ [0 {! c
结果将显示5 m" ?) u+ y! W# F1 ^
aaa# I+ e" f) w  X
aaa
! o: ^' F$ w: l. {因为在读取 if 语句时已经将所有 %p% 替换为aaa
/ N4 T3 f- s* F0 J6 |; N; g) R" \这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充", s; R) `+ M1 w6 u0 J' A2 p& T
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!% L6 M. N2 S, M; u9 N0 j
@echo off
: _) y* A4 B6 D4 J- M1 s  e+ KSETLOCAL ENABLEDELAYEDEXPANSION
$ X6 I0 ?$ @% Q0 X4 E) iset p=aaa6 c, R6 b1 Q+ g& A/ v; U3 c5 b& _: P8 I4 {
if %p%==aaa (% |1 H) V7 K$ g( ~/ i: y
echo %p%
+ X5 d: h% C, N' i7 o9 T( wset p=bbb, M! K# h$ \& t( Z, l5 ~# {+ i8 ~
echo !p!! A& ]1 G' C- T5 \3 v
), t9 [' E- a/ v0 G" p5 U% g1 c1 G
ENDLOCAL
( G' r3 v; v% t5 l* s结果将显示. l: ~# b* w1 r- M
aaa
! a3 g; w- R% {+ c3 L" ~bbb: [# j6 o; b, ~
还有几个动态变量,运行 set 看不到
3 p6 i# ?: T9 i9 U' `3 b" K8 v2 H/ k%CD% #代表当前目录的字符串
: W  L" z9 d  n8 {3 B5 n%DATE% #当前日期
: O/ Z+ B8 u' c+ [- F%TIME% #当前时间
% P/ L& Y2 x" K, q; t7 y%RANDOM% #随机整数,介于0~32767, W" S" \  S% d% |! |: _
%ERRORLEVEL% #当前 ERRORLEVEL 值- T* f4 b3 `2 o1 F. C" ~& F
%CMDEXTVERSION% #当前命令处理器扩展名版本号, g6 U# T3 [  G" D) c7 A; P
%CMDCMDLINE% #调用命令处理器的原始命令行5 y9 d& o/ s. z: X3 x: i# e
可以用echo命令查看每个变量值,如 echo %time%
- d, F/ E( D* ~& Y注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到8 J1 C1 |  @$ l! t  D6 l* k

. ~6 x8 F! D0 h32 start: R, y$ ?5 i9 M, y' b
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令- X9 w2 r$ _1 |! _0 u1 Y( a
4 R! Y5 P, V* I
33 call) {6 F* q) \4 S2 T
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
; k. {. V7 I6 K# o1 v有时有的应用程序用start调用出错的,也可以call调用1 R* T/ k' V& I4 p; u! ?1 _8 w
; b; F# J. W6 G9 \8 T0 T1 C
34 choice (外部命令)
. U+ Y' u5 P. z8 \选择命令5 l/ z; v9 }' _& ]4 {
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
, Z- [$ Y' N. G& Mwin98里是choice.com
5 P0 L& v( O  y3 wwin2000pro里没有,可以从win98里拷过来5 Q5 H* W; n( `3 o
win2003里是choice.exe
. x  W1 y1 |, y) b- |choice /N /C y /T 5 /D y>nul
4 j+ u& q+ K/ U4 e延时5秒
" y4 |3 F' w3 e, |* t, a) E; ?% H) s7 L0 @) S
35 assoc 和 ftype
1 N( X: t" I' v/ ]' u* R# @- k- @0 ~文件关联/ }- k' `' o8 U, H" z" j4 H
assoc 设置'文件扩展名'关联,关联到'文件类型', `% g+ w1 d) ~
ftype 设置'文件类型'关联,关联到'执行程序和参数'$ z2 n7 ~1 M  _, `, S/ {8 K1 z
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
( c' l2 i8 x. G, Z而是先判断.txt属于 txtfile '文件类型'
) f$ m# t; w) B1 ]& L再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1) _! ^( ~4 i0 n5 s3 Q
可以在"文件夹选项"→"文件类型"里修改这2种关联
9 r% F! j& G. z7 D  f0 w& _7 C5 H" ]assoc #显示所有'文件扩展名'关联
* Z; _  t6 N0 z& r- B+ ^  t6 ?. Zassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile" c5 b0 {" b4 K: J
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
* D  D, U: q7 w" yassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile3 s/ t4 }( o7 h7 N
ftype #显示所有'文件类型'关联* w1 F% _2 ?( d( N7 {" g( L: P
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
, U) @0 f( C  wassoc .txt=Word.Document.8' Q$ B* }7 \+ O5 X
设置.txt为word类型的文档,可以看到.txt文件的图标都变了9 b% r7 w  v8 W) i
assoc .txt=txtfile
4 m( Q4 C8 {3 `& k7 e6 U恢复.txt的正确关联5 G6 Y! {7 `! D3 w! |% H& l
ftype exefile="%1" %*
4 g, C- y; m% B/ M1 ]6 q5 M: M恢复 exefile 的正确关联7 h; F: L" b) _) A9 \9 Y
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令* R/ C/ R  V; S, u/ O" `( K, D# B: t
0 g" K$ E: t: x  T
36 pushd 和 popd. I. p0 t; n! t% S+ s
切换当前目录
: [' ~  R) I& M. R" n@echo off- x; j! O$ E* I( m. I& |, Z2 B
c: & cd & md mp3 #在 C: 建立 mp3 文件夹/ \/ [) z8 G1 p# r7 G9 R; w8 G0 }
md d:mp4 #在 D: 建立 mp4 文件夹
/ J% @; b1 G6 D; q; F2 k# vcd /d d:mp4 #更改当前目录为 d:mp4
( ?% D: I7 j" x: Cpushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
5 L9 E$ S6 ?" L: @/ J8 O! L9 Xpopd #恢复当前目录为刚才保存的 d:mp4# t( l; f+ X. M( ?1 L) H# _
! H8 {6 ^* L  `: [8 P
37 for9 ]- M$ z4 }1 `1 ]3 z2 k
循环命令) ~% M+ C; o9 q  l6 t+ W$ H
这个比较复杂,请对照 for/? 来看
8 ~3 a8 W5 L! V7 l( A5 ]+ afor %%i in (c: d: e: f do echo %%i
& X8 \; T* M; ?4 l3 i7 v依次调用小括号里的每个字符串,执行 do 后面的命令3 M& U6 c6 t4 k1 _. P5 t
注意%%i,在批处理中 for 语句调用参数用2个%
% w) e; m0 w; P( K2 z# L4 ~默认的字符串分隔符是"空格键","Tab键","回车键"' |1 F: t  k+ S
for %%i in (*.txt) do find "abc" %%i; ~5 p6 q- X0 Q8 _# |
对当前目录里所有的txt文件执行 find 命令* [/ i0 K; \9 d1 I* a
for /r . %%i in (*.txt) do find "abc" %%i
2 F" m8 Y/ g4 {# d5 \/ F在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行% \- [. G7 T" n3 r4 A* j
for /r . %%i in (.) do echo %%~pni' ~9 f6 ^  e7 b8 F, p& L
显示当前目录名和所有子目录名,包括路径,不包括盘符: y9 N# n9 S) O/ X5 h
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
6 Q9 K) s/ j$ i% A把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
9 v7 h, d0 }& z. A; e+ _# pfor /l %%i in (2,1,8) do echo %%i
3 c3 X1 b' o, u" S5 G生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
/ z* `: i0 A6 k: o! W+ _for /f %%i in ('set') do echo %%i
* ?" R9 W6 |. A- I! X- ~对 set 命令的输出结果循环调用,每行一个
5 M2 ^' N7 s4 T9 L" ~for /f "eol=P" %%i in ('set') do echo %%i
6 i  {! j# v5 n. g' j取 set 命令的输出结果,忽略以 P 开头的那几行
$ _) r, @1 L( x/ A- r. @for /f %%i in (d:mp3.txt) do echo %%i2 r7 \- j/ U- y: k
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
: M2 O" N" a, S& W8 x! d. A" zfor /f "delims=" %%i in (d:mp3.txt) do echo %%i
6 z( P  |$ r: C+ p. v% Q" Q! b显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称' b: z7 o9 C' R1 `! S; x+ J$ r
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
' u( m9 }, c! k* x8 a- O1 F对 dir 命令的结果,跳过前面5行,余下的每行取第4列. S+ B2 N2 c9 Z" r1 \
每列之间的分隔符为默认的"空格"! [7 m& }2 _+ ^7 z
可以注意到 dir 命令输出的前5行是没有文件名的* y5 x7 p' i  a& {0 I
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
, Z/ [8 u: v' z. H% o6 uecho %%a: a2 D; q& n- r  k8 p
echo %%b
: [& ?% d2 G; A9 ^: Secho %%c
9 h0 Z- G0 T2 h1 |5 o+ H0 {# Y/ O)
9 r9 l- M! Z2 v$ T& G# R对 date /t 的输出结果,每行取1、2、3列5 |  }0 g  i8 A$ R- T2 g$ ~
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列" `* x: s' W6 i, o- M. i# e
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"  T' N# u6 I6 d) K
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
0 I( y# D' _0 ~" ufor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
: W% H8 e2 T  c6 ]0 x1 T取第2列给 %%a ,其后的列都给 %%b
* N2 f7 Y# U1 L, u# `/ v6 F8 v9 w. Z( A1 x& ]! F& v9 h/ v/ ^. f
38 subst (外部命令), O$ q1 [$ O' W. v3 m7 ~
映射磁盘。* N+ c1 c) l: r
subst z: serverd #这样输入z:就可以访问serverd了! a( |+ k1 a0 i  W
subst z: /d #取消该映射% Y  N$ @5 H- b1 t, ~6 \
subst #显示目前所有的映时
$ D$ u  G2 Z4 G4 o) P* M! V3 Y0 a4 o6 L3 t  {' k. J
39 xcopy (外部命令)( a* M$ e, Y, j: X5 s! g4 }2 C
文件拷贝
/ h6 H1 [; l7 i- Ixcopy d:mp3 e:mp3 /s/e/i/y
: S$ q' _; s% z, z复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
9 ^9 B7 q* t9 P3 T+ k* W加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问" r5 n) ^8 s* t) u& }) `  V

3 S% [. m, H0 E9 W+ I* T常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退4 B! N8 V0 ]3 V9 v" h. @) a3 \
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:
      8 X) S* h6 \) q7 O7 A, O

    / p& R  h9 t( F  e
@echo off* J: m" q4 t5 ]# H  p$ X4 o
set p=aaa" y3 a( b8 b9 \6 R: ~
if %p%==aaa (
! c/ ~) [9 R4 @% z+ k4 [echo %p%
* g7 i& P9 y! ^set p=bbb$ }* C6 y9 f8 ]; }+ a+ ~) S
echo %p%& e8 R5 K9 A4 C' j- S0 L
)
" D: D" X1 a3 g% [# {' g& ypause
  • 截图:
    3 k+ e8 M! d$ I
  • 2.批处理.bat 文件中输出中文乱码
    # z* t# J9 X7 v# b' z
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:7 {& u- R( y2 Z3 m9 v
    • 效果截图:6 W+ ?7 i9 a' t
      $ s# T9 @" i6 _5 b) F4 {. O
    & ~8 R7 b% I/ a2 p4 n+ |7 q- k" q6 x/ Y
7 h. ]. w! v% M6 s; Z8 I' V

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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