扫一扫,微信登陆

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

搜索
查看: 1342|回复: 0

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

[复制链接]

306

主题

334

帖子

1874

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1874
QQ
发表于 2021-6-25 19:48:12 | 显示全部楼层 |阅读模式
Windows批处理(cmd/bat)常用命令教程
简单详细,建议收藏
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
  • 2.批处理.bat 文件中输出中文乱码
  • 解决方法在文章末尾!+ h( _: B# W  V+ z) a! s# [
前言
  • 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效
    & T7 b$ Z9 O9 y" ?! x
在Windows中善用批处理可以简化很多重复工作
什么是批处理?
  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
    0 P2 C7 w' o8 c# h! T! s名为bat
  • 目前比较常见 的批处理包含两类:
    & F3 k9 s0 X1 m1 y! ?. D/ l
    • DOS批处理和PS批处理。
    • PS批处理是基于强大的图片编辑软件
    • Photoshop的,用来批量处理图片的脚本;
    • 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
    • DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
      " q! D; J* U7 L0 V& k: t8 v
  • 批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的6 A; q( X) [' a9 m
    命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行
  • 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
    4 ^3 U5 p: m5 o- }7 N
怎么创建批处理文件?
  • 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
  • 一般情况下,每条命令占据一行
  • 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
  • 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
    7 s2 N, {1 P) _9 @
批处理命令简介
  • echo
  • rem
  • pause
  • call
  • start
  • goto
  • set
    8 p6 s* z& X* X8 D" `
批处理常用命令总结批处理符号简介
  • 回显屏蔽 @
  • 重定向1 >与>>
  • 重定向2 <
  • 管道符号 |
  • 转义符 ^
  • 逻辑命令符包括:&、&&、||
    & `4 O8 Z) Y, s; c4 h1 d
常用DOS命令
  • 文件夹管理:0 S$ V1 @  k/ K) ]% _
    • cd 显示当前目录名或改变当前目录。
    • md 创建目录。
    • rd 删除一个目录。
    • dir 显示目录中的文件和子目录列表。
    • tree 以图形显示驱动器或路径的文件夹结构。
    • path 为可执行文件显示或设置一个搜索路径。
    • xcopy 复制文件和目录树。6 e3 G: ?! z) g; i3 }1 T/ v) R- E
  • 文件管理:! h+ }' T! ?' u" o) @+ B1 @* |7 P
    • type 显示文本文件的内容。
    • copy 将一份或多份文件复制到另一个位置。
    • del 删除一个或数个文件。
    • move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
    • ren 重命名文件。
    • replace 替换文件。
    • attrib 显示或更改文件属性。
    • find 搜索字符串。
    • fc 比较两个文件或两个文件集并显示它们之间的不同
      & B  j9 y5 s; `3 I& s9 W
  • 网络命令:
    * q5 T* @; A: A4 V9 ^5 o
    • ping 进行网络连接测试、名称解析
    • ftp 文件传输
    • net 网络命令集及用户管理
    • telnet 远程登陆
    • ipconfig显示、修改TCP/IP设置
    • msg 给用户发送消息
    • arp 显示、修改局域网的IP地址-物理地址映射列表
      7 M$ q& a: H6 j% d% S  w3 ^
  • 系统管理:% Z* J/ F9 l1 @2 u' d* `: v6 P
    • at 安排在特定日期和时间运行命令和程序
    • shutdown立即或定时关机或重启
    • tskill 结束进程
    • taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
    • tasklist显示进程列表(Windows XP Home Edition中没有)
    • sc 系统服务设置与控制
    • reg 注册表控制台工具
    • powercfg控制系统上的电源设置
      . D6 k( B. U! B0 M& Z2 S; R$ U4 k. \

    % ?- r5 s$ ^! g. a7 `
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
3 z) ?$ B9 R$ r: o
3 R: a8 [) @! {, ~1 q1 K
Windows Batch 常用命令
$ r) _! _/ l) |$ ?( o1 echo 和 @
/ }  H7 v% @7 c% q回显命令
) [+ |/ _3 |* X@  #关闭单行回显
  [- |/ Z# ^. F# C. N7 ]echo off  #从下一行开始关闭回显. o% [5 D8 I6 m0 o* b
@echo off  #从本行开始关闭回显。一般批处理第一行都是这个
& e* j  |1 C! d9 fecho on #从下一行开始打开回显1 n8 `9 k+ E' i! {2 n9 C
echo #显示当前是 echo off 状态还是 echo on 状态; J* A. n2 K9 Z* d9 M" J. [% w
echo. #输出一个”回车换行”,空白行
0 f( Z$ v; n1 O( c1 q, }, {#(同echo, echo; echo+ echo[ echo] echo/ echo)1 C- r0 ]8 O( _
; o' j& V# u" v+ P% W8 E0 q
2 errorlevel
' ]1 W% }( \. s- P9 q6 c2 k" kecho %errorlevel%# Z2 v* I# Y: H( Z0 b* D
每个命令运行结束,可以用这个命令行格式查看返回码2 L2 Q/ R- n3 P/ c6 F' l3 S
默认值为0,一般命令执行出错会设 errorlevel 为1' R2 e7 p  O& z  e

# l/ N% |% b' e  C& n3 dir
5 J5 ~; G+ n4 Y显示文件夹内容: D3 ]6 K7 V1 a. k1 x9 V$ o/ N& ?
dir #显示当前目录中的文件和子目录
, {# J, d5 X" n9 Idir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件  x; P' Y& n% \
dir c: /a:d #显示 C 盘当前目录中的目录
9 N) d9 f+ Z: E9 B- h" N2 m! \% ?$ Kdir c: /a:-d #显示 C 盘根目录中的文件+ c- S& n0 U3 Q  A9 L4 b
dir c: /b/p #/b只显示文件名,/p分页显示+ R0 a% x! j, X! f( Q  M
dir *.exe /s #显示当前目录和子目录里所有的.exe文件
9 O6 l2 |; G- j/ \
0 k6 p  Z- Q& G: o# s5 O+ _4 t4 cd
' H! y# n7 p7 O/ A' _切换目录
0 R6 g0 W# K4 E: R' w5 Hcd #进入根目录1 y/ ~( b" \, ]+ j! H0 |$ p
cd #显示当前目录2 ^7 S( ^$ c( |
cd /d d:sdk #可以同时更改盘符和目录
0 u3 f4 u+ s) s& ]+ Y# ?% _/ N% Y" |2 U0 r) p) `
5 md/ A0 _1 i4 n6 A% Q& U" O
创建目录6 C! B: e' d" d: h* s
md d:abc #如果 d:a 不存在,将会自动创建中级目录: l" z) b" ]2 K2 Z8 x7 w7 k# {+ k
#如果命令扩展名被停用,则需要键入 mkdir abc
! R: R" Q7 U$ c. Y) r  M1 G' {+ ]" T; L9 l9 [- h) f1 y& {* P# ]
6 rd
9 L  x  i1 X) T# Z; K8 V删除目录' n! ]" O, T3 Z% g9 R4 F
rd abc #删除当前目录里的 abc 子目录,要求为空目录4 Y% v8 d) z3 T& S7 d
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
2 n- a. U5 \; E# R4 ]9 M: G' \1 i- j1 k. u, G
7 del
+ G. A+ c6 @& J) ], a3 \  @删除文件
5 O2 k. ?( g4 b% h8 k3 M3 ^# S; Ddel d:test.txt #删除指定文件,不能是隐藏、系统、只读文件! E. ^5 }7 @0 t3 I
del /q/a/f d:temp*.*
3 m1 g" ^6 J0 x& J4 b0 C删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
. ]9 b. @6 e2 l+ b4 u: z+ Z- Idel /q/a/f/s d:temp*.*
  q( C7 }1 b, H% f2 V删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录8 A5 w$ R) D1 H3 i* v
: N! z6 \. K+ A
8 ren
0 M* A0 f# U9 c% @重命名命令
; y$ Y1 o! G4 N0 E* P) lren d:temp tmp #支持对文件夹的重命名  o$ m3 |& f) r& s* _4 v3 }* c
: B3 j! @' l; T4 V6 N
9 cls
4 T' a4 ^, K) Z+ m* @6 w8 v清屏
# `* C. |; \/ H0 `10 type) J. e, ?! Q5 R  I0 N( v
显示文件内容4 q+ O7 B4 S( s
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
# A, k1 ^( V! ?. v$ \$ F2 Otype *.txt #显示当前目录里所有.txt文件的内容! T# E9 O8 D. G% G: k; {6 `4 Z% e

2 U; K( Q. T. r) \: S1 Z1 T" s11 copy1 `% Y4 p. [# _! f
拷贝文件
' g+ V9 K6 X% s$ w( b; @1 ycopy c:test.txt d:test.bak; ^0 g/ P, v7 e7 z+ U- v
复制 c:test.txt 文件到 d: ,并重命名为 test.bak
3 a: u  i& [* W" V  Xcopy con test.txt! w) @3 b8 m0 `# c( y* e
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
* j2 b6 I6 T" w# x, |' vcon代表屏幕,prn代表打印机,nul代表空设备; N& G+ d$ F5 C( t4 S! j
copy 1.txt + 2.txt 3.txt
1 d3 m6 I/ k" y: K$ p  d# A合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
& W2 v, C6 _3 Z% c7 w6 P如果不指定 3.txt ,则保存到 1.txt; N3 O# v4 Q' ~4 e
copy test.txt +9 V( L/ [& X5 c8 r
复制文件到自己,实际上是修改了文件日期, M# ~+ K9 `, O
6 k3 c, V* g0 A. Q& f5 M
12 title
+ P% @1 U& }$ Y9 s9 @设置cmd窗口的标题  \) ]0 ]+ m0 N4 o1 G3 V% V
title 新标题 #可以看到cmd窗口的标题栏变了
/ O5 T) Z. g8 P: f! O' ^$ I# N
7 q4 j# G. Z$ h6 M5 b13 ver# X$ E" F. \- Y  ~# G$ ]. O
显示系统版本
' D5 h  a7 R9 Q( C6 q8 i8 s& ~* O3 n
14 label 和 vol' J8 {  t7 k9 D) T
设置卷标9 D  V' x5 N, c; W
vol #显示卷标
) o1 o- R: G9 @! p1 rlabel #显示卷标,同时提示输入新卷标: O- B* t8 B, ~; G3 m% H' |
label c:system #设置C盘的卷标为 system5 z3 G- w) G: |
+ I; T: w: C  j2 c
15 pause
+ G1 W4 E+ \$ Y9 e6 o+ J! S/ S暂停命令
+ @+ i9 O/ ?- V3 m1 W/ i' x: x; Q6 ~, ?8 x1 \( B0 P6 B
16 rem 和 ::0 o2 r1 G; H+ D1 s" ^; V( R
注释命令
& _  o7 v/ p4 Z) f/ s. [, V注释行不执行操作
- c; T  F+ I5 H8 h2 Q- _4 [% d% _8 p% h. h
17 date 和 time
1 b1 g1 L# y4 _, _  i日期和时间/ B9 w7 V+ L  e+ N+ G8 g
date #显示当前日期,并提示输入新日期,按"回车"略过输入
9 N" {2 i6 ]6 c  A; Z8 mdate/t #只显示当前日期,不提示输入新日期
4 C6 v5 l6 L/ Btime #显示当前时间,并提示输入新时间,按"回车"略过输入/ Z/ j- K  @  ?* t2 S
time/t #只显示当前时间,不提示输入新时间$ w3 i% Z+ c; U; P: J. ^
; i2 @3 b- D5 p( k- y9 F
18 goto 和 :/ c9 q# W% U0 ?' G3 d( X
跳转命令8 c; }9 g7 F; n0 \
:label #行首为:表示该行是标签行,标签行不执行操作
& v. w3 B* ]( G5 ^; q* Bgoto label #跳转到指定的标签那一行
, r) Z0 [6 s2 l0 Y. ?' B  r$ v& p& }( R( |* P9 K* R' D- P
19 find (外部命令)  ^& U# t4 o8 I" S5 K1 Q' N& @
查找命令# c" ?/ Q6 o8 R  P
find "abc" c:test.txt
6 v) R6 f* a/ g. Q; ]( D9 _$ f在 c:test.txt 文件里查找含 abc 字符串的行
& h5 h; _) R& {( A" U+ f如果找不到,将设 errorlevel 返回码为1
7 e; n$ i& j8 gfind /i “abc” c:test.txt6 c/ B1 `- e8 e& E- N: s
查找含 abc 的行,忽略大小写  t9 N# G' O; w' R1 ]2 j
find /c "abc" c:test.txt7 D8 ~) _, S4 {6 u9 }2 _
显示含 abc 的行的行数" H7 W* z' f# g$ u
# B# v' r2 ]- a: Z
20 more (外部命令)
7 d% w& n! E- W' R9 M逐屏显示8 O7 M  `9 O2 ~0 D/ z4 b
more c:test.txt #逐屏显示 c:test.txt 的文件内容
4 x: Q. r8 N, n% S6 J/ X& R' ?+ A3 K, B/ ]
21 tree6 L# d- a2 ]! O0 B/ z
显示目录结构; A, {9 O, a6 k/ u' N" E$ P0 f3 G
tree d: #显示D盘的文件目录结构
# @+ W2 r% P% r
9 |. m4 l4 @3 P) ?# a" G2 Y' Z: ?22 &4 \8 O' |0 {+ R- H: p
顺序执行多条命令,而不管命令是否执行成功
; h# F6 h! B; c
/ L* o% q3 T5 i+ h$ ?" a& I5 R23 &&
( L2 V/ z2 E" c. z顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令9 r* C% M! t+ A
find "ok" c:test.txt && echo 成功* z( G) r/ j7 j8 t$ T
如果找到了"ok"字样,就显示"成功",找不到就不显示
7 s( n) \# P% r% z4 ^( E' n, A+ E( `
24 ||0 i' S3 i& `" ~. m" S4 |
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
1 ]4 m/ V+ v0 b7 Efind "ok" c:test.txt || echo 不成功: P0 r' E6 e* F9 l# }& P& D
如果找不到"ok"字样,就显示"不成功",找到了就不显示0 K+ |1 ^+ }/ @/ Z5 L2 ~3 a; d' C
* A. f  P8 I% K
25 |- ]  ?( Q: ~/ y0 {
管道命令
/ ]& G+ g; u: A  T& F% ndir *.* /s/a | find /c ".exe"  w1 O0 Z) \6 Y3 ~
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
0 n7 a' j0 x6 o) Y该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
+ N$ Z7 _& Q' Dtype c:test.txt|more# i+ J5 T1 v9 G" Y+ D: S
这个和 more c:test.txt 的效果是一样的
, z; ^/ B/ |& B) P1 H9 d8 k" M
26 > 和 >>: @* o5 C! Z" A2 D4 c/ C
输出重定向命令
& ^/ H/ C6 l6 v$ y$ \3 ]8 |> 清除文件中原有的内容后再写入
9 O3 E' j. X/ o# i# ]$ n/ C$ G>> 追加内容到文件末尾,而不会清除原有的内容+ K' `2 D2 K, g( q( {8 h' p
主要将本来显示在屏幕上的内容输出到指定文件中
4 \' D" r" i) m+ c* q7 S1 b1 ~指定文件如果不存在,则自动生成该文件
- k% i9 I9 ^, }0 A& Wtype c:test.txt >prn
  ?9 o) W3 D: s$ k3 L屏幕上不显示文件内容,转向输出到打印机5 O5 g# T2 u1 m/ t4 a
echo hello world>con
, _/ s9 @4 G' u% i9 Z; w  V% s在屏幕上显示hello world,实际上所有输出都是默认 >con 的+ r( L* w. k; ~7 k
copy c:test.txt f: >nul. Y; {6 P+ l3 w
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息( V) h3 D) t0 }1 A' a* u. |# l1 U
copy c:test.txt f: >nul 2>nul' p1 `, G) v/ z
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
& `& K# g) ~* n$ R$ Qecho ^^W ^> ^W>c:test.txt  E6 B: S! ~0 q& @+ M
生成的文件内容为 ^W > W) j! \+ G3 I& Q9 k1 m% B
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
. l: b: a5 D! V( @  h0 J, \8 B
* ]* a& q. Q( Y% A27 <& W% l! L' P9 c0 p" V
从文件中获得输入信息,而不是从屏幕上3 J! S5 Y/ R0 c
一般用于 date time label 等需要等待输入的命令1 K0 \% S4 w. Q4 L# e* w
@echo off% R  G: a* q( P( ]* m
echo 2005-05-01>temp.txt% ]+ [2 p5 g) x/ V
date <temp.txt" F4 F& B; o+ q+ d
del temp.txt7 A% ~8 s5 b  c* p! N
这样就可以不等待输入直接修改当前日期
- C/ l# ]4 r3 f7 h6 m
! V2 G& l( g# {2 {5 S  c28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*0 `* h4 Y, A' P6 ~9 A
命令行传递给批处理的参数
$ N6 W" G6 A! i% N. v0 k( e+ D%0 批处理文件本身; \+ A6 d2 g. l
%1 第一个参数/ o0 Q, _# r0 D# m$ j9 o8 ~
%9 第九个参数
  D4 b6 h2 n( G: G+ u- \2 L%* 从第一个参数开始的所有参数' _3 W2 Z  p2 u" D  P
批参数(%n)的替代已被增强。您可以使用以下语法:
; g. {  B1 f& q: T1 K3 _%~1 - 删除引号(" ), 扩充 %1
7 W0 ^( S. y+ O- S9 x/ M%~f1 - 将 %1 扩充到一个完全合格的路径名
' i4 |0 e7 u$ z2 |" L: w5 j%~d1 - 仅将 %1 扩充到一个驱动器号6 ~5 k0 g  q) M" g- M- B( V
%~p1 - 仅将 %1 扩充到一个路径  m6 @% c) q7 O( g7 ^3 o
%~n1 - 仅将 %1 扩充到一个文件名! b4 |4 [1 ?* n* R- V
%~x1 - 仅将 %1 扩充到一个文件扩展名
; a8 K! m4 G* N1 x* f: J* |% j" {& ]%~s1 - 扩充的路径指含有短名2 C: g" M; E( d8 c
%~a1 - 将 %1 扩充到文件属性
( r7 P8 u, s% ]%~t1 - 将 %1 扩充到文件的日期/时间: t$ D8 ~( M1 y# A& g) L
%~z1 - 将 %1 扩充到文件的大小7 O9 F! A- T7 A  ]1 U( ^: z4 a$ W
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
3 i$ ~5 [9 ^: N& d扩充到找到的第一个完全合格的名称。如果环境
3 i8 Z$ ?" T- Y1 M# S4 g! o变量名未被定义,或者没有找到文件,此组合键会+ f' T$ x3 q$ j2 z- R, o. b) s
扩充到空字符串2 E0 J7 }9 P; ]: q- W8 P+ S
可以组合修定符来取得多重结果:
1 O) U% {- D! Q4 @9 k3 q/ W- |%~dp1 - 只将 %1 扩展到驱动器号和路径
# P" {9 T4 |  m) o8 d7 N% f. v%~nx1 - 只将 %1 扩展到文件名和扩展名
, ~8 ?2 B  p0 m& g8 v) I%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
" R* x! v7 S; W4 o% M5 E0 T并扩展到找到的第一个文件的驱动器号和路径。
1 |& _+ [3 M/ v%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。6 Z9 O% ?( Z* `! v  Y
可以参照 call/? 或 for/? 看出每个参数的含意& w2 c- ~* [4 h5 c0 x; Q3 R
echo load "%%1" "%%2">c:test.txt
, f/ l: C* G0 J! o5 O3 H  o生成的文件内容为 load "%1"  "%2"- v3 R- [8 d* X1 {7 T6 w' m) k( B
批处理文件里,用这个格式把命令行参数输出到文件0 F7 N" w- k. x0 i2 z

# o" B1 g# U9 D1 O1 h- O29 if
/ f+ X3 W7 D& b# X) S判断命令
1 b! Z- v( C6 j3 gif "%1"=="/a" echo 第一个参数是/a
1 W) {. {/ C0 z% t& Q( w- V6 }if /i "%1" equ "/a" echo 第一个参数是/a2 x$ b  Z# }+ U
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
1 b2 b) \4 y9 V* F/ [# cif exist c:test.bat echo 存在c:test.bat文件
) j- M$ k8 b6 B. K: K9 L4 Y6 mif not exist c:windows (
/ i2 V5 R' e8 B9 _8 [0 L  T9 ~% kecho 不存在c:windows文件夹
2 @9 s; T7 u9 r  {)
, ^: G& ?* Z% R& G. h- N( S( t; ], qif exist c:test.bat (
3 A5 w/ a+ H. f" W. e3 Z: Techo 存在c:test.bat
+ A! A/ n# v- X) else (
) U7 a8 X+ J, x! Yecho 不存在c:test.bat6 W6 \+ s( {6 ]" z2 G7 S
)( X4 w2 b; G! }9 O
30 setlocal 和 endlocal* _  X( N+ `8 O" I( w0 x
设置”命令扩展名”和”延缓环境变量扩充”
4 I0 }# T* s! [! c3 l9 xSETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"8 a0 s" R: Y1 ~; I; X, A2 p
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
) W1 X. E" y" r. i4 z& CSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"* c4 @# u$ T7 _& M) S' A! c
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
6 U& R+ [2 }% O' ?/ hENDLOCAL #恢复到使用SETLOCAL语句以前的状态
3 C: W% @5 h/ h6 m3 o“命令扩展名”默认为启用
# t; l* ^3 K" c4 f“延缓环境变量扩充”默认为停用
8 r! C) B/ m& U& u批处理结束系统会自动恢复默认值, p/ ]# z; K! t; h
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
) \/ ^. n- `. O序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确& }3 t1 [& p" v! u
保程序能在其它系统上正确运行3 n1 \/ u% F2 w' x
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程- l8 S7 D; ?3 S. f. t- j* Y
: u# C, M9 \' `6 W" `
31 set
* W3 f1 h' H$ W设置变量
8 C. p8 t- n' o引用变量可在变量名前后加 % ,即 %变量名%
$ q. a5 p8 B, D2 o8 J9 I9 lset #显示目前所有可用的变量,包括系统变量和自定义的变量% Y$ e0 u8 R( z) y- q
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
$ c9 Y) M' J  @* t4 Z" g! `set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=12 V$ b0 a' g+ l1 [+ t
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
2 n8 D, Y! U, v% G% jecho %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
; x: v. [+ ~" b0 ^echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2/ M& O1 f2 F5 I' Y9 Y' F
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2- F+ B* R2 ~' E  a* U* Z
echo %p:~0,3% #显示前3个字符,即aa1
# r) M5 b" {7 e- R! O$ Zecho %p:~-2% #显示最后面的2个字符,即b20 B7 z% w5 B* {: V0 N2 E: e2 n) p
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
) A: w( o) l% D, z' C! [echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
) x- F2 _& p6 c7 _" y4 c& f" Oecho %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2: i9 l7 m. f3 g
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
6 e$ V- b1 z+ z/ j: F' K( M* @set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb23 {' o, u5 S1 Z- ^4 o, ^
set /a p=39 #设置p为数值型变量,值为39
3 f* n& F4 C# F' Jset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
( A1 k) `$ e  y/ [* d- Vset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
( v+ l* ~1 V9 y$ cset /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
* Y9 m$ D/ G8 A9 Q. E( s( Wset p= #取消p变量" N$ @$ r- P" C, L  z  y6 n" |
set /p p=请输入" a" e3 Y+ {. P
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
: A" e7 a& y- G- Z  x6 T% w7 h注意这条可以用来取代 choice 命令
  `% S& d9 b9 o0 a. z注意变量在 if 和 for 的复合语句里是一次性全部替换的,如2 i+ E( i3 A! V7 k# \
@echo off; W% S1 m  s" {/ T7 z) X3 g# l  e/ d  G
set p=aaa
  t/ v- j4 V% |/ D8 bif %p%==aaa (5 x+ C5 |% Q: W6 D- |- }, J% p8 x
echo %p%0 |/ t; f# f! c! ?4 ]) ]
set p=bbb
  G) k2 \2 k5 w. t1 Xecho %p%6 ?' Z4 n' e- k6 R' m
)# L5 V' m; i4 ^
结果将显示* W" {: d! ^9 L; r7 p
aaa+ R! ]& I3 y5 T
aaa+ k7 l; a3 K: ^: p  e3 C
因为在读取 if 语句时已经将所有 %p% 替换为aaa
9 R, Y  V& g+ b1 K1 J3 }这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
3 J" N3 @  O, \( _可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
) D8 {' D# ?* U. V4 r& j! S@echo off
$ K" g7 F  A# i! f' u! fSETLOCAL ENABLEDELAYEDEXPANSION7 }3 o3 Z  G9 r' s5 F% g% U
set p=aaa& _/ v1 m  c  ?; }+ K% n4 X7 Z; W
if %p%==aaa (
/ u. [( X6 _/ c- Kecho %p%
4 K- v8 ~5 S, pset p=bbb
9 Q  m; C& P7 M5 D4 uecho !p!' x  x# ]' e4 N
)& [# _5 ~3 s. C" b* \6 Z  v
ENDLOCAL; e7 U8 ?; e% g! \. Q- K, }- k
结果将显示
' ~* ^. l6 R5 n# }5 N4 kaaa' i! D' x% ]9 G% s9 L
bbb7 H3 ?% K7 A* O: J- [' }; U! }
还有几个动态变量,运行 set 看不到( h( P* S* h- t: p
%CD% #代表当前目录的字符串
3 L( f1 p, A' |8 r! U: m% t. ?%DATE% #当前日期
" F1 g+ x$ F- W: @' I%TIME% #当前时间
) a2 L+ x  m1 z, @; B%RANDOM% #随机整数,介于0~32767
) k5 |& w/ X! M! r; `# j8 m& X9 q%ERRORLEVEL% #当前 ERRORLEVEL 值) Q6 Y* _1 H: ?
%CMDEXTVERSION% #当前命令处理器扩展名版本号9 U! x$ T: X: W  x" m
%CMDCMDLINE% #调用命令处理器的原始命令行
: \! d1 l$ ^( O. r* x) X3 d可以用echo命令查看每个变量值,如 echo %time%6 J$ e3 P4 t3 Q9 i( e' j
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到9 X! X! e6 y8 W+ }
% K1 E; R! x3 P
32 start# q( ^  a5 Q* |" g& i% ~& V. @6 K
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
! z* _8 l/ V: G
6 e! x# Z8 i6 R8 j+ k33 call7 r6 u4 G  M4 `. a
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行( {3 q" n7 \* g3 r- d$ S6 w
有时有的应用程序用start调用出错的,也可以call调用5 @  L8 J" J) w
% a# n  w$ t& f  c) N
34 choice (外部命令)
6 l; X8 W" d& n; w$ U, R选择命令
( `! J) I1 a# j$ k1 ^让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
2 ^+ I/ ]" o% `8 ]win98里是choice.com8 ?; ^& B* ^, @9 M. F
win2000pro里没有,可以从win98里拷过来
) N9 I% ?& q. g' fwin2003里是choice.exe- |+ V' B8 O: W' ]) R9 }
choice /N /C y /T 5 /D y>nul
9 f* t) D, M. T: }& m( a6 j* p7 q延时5秒+ ]8 ?0 ?: O8 v& P1 l

9 P& V% u7 ~' ^/ p; \% {35 assoc 和 ftype, m- X& P0 d3 c+ v% m! E7 U/ y
文件关联* ^' v5 T# V, H! p
assoc 设置'文件扩展名'关联,关联到'文件类型'
- Q' Y* u( z! y4 d4 Mftype 设置'文件类型'关联,关联到'执行程序和参数'7 D* @, ]2 a" c$ p' u, t4 w/ P
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
6 R$ K9 y6 V: e& t而是先判断.txt属于 txtfile '文件类型'% ~& D1 N" A6 N
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1; |+ G9 p* a2 |8 J0 P% S. w/ k$ ?
可以在"文件夹选项"→"文件类型"里修改这2种关联% U* H' k5 {# w3 P+ ^. v7 [4 T
assoc #显示所有'文件扩展名'关联
1 `3 h, ^5 k* q1 O6 j! ^assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile3 n' G0 ?* D& P0 [
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
: _' V% M4 O8 @. ]" I7 T6 @: Hassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile  P! d3 f" ^2 t: D- X
ftype #显示所有'文件类型'关联
& x, A5 Q% r, d# Qftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
# r. w* r6 H6 ^assoc .txt=Word.Document.8; u: q  M8 d1 q1 o9 X' i4 g
设置.txt为word类型的文档,可以看到.txt文件的图标都变了
6 o( D1 Y8 V7 L8 m/ rassoc .txt=txtfile
/ b4 U! H9 h( k/ d( P/ v0 U恢复.txt的正确关联
" e: C7 A6 h' k" Y$ Yftype exefile="%1" %*0 ]4 }, [1 N/ s+ o
恢复 exefile 的正确关联
2 u# N( b0 }! \3 D如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
7 b( p6 l5 N+ D$ I$ X4 {/ {
, A0 [; ?- N3 h. b36 pushd 和 popd0 l0 s& r, W6 N5 H6 ?4 s
切换当前目录1 c, A# `' Y: _
@echo off6 E; i& ?: q+ \) M* E
c: & cd & md mp3 #在 C: 建立 mp3 文件夹( F1 K3 w' b" A7 W5 c0 X- W8 t7 R
md d:mp4 #在 D: 建立 mp4 文件夹" ]  S+ E& t. O2 {
cd /d d:mp4 #更改当前目录为 d:mp43 t) k$ A. O5 n4 c8 r* J9 ?2 N8 D
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3$ A5 A& x: h# i& [! p; ^* O! }
popd #恢复当前目录为刚才保存的 d:mp4+ ?! N$ ^$ M1 x
2 o0 @1 z, [' X- S6 |
37 for% r% K( R# o6 V1 C* q  Y+ U) I
循环命令# ?# i: V- s, ]8 N& L# q( _
这个比较复杂,请对照 for/? 来看$ n2 N4 s( Z! e& \
for %%i in (c: d: e: f do echo %%i+ X: T0 [5 N( T
依次调用小括号里的每个字符串,执行 do 后面的命令
# C9 M2 J1 H% ~' @注意%%i,在批处理中 for 语句调用参数用2个%; D% ~7 M4 {7 @, W
默认的字符串分隔符是"空格键","Tab键","回车键"2 p( b# \$ G) @) i4 _
for %%i in (*.txt) do find "abc" %%i6 ?7 x; m! V; O- N
对当前目录里所有的txt文件执行 find 命令. g+ r  Z  D; h  x' J
for /r . %%i in (*.txt) do find "abc" %%i6 c+ t: j& ]4 E. l
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
1 J  {7 U7 a9 m$ F3 F9 afor /r . %%i in (.) do echo %%~pni+ h; s5 P4 }% s) {) u
显示当前目录名和所有子目录名,包括路径,不包括盘符* e1 F2 x- F" y1 b- o
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt2 |4 L- {6 c8 q2 `+ E9 s. k4 ^
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去% S( ^' C1 C9 s) e! W4 q+ `
for /l %%i in (2,1,8) do echo %%i8 s- a' n. A! g" y7 D
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1) g' @$ S- z2 ~0 |8 F& n6 D; r
for /f %%i in ('set') do echo %%i  \: {9 [& ^# e9 P$ H* b. V
对 set 命令的输出结果循环调用,每行一个6 |7 r7 J- d0 u/ v4 v
for /f "eol=P" %%i in ('set') do echo %%i
- p+ g3 z3 T9 K" t  X+ x3 E5 o取 set 命令的输出结果,忽略以 P 开头的那几行0 V% q2 E. D- E& G
for /f %%i in (d:mp3.txt) do echo %%i- y; i7 O8 m/ G2 Z# e- S; |
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称; |, i% t0 P, e2 x# {  I
for /f "delims=" %%i in (d:mp3.txt) do echo %%i
% J7 f6 S+ k/ N; A. N9 a显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称; a& u. L+ A* z$ y0 _' t# l+ Z6 F
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
! |5 ^" x' E2 v; A% |4 w对 dir 命令的结果,跳过前面5行,余下的每行取第4列
1 E. t3 E& a. R每列之间的分隔符为默认的"空格"4 Z. `8 h+ l8 t8 q7 n7 s/ O/ @; {
可以注意到 dir 命令输出的前5行是没有文件名的3 z; N, E* |! g$ x
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (7 K# a6 ~) \1 M- F" ~
echo %%a
1 q$ L" X# M! J+ H6 ^4 j. }echo %%b: p- [3 D  N7 O/ Z* r- `
echo %%c5 E0 C* J8 ]8 A
)$ E5 z6 _  u3 C6 ?% k/ t
对 date /t 的输出结果,每行取1、2、3列: g2 S3 V' Q3 p3 c
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列+ P* N  F7 B% u  x* k# N
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
  d3 S" G2 ~8 ?* M" G0 i9 v其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的( p5 ?  r4 [2 L6 o
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
$ [9 A* a5 d. i. e5 ~8 Y+ J5 O取第2列给 %%a ,其后的列都给 %%b
6 l1 A0 H, x3 [+ J0 ]- o( i+ T8 w0 v/ G+ k5 {8 E% a1 e3 E  I
38 subst (外部命令)
! v( Q+ b: o# i" O+ |映射磁盘。1 |8 u9 c  |4 w/ j2 Z$ q9 _
subst z: serverd #这样输入z:就可以访问serverd了
" V3 n( S- h" b; b' y: p* s) z3 Fsubst z: /d #取消该映射- x. b. Y1 r, k2 }, Y4 @
subst #显示目前所有的映时3 {0 U% c1 g9 X$ z% F% [1 o
( Q; e, [" Y. `; p$ l0 a
39 xcopy (外部命令)! e/ V# [) E$ t$ ~+ I1 _& g
文件拷贝
3 Z- j: W+ C# m& u0 Qxcopy d:mp3 e:mp3 /s/e/i/y/ r8 {, v9 ?* d$ r6 e) v& s# c
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
& A# }4 X6 Y! A# s9 O- y2 v加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
, y" A, z& A* c3 j" n) _9 L6 \# U$ C4 P2 G, _* n* S" o: a
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
    4 C" ]# z* B2 t8 m$ _, O
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:
      9 ^% }: t% {" y. V8 X( ]

    2 i% }, M8 V$ _9 X) }
@echo off
2 T  ^- Q; d8 C- h( Iset p=aaa
2 j& m1 q3 Z7 R1 f' l, tif %p%==aaa (; x( ^+ r( `% [, e( [
echo %p%. {. n* O" r  l: q! B! q7 N
set p=bbb
# b" l% F, v; a" }& T' a# Mecho %p%
* T; n/ w8 y  p3 k6 q)2 u2 M# d* Q  Y. t
pause
  • 截图:
    : A, l+ m) k0 z/ w7 D& T0 R, s
  • 2.批处理.bat 文件中输出中文乱码

    ' R7 `" W3 C( M7 V$ r% B
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:
      & x; s  H. T1 A) N; {% n# }
    • 效果截图:
      7 e1 N" a- n/ l7 j  F7 d$ W1 k: O5 i' R4 S1 K/ h" _

    2 U0 W) V- b5 ?( W/ |

) T9 u2 o) Q! u  q- N) W

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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