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

找回密码
立即注册
搜索
热搜: 活动 交友 discuz
发新帖

1998

积分

1

好友

326

主题
发表于 2021-6-25 19:48:12 | 查看: 2404| 回复: 0
Windows批处理(cmd/bat)常用命令教程
简单详细,建议收藏
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
  • 2.批处理.bat 文件中输出中文乱码
  • 解决方法在文章末尾!
    ' }5 o8 J& J( ]5 O$ w: W1 H; K. k
前言
  • 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效
    % v8 V1 X; Y1 a6 S* P$ `
在Windows中善用批处理可以简化很多重复工作
什么是批处理?
  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
    $ \1 s; K$ Q3 H! i; D$ L  K; x6 }名为bat
  • 目前比较常见 的批处理包含两类:

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

  f; D8 ?9 a# |$ M& _, `1 I' o4 f/ H  h4 \0 A  j
Windows Batch 常用命令
! [2 D4 g1 D/ I8 |, H1 echo 和 @) r% [) X5 [! s' D' a0 H
回显命令, `3 A: _* U( H
@  #关闭单行回显
" z9 s# w" k. n" fecho off  #从下一行开始关闭回显
) s( E$ j0 z, d@echo off  #从本行开始关闭回显。一般批处理第一行都是这个6 j+ `5 [$ E4 m+ F! b; ~; T
echo on #从下一行开始打开回显
/ O6 n% _, Y7 m) I, I" vecho #显示当前是 echo off 状态还是 echo on 状态
6 c' d2 {! q4 G! b7 Jecho. #输出一个”回车换行”,空白行6 f$ V5 D, f7 n4 \  ~
#(同echo, echo; echo+ echo[ echo] echo/ echo)/ ~- Y* B+ i+ w! |6 E6 s
( h+ H6 R" L( v, _( H
2 errorlevel+ T% M) Q/ {, v" E' {
echo %errorlevel%" }% T- L- X/ O7 [
每个命令运行结束,可以用这个命令行格式查看返回码
8 _: I# m! a4 S5 e: x默认值为0,一般命令执行出错会设 errorlevel 为1
& A8 K* g' i' G) G/ I6 p0 _7 Z9 U$ k# D0 y
3 dir
0 @  q( \1 c0 t% D1 U/ r显示文件夹内容4 t9 n. N2 e/ k" Z
dir #显示当前目录中的文件和子目录
0 f2 e0 ~7 v/ p+ G# h7 `) K, B. Ddir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件( Y+ y- z* j0 o1 X
dir c: /a:d #显示 C 盘当前目录中的目录
/ H4 `: {8 X* n& Rdir c: /a:-d #显示 C 盘根目录中的文件
9 U( z, D, M0 s, C) j8 Ndir c: /b/p #/b只显示文件名,/p分页显示/ F; n+ G0 T* y# a# U7 \+ w/ o
dir *.exe /s #显示当前目录和子目录里所有的.exe文件6 }( A5 |3 v) I9 i7 l# G% {

0 f; B, d( i6 C' N! p" U4 cd3 l- O5 z0 i# |  F
切换目录
" J, S" M! ]# f! p% R+ e5 Zcd #进入根目录
2 E; n1 c$ y, S9 Zcd #显示当前目录
& N1 ~' u! {% U# D( w/ E- B0 Ucd /d d:sdk #可以同时更改盘符和目录
6 s  a; q+ o4 v( K! u* `8 @; ^: P  i1 E# _) z! h7 }) h) {2 g3 P
5 md  [! L7 R1 W1 ~0 d
创建目录
  x2 o! B$ O1 H9 J6 n3 d/ Nmd d:abc #如果 d:a 不存在,将会自动创建中级目录. u+ @' e, \2 b2 \
#如果命令扩展名被停用,则需要键入 mkdir abc) K  B+ e0 Y1 Q- |' o
" p$ U6 W, u' u; s5 q1 j2 o# ~% a
6 rd
/ @7 `; f2 K4 ]3 L删除目录9 \) K) f2 N+ E) n. T
rd abc #删除当前目录里的 abc 子目录,要求为空目录
  P. o( I' T% ]! xrd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式% u3 h! E% t6 t; ?
8 i- k# \1 u' U# t' K
7 del
, f& v. E7 `% V0 c& C/ z9 U删除文件
3 F4 X" C. E) e# t+ [1 C7 zdel d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
5 {. ]& S5 D# @, q0 M7 O8 Ndel /q/a/f d:temp*.*$ c: L, p& S* N" ^
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
% v' v  c6 K* `del /q/a/f/s d:temp*.*
- v$ E1 }# `8 |0 V8 K删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录0 G4 i7 V# v% t1 y1 }, }) D, B. M

" i, l9 @5 E2 Y- [: g8 ren* _2 P. @- S2 ?1 {3 }
重命名命令& M' b4 @; @) E- M6 L/ ]( ?) B
ren d:temp tmp #支持对文件夹的重命名
6 |. [: l4 a) M- V+ o7 b2 p/ i9 x; N4 q+ z
9 cls
4 Y. i7 \  T7 ]: u- S清屏# L( ~' K" v4 a' k
10 type! o! M8 o4 S4 H( G/ c: S( v" P9 j6 E
显示文件内容
" n  p% J7 q: |) `& ctype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码$ J: N' u# Q) @& G. k7 {9 q" G
type *.txt #显示当前目录里所有.txt文件的内容
7 V. o4 ~5 l+ d% z& S0 V8 E5 {2 y7 e7 J% M) f
11 copy
( H8 H: n; S1 S( @, z拷贝文件
( x. l6 L0 i0 c0 H3 z  W( tcopy c:test.txt d:test.bak; y- {8 i. _, Q  d5 O' b7 M* s
复制 c:test.txt 文件到 d: ,并重命名为 test.bak7 X9 m: C$ j8 A1 b4 e5 t7 B
copy con test.txt; ]- `" P/ [, Q
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件8 T+ O0 s& ~! E1 |9 L- t- d' r
con代表屏幕,prn代表打印机,nul代表空设备0 z9 X5 B/ G. U* S, L0 e
copy 1.txt + 2.txt 3.txt! t# Z4 _5 j4 A9 l* V; `7 H
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
0 q/ }8 [# U$ i2 v如果不指定 3.txt ,则保存到 1.txt
* `* m  t. `" H% }$ Xcopy test.txt +, y% I  l; J( L' H1 `2 ~( U
复制文件到自己,实际上是修改了文件日期
- d( W/ d9 o: m: a0 L4 r9 }/ n! a$ v' Z9 [% ]: B
12 title7 z1 B( K$ `' H. u0 F
设置cmd窗口的标题
% [7 A4 p' A+ T. Wtitle 新标题 #可以看到cmd窗口的标题栏变了9 }2 f+ |1 a( M

6 f" D, O& p5 H- S8 W0 J1 w* u13 ver
6 C9 O8 D9 L4 {- A% P& X/ t! f" R/ x% R显示系统版本. b' W, i! A4 w/ {9 N) a. P
: f$ Y; v+ ~2 w' @  i# v8 T7 v
14 label 和 vol
( _" s) t: O4 l4 _( m6 @/ i# w设置卷标" r- G8 }- P2 m+ e
vol #显示卷标
* V% ~) T/ I6 Q" d; z9 V2 Plabel #显示卷标,同时提示输入新卷标+ X# H1 `+ h. Y" M5 }$ o
label c:system #设置C盘的卷标为 system) ]' [9 Z2 Z# r$ {! Y2 j
$ k; `- Q4 N) V" U  c
15 pause
3 B, K& @( f. e暂停命令+ {3 [+ ^* u7 A: Q

$ j$ B0 w. Q6 Q. ~* d  b0 H16 rem 和 ::
( u+ p3 h  n4 n, i9 L注释命令
. o* O. W* I% H: `注释行不执行操作; W; D9 `3 g0 z4 R5 X  E) W
1 @5 H# E3 V/ w9 j" n& C# T
17 date 和 time
- A- S* }6 A* C9 u3 U+ P7 R1 n日期和时间0 b1 E: ^2 B6 j8 F6 P& O" |
date #显示当前日期,并提示输入新日期,按"回车"略过输入
: n) @8 p5 m0 m) e* c) ldate/t #只显示当前日期,不提示输入新日期0 _; q  x  [" \
time #显示当前时间,并提示输入新时间,按"回车"略过输入
0 J7 L% j8 X# x0 N/ S$ ?2 x9 rtime/t #只显示当前时间,不提示输入新时间; Z) K' J6 u- W; C' T$ K" I; J
, e: f7 Q' L1 d. U* V4 A2 t
18 goto 和 :
/ {% o9 O% y4 P0 o: s1 y跳转命令
' f! ~" H0 S2 e8 r:label #行首为:表示该行是标签行,标签行不执行操作
5 ]% z6 F% }) {( y* H8 lgoto label #跳转到指定的标签那一行
. Z3 w3 |! t* y# v# \5 u+ @( y: h, F: L- _+ f2 g0 n
19 find (外部命令)
' z$ J# t! O/ |$ s2 a4 M- a* z查找命令
3 Y1 I1 c3 H6 dfind "abc" c:test.txt0 j. j, Z  A0 Z' D
在 c:test.txt 文件里查找含 abc 字符串的行
. W3 y/ @  L: e7 {! {3 B" V如果找不到,将设 errorlevel 返回码为1# a* B* \% K* |3 k7 P, t$ A1 w
find /i “abc” c:test.txt
* m# A: B4 y0 |查找含 abc 的行,忽略大小写
: }, ^2 V) S8 Z( [# h7 a0 nfind /c "abc" c:test.txt
3 ]+ v* z' \# _+ i显示含 abc 的行的行数
/ V2 E9 o% l* G; c* ?: M
) N7 X/ Z0 C$ Y: K: A, K3 a. q7 Q20 more (外部命令)% J9 S4 h, R, n' _" }
逐屏显示) U0 E3 E1 [  k3 ~( |9 s
more c:test.txt #逐屏显示 c:test.txt 的文件内容
4 q3 a* G: K" H* b7 o8 ]7 G) d% w7 E1 ?+ ?2 q9 Q3 M
21 tree
8 n: F5 J: J- r( R显示目录结构; p3 u5 L8 J9 E& ^; ~
tree d: #显示D盘的文件目录结构8 u. @5 l+ o3 ^9 ^) B8 [) m
' ^) b( T- x6 w9 @: S" M) L. b/ X
22 &
% C$ f8 G9 t  R* D2 D1 }顺序执行多条命令,而不管命令是否执行成功
* h2 D6 ?$ I4 s% G% Q
' [  m# }0 O/ `- N9 {: a23 &&9 Z0 _+ N* ~$ |  J5 F! ~3 i! Q" F1 m5 O
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
) y! t4 V, N% c* }find "ok" c:test.txt && echo 成功0 `. C. Z  t" z/ z4 o
如果找到了"ok"字样,就显示"成功",找不到就不显示7 w7 W5 ]1 q) J4 L3 P

9 L5 n& w# h/ Y( {5 w, W24 ||
* _" x0 `; q4 j# S9 M6 G5 R# X* D5 {" x; l顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令& U6 W- |8 H+ ?# v/ E
find "ok" c:test.txt || echo 不成功9 v: c$ M& D( ?, ]. j
如果找不到"ok"字样,就显示"不成功",找到了就不显示
3 G3 z' I3 J2 m' M5 _  u
. G! m9 K4 X+ G( `: y3 _8 E! Y' s  [8 d3 P25 |' C# k3 B7 ~; ~& ~( K, g
管道命令+ e0 ?# M+ e6 B: m1 t# S
dir *.* /s/a | find /c ".exe"
0 ~' @) R: j0 r1 w9 e; i+ ?管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
- C: U* A, F  y( ~该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
3 O: L, o  a1 H7 g' y6 r/ E( _# Ttype c:test.txt|more
+ Q! b" S7 l! D* y. c1 a. D/ R这个和 more c:test.txt 的效果是一样的6 H+ p: L" n+ \, {) f; h
/ v2 g( x; a- F$ \5 O
26 > 和 >>5 w: O2 D+ V' Z
输出重定向命令
+ |% B) }- @; n( `7 A> 清除文件中原有的内容后再写入
( v/ d/ `! t& t1 Z* c>> 追加内容到文件末尾,而不会清除原有的内容2 n& @  D5 h; y, R- l- |
主要将本来显示在屏幕上的内容输出到指定文件中
5 H+ R$ \7 ]3 q. C, F7 J9 n, O指定文件如果不存在,则自动生成该文件
/ [' d. r1 J+ E: Q: _* ttype c:test.txt >prn- V2 j5 o, h% [" e
屏幕上不显示文件内容,转向输出到打印机
2 p2 q0 h9 g, aecho hello world>con
& Y( E5 N2 v5 V2 O2 y在屏幕上显示hello world,实际上所有输出都是默认 >con 的- N- d2 `# t3 s8 X0 A4 f% m/ E
copy c:test.txt f: >nul
+ K  n7 l  W+ k- [拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
- a9 v' S$ u0 S3 ocopy c:test.txt f: >nul 2>nul1 N' G) l+ ?# l
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息. p0 W' g) K/ ?& D! C# f
echo ^^W ^> ^W>c:test.txt
" {# i  j) q& o1 f/ ?$ @- M  }生成的文件内容为 ^W > W# ^; a* C' e7 x. N1 y
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号3 d3 f! |) w4 \' F/ ~
: t4 T+ G. G( Q0 F8 t/ r
27 <
8 S; J. \/ Z3 Y# u8 j9 y从文件中获得输入信息,而不是从屏幕上! k2 E8 W2 D( i
一般用于 date time label 等需要等待输入的命令
/ u5 x5 [' K$ Y0 Z  U5 H@echo off
6 o1 k" [  [" K& R1 N; T% ^: y( pecho 2005-05-01>temp.txt! A% P9 H/ ^7 `8 Z* U( r" l
date <temp.txt- T& M5 [- F7 T* F. @7 ], N
del temp.txt
0 B2 i$ `5 l6 ]这样就可以不等待输入直接修改当前日期
3 _1 t1 p4 n7 L3 O( F2 N* e, G
9 M% Z$ G& a1 ~0 l5 C# T( x28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*; N; r6 K7 m/ l' b
命令行传递给批处理的参数
2 ?0 o3 w* a; s4 V4 V%0 批处理文件本身+ q, s' y  k3 t( F* i/ k
%1 第一个参数
* N& K8 Z- A1 d1 [%9 第九个参数* b% \. S; W" ]7 K2 x& P! P4 Z
%* 从第一个参数开始的所有参数& a) ]' O4 R. k1 [. h/ _& Q
批参数(%n)的替代已被增强。您可以使用以下语法:1 _  V. s# d. x: p+ j) C7 D
%~1 - 删除引号(" ), 扩充 %1* |, `0 h  g3 B% D
%~f1 - 将 %1 扩充到一个完全合格的路径名# h4 Y* W! A2 j2 X; I. J
%~d1 - 仅将 %1 扩充到一个驱动器号+ c; e, L1 s/ Y5 t
%~p1 - 仅将 %1 扩充到一个路径6 Z) D7 u% W! e- i5 B# _( ^4 J6 `  I& a6 d
%~n1 - 仅将 %1 扩充到一个文件名
( x! h" t+ ?( K9 b) e) m%~x1 - 仅将 %1 扩充到一个文件扩展名
3 ?' e; C' w) ^5 g$ J( m3 o& ]/ W1 E%~s1 - 扩充的路径指含有短名
0 I+ D: n/ @7 p& b%~a1 - 将 %1 扩充到文件属性
' H0 |: j' U5 E# r  e4 e$ v/ \8 s%~t1 - 将 %1 扩充到文件的日期/时间9 Z% ]4 z$ v- Q! |0 \( {8 h
%~z1 - 将 %1 扩充到文件的大小
- h: B# P( @8 b( l- E$ I%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1( {5 x7 _# J5 O1 D% E, X6 P! B
扩充到找到的第一个完全合格的名称。如果环境
. \( Y4 D6 k! v变量名未被定义,或者没有找到文件,此组合键会) {5 b: D" y* V, E2 U
扩充到空字符串
7 c0 `5 c, I' ?# f. U: d可以组合修定符来取得多重结果:
; h) k# [0 I5 e* P%~dp1 - 只将 %1 扩展到驱动器号和路径
  J; g/ w/ M& [/ D7 s%~nx1 - 只将 %1 扩展到文件名和扩展名% p. D/ A  b$ L; |
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
8 O4 U! Y1 C. ^4 b并扩展到找到的第一个文件的驱动器号和路径。
  l8 M  k2 p! ^5 }%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。5 q& J" x  m) S! V" F- W  ]
可以参照 call/? 或 for/? 看出每个参数的含意" [4 e4 I3 y5 k: s! b1 e
echo load "%%1" "%%2">c:test.txt
5 p7 Z& x' p/ k& c生成的文件内容为 load "%1"  "%2"6 r! h2 a+ [* a- {- V
批处理文件里,用这个格式把命令行参数输出到文件) }3 y! b; T, U) W' u) [$ o! V6 W
0 j9 ?2 b9 t( y  g9 a( x! ?, f* g$ g
29 if
5 C9 x) X4 l3 u2 k6 w7 b% W3 a6 O4 P判断命令
. k3 K# `; V- ^' l2 u4 h  F- sif "%1"=="/a" echo 第一个参数是/a% ?$ ~& i: e. {! O; ?8 f, ?' f$ p
if /i "%1" equ "/a" echo 第一个参数是/a
* K3 d1 ~: e0 r: |2 a/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?# V* |  L+ K% l
if exist c:test.bat echo 存在c:test.bat文件
: t3 s2 ]. E. }$ S. bif not exist c:windows (
$ j" d. K& l* o6 Y8 `6 decho 不存在c:windows文件夹/ t! }8 g! d1 V; m
)
) M4 K+ F/ a6 S9 v2 z/ Qif exist c:test.bat (' r% B# p+ P  x3 J3 G
echo 存在c:test.bat
- ^4 u! Z& G+ B6 q9 [( T) else (
+ r: R8 [* `/ \0 f: B- K2 C2 d+ jecho 不存在c:test.bat
7 Y: h/ H( o# j- o! W4 _! C)
. G8 t* i) k  Q. I2 `( g30 setlocal 和 endlocal; d; G' K: n2 s/ i/ b5 c: l
设置”命令扩展名”和”延缓环境变量扩充”
6 A/ K! e+ L$ R: A; i1 _SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
: O2 D/ O( i# b! _: ^9 U% p3 USETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"% F) W  B9 z+ ]( \; F- V. P" w
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"( \- J$ ~. n9 T) N0 Y3 r; F7 c+ v
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
, X/ w$ L3 H2 l3 ], t# n, UENDLOCAL #恢复到使用SETLOCAL语句以前的状态
2 X7 f- b; D: G0 u“命令扩展名”默认为启用
! t2 N2 w; q' {: d( `: E3 P“延缓环境变量扩充”默认为停用
1 b7 t& Z7 a: g/ e5 P* s. a批处理结束系统会自动恢复默认值
# t7 ~3 e5 L8 Q( w可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
1 e" {+ h6 W# i序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确4 j$ n; M0 n5 X- s+ N
保程序能在其它系统上正确运行
# G9 d- v* J% g; }9 i! V- J: a4 M) E& K"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程* q$ N: P- m% P, j
% E. v" l% L4 R2 [/ j* T
31 set2 k9 U" b4 c: @- o. l( Y! ?9 O% X
设置变量; i) i- b: N3 \
引用变量可在变量名前后加 % ,即 %变量名%
5 @2 |0 ^! e1 v# U3 L. dset #显示目前所有可用的变量,包括系统变量和自定义的变量
7 j  N: _) J+ A  U1 e  H2 i2 D/ Qecho %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
) L' d- _4 c; Z4 |set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
; S6 h9 r' ~) g2 |% e" fset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb21 i: x. F5 X2 ~+ s" \- X; q
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb25 f9 |5 S4 C0 F
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2# W) C- @. W! O5 T. |  G
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2, m2 Y  b2 B! L2 H& M/ m  {
echo %p:~0,3% #显示前3个字符,即aa1
4 R, C( z* C2 l* `% y; F! necho %p:~-2% #显示最后面的2个字符,即b2# F9 p/ D" f. _
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b% d& _2 T' _* I
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
+ T& a0 ^7 G. t; \( c$ U5 a. @/ becho %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
" ]" X7 t  A5 T: M2 |. j, iecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
1 j8 [$ f& k: A, ^- o- m2 F% i9 Sset p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb28 C* F* A$ C, P+ ]7 V+ v
set /a p=39 #设置p为数值型变量,值为39
9 D* f( n# r) V, Q* iset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3( z, @. z( R! K* G/ n
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
6 |# ?2 X! L' l. e3 _set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?/ K7 W9 k5 i  m) P" u6 Y
set p= #取消p变量
+ i5 Y" n6 K/ O, D: y& Yset /p p=请输入2 N. m% q7 B" U
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
1 B( W; a0 B" F; `注意这条可以用来取代 choice 命令) h( ^/ S' y% X6 d  P" K
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如8 G1 ?( ?2 B; e
@echo off
8 m! [; P  |, G) Bset p=aaa
# X$ H* O* l+ y" Rif %p%==aaa (. ]. A& q9 T" a
echo %p%& e1 r! F$ X* E* Z+ \- z- i7 e: r) O
set p=bbb3 `6 e( I$ v' V+ J
echo %p%
0 F6 @. o4 b  A1 N5 U)* b" i, H. a4 G; f6 R$ j" P
结果将显示
! I- J  O3 m5 I- I0 t& gaaa% D( G7 [. g0 v7 s) ]& s  @& i
aaa
! Y# b- ^, R( ~5 ?; J; `% U. p因为在读取 if 语句时已经将所有 %p% 替换为aaa
4 a( }5 W4 v  Q" M这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"0 s9 ?( S& _3 Y; P4 ?# a( e
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
* M, f9 J- e; \. k@echo off0 B* m5 Z. B. t# J% H
SETLOCAL ENABLEDELAYEDEXPANSION9 w/ n, V1 h( y+ F: l0 P/ h2 D
set p=aaa
0 i1 d8 X) L) c7 R3 Xif %p%==aaa (
- D3 A# s9 D. i; y  k/ n, @" `echo %p%
  L  K. O; c$ C1 w- A2 ?set p=bbb
/ T4 a/ d0 U5 \. Z2 _$ |echo !p!0 l# \0 _' Z( Q" e2 P  o6 Q) Q  K
)
: X4 ]$ {1 B: b6 S! fENDLOCAL
( j* b; q: W& n7 r, Z结果将显示$ G* H- D4 J4 t2 |% a$ `
aaa
' s+ o  c5 }; F' s4 I5 z) L) q8 Nbbb6 t+ o1 t6 l: y  y, D& X; ]
还有几个动态变量,运行 set 看不到
/ ?3 {5 ]& }% F% H+ K& m* H' L  g%CD% #代表当前目录的字符串" z% s6 Y! p4 P5 _( i( N; f5 C: W
%DATE% #当前日期
4 L& X2 A  B* y4 }% T%TIME% #当前时间0 Y3 G" r$ T# U
%RANDOM% #随机整数,介于0~32767
4 H4 l% _( K: k- C9 \9 |%ERRORLEVEL% #当前 ERRORLEVEL 值
; g. w, ?" M5 |%CMDEXTVERSION% #当前命令处理器扩展名版本号, Q& ]: U7 t2 T+ U6 Z
%CMDCMDLINE% #调用命令处理器的原始命令行8 v. R$ w9 N: t: N" y
可以用echo命令查看每个变量值,如 echo %time%4 n; U$ S2 n/ E: A9 x* r% Q
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
1 a- d/ I# S2 o4 n. q) f5 d
' L6 @' o1 z: O' R! X% X& p! G9 G. X32 start
. |0 j1 g) E1 ]1 G0 k1 T批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令( V' ?, i4 a. L* G  I; a
# ]$ P5 s' ]# `( r( O( o: {
33 call
$ b( X# S8 w9 R" _+ N* Y批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
( Q4 X# ~% v, @" T# y% |6 m" Z7 P: z有时有的应用程序用start调用出错的,也可以call调用
# {3 `5 t2 ]7 I; C  |7 K6 C' Q  }7 \" g: B
34 choice (外部命令)+ P1 S$ u" |- L; _4 Z  d& g
选择命令
8 i% i3 ]/ O. q让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……4 A" o0 r' y3 m$ Z) P0 D; L% N
win98里是choice.com
$ |# Z  L3 p- s# Hwin2000pro里没有,可以从win98里拷过来* P! _  G( Q) H7 a3 N0 W
win2003里是choice.exe
; S9 }) A3 n/ i; mchoice /N /C y /T 5 /D y>nul1 I/ |% k, ]1 f: O# p5 d4 p" T0 `
延时5秒6 h0 a  v$ X7 }* f1 e/ j

# R2 [* T+ v, h0 x% C2 Q35 assoc 和 ftype
# D$ H2 n6 H1 ]+ {5 D% G文件关联. n/ ~1 U1 R( C4 q# z+ ^$ L! O/ G
assoc 设置'文件扩展名'关联,关联到'文件类型'1 G! [2 i; M) c" u" y; M/ [
ftype 设置'文件类型'关联,关联到'执行程序和参数'& v# Z! }! B. n1 _, x7 T
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
( b1 u4 _. T$ Q8 K0 g, w而是先判断.txt属于 txtfile '文件类型'/ _* s) j% S; Q+ D
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %15 C$ H7 G; a7 ~& H! u* u) n, L  H
可以在"文件夹选项"→"文件类型"里修改这2种关联
- H' m2 O% \+ U7 Z0 _assoc #显示所有'文件扩展名'关联
$ h$ \* }; y; ^9 u0 passoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile* z2 }! b/ j3 @* D
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
1 p6 H4 w: e5 Z' ?' \assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
' c' @$ u) o& h& }2 B2 Sftype #显示所有'文件类型'关联
3 ~& f4 i2 D; O3 n" L3 ?) G( Y: {ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*# p. ?% S# h  O, o
assoc .txt=Word.Document.8
8 ~8 n+ W3 ]4 P- a设置.txt为word类型的文档,可以看到.txt文件的图标都变了
* Y) r" `0 J* s; m1 rassoc .txt=txtfile" ?  `9 f) Y* o- H/ Q
恢复.txt的正确关联
  y" u1 o$ y$ B/ ?" ~$ Uftype exefile="%1" %*
, Y, f1 j9 M: s( j: l4 E恢复 exefile 的正确关联3 u' S9 Y, U0 @3 e6 Q: I5 q
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令7 P5 `( ]) w2 x1 [( Z" X4 U

( P$ |3 r) n& b2 J5 B5 B36 pushd 和 popd* ?) Z+ d( e' e5 V( Q; L  Y, Q
切换当前目录
/ G  {9 X; y# g% I1 _$ w@echo off
4 \) K( Q( U4 G" H6 g/ q" }+ Mc: & cd & md mp3 #在 C: 建立 mp3 文件夹3 P, c, N6 x; B+ Q+ b3 X2 o
md d:mp4 #在 D: 建立 mp4 文件夹
! {! ~% e' |; c' r. p: g: u/ hcd /d d:mp4 #更改当前目录为 d:mp4$ e1 ?' ]# i# d: h
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
$ j8 S  A4 K4 Z- rpopd #恢复当前目录为刚才保存的 d:mp41 c. [5 P, @  h' h. ?  X

+ L7 A% j% g9 I1 m7 B# I) V2 C1 Z37 for# @0 r2 b. x/ @( w7 j5 h0 ]1 h
循环命令9 Y+ S/ y% {) m2 Y3 q
这个比较复杂,请对照 for/? 来看
) F2 {4 x- e% _( T- Vfor %%i in (c: d: e: f do echo %%i
6 C) C0 Y) J& J: ~9 p- r4 y7 P+ t依次调用小括号里的每个字符串,执行 do 后面的命令: Q0 R1 O- e6 C  O$ \7 `$ B
注意%%i,在批处理中 for 语句调用参数用2个%& _" g: t- E. K  X; q
默认的字符串分隔符是"空格键","Tab键","回车键"! w, g( u; L" ?" z' K. ~7 c0 E
for %%i in (*.txt) do find "abc" %%i
! v; [$ K5 f. d. R  X7 [8 s0 _对当前目录里所有的txt文件执行 find 命令4 u+ r* J( s0 L! T: d
for /r . %%i in (*.txt) do find "abc" %%i
1 Y1 ~/ y8 Q# b8 g9 C在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
  O: H3 S& \/ d; F( P$ Y( bfor /r . %%i in (.) do echo %%~pni
$ P+ Y& u# x  l6 ?9 ?/ X+ b显示当前目录名和所有子目录名,包括路径,不包括盘符
8 ~, B+ i* A  v( e' x# H; yfor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt8 q7 |( ?* P' z2 Q& O
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去+ }% ?6 D5 x! k) O* Y
for /l %%i in (2,1,8) do echo %%i
4 f- A7 k0 o$ ]4 k生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加13 p% m+ A; }3 }/ i  [
for /f %%i in ('set') do echo %%i
3 z0 G7 T. ?8 L( _- C% Y0 G  {对 set 命令的输出结果循环调用,每行一个
$ r/ r; i; g5 K2 W' L7 Vfor /f "eol=P" %%i in ('set') do echo %%i7 H; B! X6 Z/ |! D1 }1 G
取 set 命令的输出结果,忽略以 P 开头的那几行
3 ]: w2 @8 ?3 B0 C. x1 a2 Xfor /f %%i in (d:mp3.txt) do echo %%i
2 n7 R7 x5 c7 i0 I+ C% G+ H显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
- c4 O8 n  p+ D9 f3 Xfor /f "delims=" %%i in (d:mp3.txt) do echo %%i
0 y  Q5 q) y# E/ Q2 U' F. G: r显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称8 k6 ~4 U3 v5 N& b) S
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
* V7 V1 H  K0 k对 dir 命令的结果,跳过前面5行,余下的每行取第4列; m+ k: [& P9 y7 n4 R. g; t; I+ N
每列之间的分隔符为默认的"空格"1 r& n3 i! v+ w- `! J
可以注意到 dir 命令输出的前5行是没有文件名的
3 r. ^4 W; I( P% I  @for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (2 e- }& o$ r, }8 p$ X' F
echo %%a4 u7 ^+ J( P6 F6 A
echo %%b+ Z: ^. f1 i: i4 s' p# b
echo %%c
- N/ a& N9 [: T8 v% c  u)
! w1 B( s  f5 W3 b  D0 X" ]对 date /t 的输出结果,每行取1、2、3列) V$ S+ y$ j( T( s- T
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
8 E& x" \% n; r分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
' c+ a! x$ d  @其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的6 f7 H# W' R4 ^1 G) d
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b/ {/ l; E. I( K
取第2列给 %%a ,其后的列都给 %%b. ^: k2 Z4 ~8 Z4 Z
8 S+ z6 q: C4 y5 k& E
38 subst (外部命令)
5 Y' u3 X/ a& N: Z6 _映射磁盘。
8 s! Q) W6 b7 |) Q1 jsubst z: serverd #这样输入z:就可以访问serverd了
# Y( e% k" |8 ]" Bsubst z: /d #取消该映射2 R4 A) V! R% k8 I) l% c
subst #显示目前所有的映时0 k( r  L( a( |' [+ s* N
( F4 I( ^$ A% w3 a' \
39 xcopy (外部命令)
- i) _( S) t* C$ g文件拷贝- ]$ N* M/ E& `) r' B) U- K
xcopy d:mp3 e:mp3 /s/e/i/y% j$ [7 b* \' V3 H. R; W7 a
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
! D4 c6 m- B8 W# K' R加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问$ t2 M) d& }( l! N. |7 l( X

" l" R0 K' g" z) t常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退# D' ]7 s( X% T
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:9 O5 U1 ]2 ?% G
    ; E  O* T  I% Y9 s7 S9 B
@echo off% p$ K1 y4 h' E9 f) d
set p=aaa
3 A7 f$ R! ]5 M6 h, `6 C# xif %p%==aaa (
1 ~8 @7 S2 N9 ]2 o) ?1 techo %p%' `5 l" v* F! F2 a
set p=bbb$ u1 k+ C# ~* r2 m
echo %p%% f$ ?7 G- g9 i, ]
): Q5 J7 ~0 s) r  L3 B
pause
  • 截图:( J2 c" \$ Y. {/ x6 {
  • 2.批处理.bat 文件中输出中文乱码
    / {/ v5 k1 ]9 e7 n2 |+ i$ ~3 f
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:) ~% _" D/ \1 J# j( h  D& t9 ]
    • 效果截图:
      3 x1 B2 r; k- P( A# \  ^" d: N5 {8 o2 ^3 N

    - P4 Q5 A* Q# t" W

5 H! ~% d1 s( e) t6 [6 h, X

本帖子中包含更多资源

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

青浦海洋数码电脑城
您需要登录后才可以回帖 登录 | 立即注册

QQ|Archiver|手机版|小黑屋|青浦海洋数码电脑城 ( 沪ICP备18024137号 )

GMT+8, 2026-9-22 19:31 , Processed in 0.083191 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表