|
|
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!
% H) a0 v+ p! d% Z: |) E) d( G 前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效; {' |5 d3 M; |0 i( ?
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展 c: t l8 s, e0 F! J' x: `; e
名为bat 目前比较常见 的批处理包含两类: 4 E6 v$ _8 [7 y+ r; [
- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
- s- B# f8 f. Q/ b( X; s
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的/ j( s; E2 ?) ^4 J5 ]! U
命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
# U) }0 C/ M# J8 @) | 怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出/ }9 C& c; ~7 t7 J7 F4 z
批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set+ S! r9 e$ P- X/ S3 \$ ^2 O
批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||" b) h: Q* ?5 R+ a% Y1 k. h& i$ S
常用DOS命令- 文件夹管理:
+ Y8 Z, z, u# `# F- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。
4 N$ _( |* n# W5 I9 c# D5 Z& t
- 文件管理:
3 }* ]; x$ O& E3 `. F% n- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同
3 U! n& C% `' a1 u c4 ~7 {) h
- 网络命令:: E, R) a: `4 w& m; @0 H
- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表" B- Q7 T) L( N; Q K* u8 p7 K2 t
- 系统管理:
' B" l' `% @2 `% D7 ?7 w- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置; l% ^+ e* X' L$ T v
; I' r5 a3 i9 k, q# n1 c" v
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
J* K: Q5 q7 N. |# w
% G( [1 f! q) q0 A1 f+ G1 rWindows Batch 常用命令
6 L% ~: A$ F' }. J1 echo 和 @
+ M' }% D9 U% i) F. {回显命令8 I8 G! q7 y7 n$ {& i4 z8 B
@ #关闭单行回显
' {( B8 o2 @' Fecho off #从下一行开始关闭回显9 Q) Y5 n/ ]: S
@echo off #从本行开始关闭回显。一般批处理第一行都是这个
+ i2 I; ]+ `: I% y. ]/ `" k9 C1 v+ yecho on #从下一行开始打开回显- B u2 i) l7 L' a F: X4 D+ ~5 X
echo #显示当前是 echo off 状态还是 echo on 状态
, H) S$ t: q6 S) X, Q4 Y1 K8 Zecho. #输出一个”回车换行”,空白行- F* [+ V2 e3 ^4 R$ [# [+ c
#(同echo, echo; echo+ echo[ echo] echo/ echo): X1 Z& L4 q4 j
% U" |+ a3 B' w: E0 c2 errorlevel; }+ H( a$ p- a2 y. ?5 `3 i
echo %errorlevel%
: e- t' S6 m$ Z5 k/ f2 |$ E( R1 x每个命令运行结束,可以用这个命令行格式查看返回码: a# a8 ~5 S; X& b* }
默认值为0,一般命令执行出错会设 errorlevel 为12 j- g* J$ F5 [9 }- b7 |- X* c4 s6 f
: n: x: G% _! M7 p3 dir/ V: Y; z4 g7 c
显示文件夹内容
5 Q1 ?# z' W. k; E, U4 ^dir #显示当前目录中的文件和子目录8 i# ?: i5 [% e' G
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
$ K1 z- i1 K# i5 \6 ldir c: /a:d #显示 C 盘当前目录中的目录
) v, o }$ M7 ]4 a% i7 V( Cdir c: /a:-d #显示 C 盘根目录中的文件2 d8 e$ m9 K9 q0 L+ y V9 l6 M) f
dir c: /b/p #/b只显示文件名,/p分页显示, c* U- x3 w& x1 K
dir *.exe /s #显示当前目录和子目录里所有的.exe文件
8 G3 ?- b6 f/ t$ }/ K/ ^1 d) L A, Q! u8 J- E
4 cd
9 n" H( L" b: v/ a/ C切换目录
8 _0 g2 @+ |& H: E- Q6 fcd #进入根目录
& h3 Z/ Z- R; U- L% @) d$ L3 kcd #显示当前目录1 v% Y: Z& _, }4 ~4 C/ P# ]4 s
cd /d d:sdk #可以同时更改盘符和目录
8 W; }+ x1 Q$ q0 E4 G
' \; f+ u/ l3 Q4 ~5 md+ } \2 F% ^$ R( M8 J4 ]
创建目录
6 s& [9 V3 R8 F0 ^! r8 g7 Lmd d:abc #如果 d:a 不存在,将会自动创建中级目录) M' I; i( `- Z- p! l, a ^ ^
#如果命令扩展名被停用,则需要键入 mkdir abc
, e6 R3 r; p/ m* m6 Y6 ?$ }) R0 ^" f% L: @
6 rd. {& ?1 p" h) K6 `, i
删除目录3 R* R9 X4 j7 R% l6 G7 P1 P O
rd abc #删除当前目录里的 abc 子目录,要求为空目录* R9 u( D6 }9 a: ?
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
7 ]0 p; G- B* L/ t5 ]" d2 n& @# i/ ~7 R/ U5 m; x: o
7 del$ k' c/ G! h' Z# n
删除文件
9 x4 @) U0 J# V# ndel d:test.txt #删除指定文件,不能是隐藏、系统、只读文件9 z& k0 k/ A: q9 \3 j, L% i
del /q/a/f d:temp*.*
, K( O" J% e* U% V4 b删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录- Z( i# {8 e0 Q1 u7 @
del /q/a/f/s d:temp*.*- F5 m. n% w8 y# y
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
# R# M( c3 a c. g5 L2 F
S; n9 ~: Z5 N/ a8 ren
% y, Y% y4 o8 s5 s' t; J$ Z" `重命名命令( h( F7 I$ P: ?) _
ren d:temp tmp #支持对文件夹的重命名' X$ ?. K6 y: E5 A2 W3 q
4 [4 z1 P# G. M: v
9 cls# {& }/ S3 r5 X8 [* Z5 y0 E; G
清屏0 @, o. L) ^5 W; g- f, v+ C, Q
10 type
% U( l1 B" ?6 u3 g' d' V' ^显示文件内容3 I+ [; k, @4 t3 o5 M
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码3 X# \: b; U% Z+ }
type *.txt #显示当前目录里所有.txt文件的内容
1 U9 b5 ?8 X' h# G& P, g' u
0 W. e9 N* w0 L. F6 u3 x) G+ Q11 copy
0 x% q7 `6 i- Z5 d2 G拷贝文件
2 h. B" z( f4 `copy c:test.txt d:test.bak
, y. I$ c5 r7 _; S复制 c:test.txt 文件到 d: ,并重命名为 test.bak' _ m1 N( ~# k s, A
copy con test.txt8 C' _4 ]7 D! T
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
}6 q4 P/ N1 G. x9 o. q) ~( jcon代表屏幕,prn代表打印机,nul代表空设备
2 ]9 V1 k% t% B1 Ccopy 1.txt + 2.txt 3.txt2 ^. _: {$ [# C$ e
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件+ ?/ R2 T3 v2 L$ R1 v, `
如果不指定 3.txt ,则保存到 1.txt
% I3 y. ?3 t9 f4 x# o- ]/ [copy test.txt +; \6 @' h2 z3 g5 n) Q
复制文件到自己,实际上是修改了文件日期, c/ I5 I$ k7 h. @1 Y+ P5 d0 ~
6 z6 `5 y7 d5 u' Z! J4 i0 J
12 title, p7 m* a+ H3 S
设置cmd窗口的标题3 }# x' A4 ^4 C. t$ f
title 新标题 #可以看到cmd窗口的标题栏变了
+ f3 H) J; E+ H& p
4 L/ e# J$ m. o! o+ Q13 ver
; h1 w; t' {5 D! a$ v* M, @显示系统版本
+ G" x6 C" |8 ]$ O
u: `" @. D$ U% X- K7 F14 label 和 vol. P2 L! F f) M) K0 K# F s/ w
设置卷标; E( c7 x( M: r7 R& I
vol #显示卷标$ S5 s. t; f& L) F2 Q& o
label #显示卷标,同时提示输入新卷标
; W6 B# L: b6 i! d+ q; Wlabel c:system #设置C盘的卷标为 system: B5 p, `- v9 w5 e: ]
# W! R% p3 \3 @: j1 y# n* P& `
15 pause
9 u0 }' N0 ^6 C! y' v2 ^' o暂停命令
( ~- T% }( A: s# a9 ^3 [3 U
/ D$ t9 }5 g( h& V) X9 X16 rem 和 ::
+ }% t2 N9 ~$ V. V7 q: _5 ]注释命令7 o7 O% p: c. u+ D- |1 v) e" S
注释行不执行操作7 W2 }- }* c8 v
9 {" {. l7 V* d0 a$ M3 B
17 date 和 time! a1 |, I+ X% l: _ ~# W
日期和时间" K% a2 u% B( n* T5 X
date #显示当前日期,并提示输入新日期,按"回车"略过输入3 `: Z6 K& U7 F
date/t #只显示当前日期,不提示输入新日期' K( m4 b6 L) `! ^
time #显示当前时间,并提示输入新时间,按"回车"略过输入
, {6 s8 b/ B2 h+ X. Xtime/t #只显示当前时间,不提示输入新时间; ?% D l; Z: W6 a i1 }- w+ s1 p4 [' e
8 e. W" ~1 |: E t
18 goto 和 :7 E; [6 j/ J9 ~3 C) H
跳转命令
" U8 D( A/ ]! j& U" I:label #行首为:表示该行是标签行,标签行不执行操作+ y( K7 Z# ^* d% ~
goto label #跳转到指定的标签那一行. O% @# L& z5 }, z. R0 r4 @
5 a1 v& z, Y2 |/ K( k& Y
19 find (外部命令)1 s" Y2 i: x8 A# E
查找命令
! [$ l8 h O, b; A4 gfind "abc" c:test.txt) [( X+ A1 N1 ]
在 c:test.txt 文件里查找含 abc 字符串的行" K5 O4 g; m' o9 ^; L T$ r. A
如果找不到,将设 errorlevel 返回码为1
7 j& }3 _, n. kfind /i “abc” c:test.txt' j- t; [( K4 `8 Z& L- a3 P
查找含 abc 的行,忽略大小写
4 F8 f; S) V% E# N* A8 M2 vfind /c "abc" c:test.txt
9 H4 W% ]7 p% N4 m& \显示含 abc 的行的行数) N" T. P5 N, ]5 U
7 a, v4 V7 ^6 k7 j. ^' z20 more (外部命令)
. `4 P& K2 g$ @逐屏显示
% M( r: Q8 X$ r4 P$ m( o& Emore c:test.txt #逐屏显示 c:test.txt 的文件内容* w9 s. n, ^. |9 W' R: R
& ~) ~; q; q8 ^2 D5 n* T# P& `- f- X! a21 tree3 g) N, |6 L; J* w2 w5 q. \
显示目录结构
% V: ^8 }1 b# k- q4 Z; |# qtree d: #显示D盘的文件目录结构
' c9 j, i" L2 t! i0 k% b
a( E( D% {( q* O8 ]22 &
# B2 v8 }! a' a5 q顺序执行多条命令,而不管命令是否执行成功
, k8 C7 R9 S2 Q j8 n, b8 d, ], e! I8 i' u" _
23 &&
" t4 D* D2 e: D+ D2 A! w顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
2 a4 J- W# {$ t/ ~- Xfind "ok" c:test.txt && echo 成功7 @' ]# e: D. T' }; k/ S
如果找到了"ok"字样,就显示"成功",找不到就不显示8 r- V8 W0 p3 J0 ~0 S9 X
) D& k$ b; f3 J6 ^4 D/ Y( a
24 ||- g3 E$ A/ j4 I5 h: ?
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令& `- z8 w8 U0 U; j/ E0 C6 e; r0 w
find "ok" c:test.txt || echo 不成功7 p6 Y* f- @) r% e B7 l( v
如果找不到"ok"字样,就显示"不成功",找到了就不显示
4 k' S* a4 V- ?% w: s. i) R; V+ e1 d, Y6 t6 `) B) h
25 |# D! D7 {9 Q6 }' b' {9 u( b
管道命令1 W3 o4 i6 k( w- g3 Q
dir *.* /s/a | find /c ".exe"* n6 a' s Q. I
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
8 E: b6 i$ u1 r7 N该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数3 Y* q4 j2 }+ c! v' i2 O4 u- v3 z
type c:test.txt|more* ]: T* L* h/ ^* j( I+ D" T
这个和 more c:test.txt 的效果是一样的
: B0 h* w* Q1 d& m* g, A# L" d1 x
9 W4 @; \: U5 z& U3 W+ K26 > 和 >>
9 L% Y7 r* {5 e6 h. _) A3 s) y输出重定向命令7 F9 |) q& ?, O+ J: _1 I3 n, u6 f
> 清除文件中原有的内容后再写入8 [& e$ L, ]7 u
>> 追加内容到文件末尾,而不会清除原有的内容
) H% |: k9 h3 |/ r/ Y" ?) _主要将本来显示在屏幕上的内容输出到指定文件中
8 o% f: ]" o" U! w7 J/ m* [% a指定文件如果不存在,则自动生成该文件
* X# d; F# U3 f% ? D" ktype c:test.txt >prn8 i6 { g" W1 J! S& W- I, j
屏幕上不显示文件内容,转向输出到打印机% E, P& x7 j: R Q
echo hello world>con7 n1 b8 A) l- ^5 g8 K& [ G
在屏幕上显示hello world,实际上所有输出都是默认 >con 的
- w; _" W7 E$ U( v6 Z7 T8 {0 }* R3 Hcopy c:test.txt f: >nul7 K6 P4 h" U. h
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
% a6 o+ n Q; I& Qcopy c:test.txt f: >nul 2>nul
9 c( X; W4 w' q: t$ W( S不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息3 G4 P/ |6 u* }5 q' i
echo ^^W ^> ^W>c:test.txt4 `( W3 p/ h9 z) R6 m9 O! |+ }) G( g
生成的文件内容为 ^W > W
4 i5 A4 C( R9 G^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
/ e) M, P3 n9 N$ G" p, P/ I Z) ], s3 n. L6 @
27 <
) }. a( P) x' g# ?' A! i从文件中获得输入信息,而不是从屏幕上
N/ c8 A; ]2 Q# y一般用于 date time label 等需要等待输入的命令
( F- K% W& F2 Z0 W" X1 j@echo off
7 M( `; e, n0 v) Zecho 2005-05-01>temp.txt
% F+ a! S' q& Bdate <temp.txt
; G5 r& U; K1 i+ m2 q1 J3 U5 Mdel temp.txt
w l8 v8 r0 {( Z! Q( t/ G这样就可以不等待输入直接修改当前日期
8 x' x2 ]/ Z9 |& r8 \9 r: b- ] x0 c0 W1 g2 z4 Y2 @! h
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*4 L& [8 K" p u7 Z$ r9 b2 f% H
命令行传递给批处理的参数
) Z2 a! \% t4 f%0 批处理文件本身. I6 S$ L4 Z$ \3 R; C
%1 第一个参数
" E% ]: N6 ?, }%9 第九个参数# I, b( I3 G2 p. l6 b
%* 从第一个参数开始的所有参数
$ z8 x+ D3 ]$ [5 h+ T批参数(%n)的替代已被增强。您可以使用以下语法:" ~7 z7 ]# H7 l! Y7 i
%~1 - 删除引号(" ), 扩充 %1. c! X' l$ `3 I' o6 N9 C
%~f1 - 将 %1 扩充到一个完全合格的路径名' U6 s7 f8 \2 b5 {6 K; ]
%~d1 - 仅将 %1 扩充到一个驱动器号
- @+ f) a& i+ o7 y%~p1 - 仅将 %1 扩充到一个路径
5 c* E7 L$ I7 P6 Y% G u4 R%~n1 - 仅将 %1 扩充到一个文件名
% f3 z1 c$ \" R i%~x1 - 仅将 %1 扩充到一个文件扩展名9 a: ?2 X5 G/ r5 S. u
%~s1 - 扩充的路径指含有短名; _6 A9 ~0 h! R: d# b( E* g
%~a1 - 将 %1 扩充到文件属性* _' l' V7 } c4 b9 z
%~t1 - 将 %1 扩充到文件的日期/时间; {/ n+ D( O8 b) H7 n6 @+ F& A
%~z1 - 将 %1 扩充到文件的大小1 y1 ^# j3 z1 c& x
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1# l6 I5 w0 y/ Z
扩充到找到的第一个完全合格的名称。如果环境
5 `1 }. o& G. \2 |8 P变量名未被定义,或者没有找到文件,此组合键会
( X5 B6 C. |& F: s, d( m$ O3 G) B1 y扩充到空字符串
0 a8 W4 e+ z4 ^4 V. v1 x* M可以组合修定符来取得多重结果:/ K4 {4 A) j6 }& A$ l, X' ?% U
%~dp1 - 只将 %1 扩展到驱动器号和路径2 o4 K) ^- r& H/ b/ g
%~nx1 - 只将 %1 扩展到文件名和扩展名9 `/ f, Z4 b& d. ~6 R9 O
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,( r* F" t7 |# a: ~. M: a
并扩展到找到的第一个文件的驱动器号和路径。
* L3 M7 K( U' G4 Y p%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
; Z) N: e0 @7 p7 U( }可以参照 call/? 或 for/? 看出每个参数的含意- K* n6 y' p6 X
echo load "%%1" "%%2">c:test.txt
& \4 _" `- i9 L' i) |! P! c6 w# }生成的文件内容为 load "%1" "%2"+ l8 s# `" d8 ^( P
批处理文件里,用这个格式把命令行参数输出到文件
4 D7 g9 o: y2 h) G- `7 q$ Q! v+ C2 d* U- Z; |' k. O6 O
29 if$ p4 B$ {' X1 [, j( a
判断命令) s1 c* ^1 n1 _# Y
if "%1"=="/a" echo 第一个参数是/a* J3 F3 Z4 X7 f( ^' B% U
if /i "%1" equ "/a" echo 第一个参数是/a
: _# |5 ~' p2 ]) D. n9 [2 s/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?" y4 k5 D* Q- O4 W+ T
if exist c:test.bat echo 存在c:test.bat文件) x, d! g4 Z: a' ^! f, Z
if not exist c:windows (( t# M" \, S# k
echo 不存在c:windows文件夹# c1 K- i* o& r1 |
)9 V0 j" {4 \$ P% x8 L
if exist c:test.bat (
0 m- c% t2 J k: u$ L7 m7 b fecho 存在c:test.bat- t3 ?2 U9 k2 }% C2 n% F
) else (5 {4 X" u; s* [: I
echo 不存在c:test.bat
% E- b' y: ]/ g8 K- [% Y+ ])
8 D) Y* S# l: H& M4 s+ w7 p0 n30 setlocal 和 endlocal
4 L, ?5 |9 X0 l S设置”命令扩展名”和”延缓环境变量扩充”2 h. _! ]( q5 o
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"0 ]. F+ Y& }8 ?9 a
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"! C3 U+ W# }( ~! z& W( J: ^
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
, Y+ f |" ~+ l6 ESETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
{. D3 H/ @+ C1 CENDLOCAL #恢复到使用SETLOCAL语句以前的状态5 p1 W1 A( R$ r! q2 S
“命令扩展名”默认为启用$ p! S4 u) S( y# }
“延缓环境变量扩充”默认为停用
% L2 w) Z5 A7 @4 }; r! ^批处理结束系统会自动恢复默认值- |0 Q! s% t) N6 t; j" a3 ]! T
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
& v2 U& x' K2 t- k! T6 Z序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
; B2 |1 O7 b/ j$ E# p保程序能在其它系统上正确运行. y6 F# I2 R/ N
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
: t+ }7 B0 Q& v& x* _) U
) ]) b9 g" r/ \8 o- D8 u+ R! X31 set- k$ t2 O; D: e4 P" L; q. P
设置变量
/ k. h2 V$ O, [5 l: \7 @3 o4 V引用变量可在变量名前后加 % ,即 %变量名%
/ l* {7 R* e! `8 u8 k* Eset #显示目前所有可用的变量,包括系统变量和自定义的变量4 T4 X' `. r2 p) M6 n
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用7 g9 Z/ m4 R7 Z6 o
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
6 V$ J5 z2 i- g' u; J! ~$ A* Eset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2) X& p3 n7 @% y( _' a T; c3 X, Q8 r
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
O/ r& A! m: E' i$ q% k% Necho %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb25 W! i r7 k3 L9 o# W
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2
( ]2 ]2 n; N# h# Kecho %p:~0,3% #显示前3个字符,即aa1* B4 n! w* r! [% _# n
echo %p:~-2% #显示最后面的2个字符,即b2
$ N. b3 W+ |9 R( j" G+ Q2 i4 }echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
+ J t/ t+ d& `. E6 h5 W" C$ o+ @1 Secho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2- d- |, a$ A2 [+ Z2 l6 S: M5 q
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2+ g+ Q& a) K: |* n3 T
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb24 R; _+ W1 z5 }. G2 {5 f
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2, l+ y; I/ W1 T' P/ l/ b+ J; [4 a
set /a p=39 #设置p为数值型变量,值为39
7 K8 M" B$ Y" V$ ~set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
" J) U8 t, U7 kset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用. F) P$ W0 k( T3 X! g. R/ y# Q& U
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
6 S% N8 ]) {; }; _7 Xset p= #取消p变量. T! c( O: h- z7 I3 D2 j) f! E
set /p p=请输入( H0 l' Q8 u% t1 U% [" i7 J
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
1 r" J1 V7 l: v- g, X+ Z注意这条可以用来取代 choice 命令
, h7 D3 v& g6 Q0 c# o注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
1 R. O7 a: x! r9 g) `, t6 }6 o2 b@echo off k% h( j! m* S! k8 {+ k. l
set p=aaa
4 F/ i: H: H' c3 \! n3 cif %p%==aaa (4 U Y y' r5 h5 _* ]# `" ^. V
echo %p%
- T' A& `8 V3 G, i9 L3 aset p=bbb: O' h7 p D1 l, l( d
echo %p%2 t& w4 q0 _% z1 {. g- {
)5 N3 T/ o. ~7 b! U( ?" G- _4 s$ k
结果将显示
; y R9 C4 f* t% Taaa
( }- H) ^$ N) r0 i0 q" qaaa* S c# _ \/ s0 s
因为在读取 if 语句时已经将所有 %p% 替换为aaa
6 H# A- X- o" { v& U( c7 L这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充") K. x: y4 o. u {: [9 M# W
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!, I* x4 R, N- l4 \7 f8 H9 p
@echo off& Z7 L1 u3 J4 V7 E8 j, b
SETLOCAL ENABLEDELAYEDEXPANSION
& e8 s7 G/ f1 S6 d& R! c7 nset p=aaa$ ]+ `& w$ |. ^$ u% \
if %p%==aaa (0 R6 ?! G. \" k! n8 [
echo %p%' f' [ p2 H2 H J& C
set p=bbb
1 }8 ~- |# P# o" X; ?& Necho !p!7 A2 U' [- F+ W7 X d
)- {1 R7 x' A" @& |, B3 u0 Z
ENDLOCAL3 G5 z2 s Z- t; k5 v
结果将显示 X- G# _5 N1 Z1 T
aaa
: s2 j, l5 G7 f! b. O, [7 obbb% O: `0 q$ x" t% h: T
还有几个动态变量,运行 set 看不到
! F' s3 N7 [# C! d%CD% #代表当前目录的字符串
2 y( H1 ^ b' z- h( ~- R" g" L- k E%DATE% #当前日期! X4 i4 W& M9 w5 n& ^, n5 d4 D
%TIME% #当前时间, @$ i* I$ }$ Q5 U- }) \; D
%RANDOM% #随机整数,介于0~32767. Y" c# r, x8 {$ U4 e1 d& |/ Z$ Y
%ERRORLEVEL% #当前 ERRORLEVEL 值
; x; Q' @" e6 }- l k7 t%CMDEXTVERSION% #当前命令处理器扩展名版本号
- F( P' o* O6 S' {%CMDCMDLINE% #调用命令处理器的原始命令行$ V5 ?/ y: r- m- e- A6 E# g
可以用echo命令查看每个变量值,如 echo %time%; c- X) p k, H! Z) Y; B, X5 }7 b
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到6 R6 Z- d8 s* a9 a4 u
% `2 [1 `4 R" Q# C" D6 e
32 start
' b& c6 Y; f0 {- g5 b- G0 p批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令! F6 v% {- w9 @# E+ U: O, I
% V5 v! S9 e& s. n: f
33 call' L9 g; Q" `% Q/ G8 T
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行! Q3 Y; F! x3 B' [ C% S
有时有的应用程序用start调用出错的,也可以call调用
$ Y+ I2 q0 J$ i: a/ C- } k- G% D: R
34 choice (外部命令)+ a V! c3 j* h. X. o' ?" B
选择命令; f/ t/ l; i2 v5 D# D
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
0 O9 e% P* f" {: c9 x2 G/ cwin98里是choice.com, `2 i0 ~7 \# p" i
win2000pro里没有,可以从win98里拷过来
' v5 K' R) W; I5 Owin2003里是choice.exe" g% G/ i" r+ n: Z. s9 F
choice /N /C y /T 5 /D y>nul6 E, U1 C+ J6 y
延时5秒
: t& @& [$ H+ H$ }! _5 M9 _6 Z1 Q, f C3 P& N
35 assoc 和 ftype
+ K) A l2 m% e5 l文件关联4 Z/ r6 x$ p6 C1 k/ O
assoc 设置'文件扩展名'关联,关联到'文件类型'
* }( j8 o" {, I' e' S ^7 ]ftype 设置'文件类型'关联,关联到'执行程序和参数'
5 C' v. d5 I) \当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开& j: Q( }: f* }" E
而是先判断.txt属于 txtfile '文件类型'5 @, r5 B; t, C" i
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
1 V7 n8 I8 ~ M: _( t4 h; S$ k可以在"文件夹选项"→"文件类型"里修改这2种关联
/ _; ^% A" t) G/ kassoc #显示所有'文件扩展名'关联1 ^' q8 R- F( @9 r$ r
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
5 k! @% m/ w; U7 U; l9 W3 {+ Fassoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
+ {4 r$ u C/ Y! p9 ^# iassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
7 K% a- p# l% l, v# u; Fftype #显示所有'文件类型'关联* r3 F. c( X0 i7 e0 `7 z: m3 {5 y
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*' K0 M. k! G% I
assoc .txt=Word.Document.86 ~; Y* a7 Y6 Q$ l2 W
设置.txt为word类型的文档,可以看到.txt文件的图标都变了
) [# z- n* Q+ G Dassoc .txt=txtfile
9 f& E# e3 l. Z9 D恢复.txt的正确关联0 U' ]% q0 I! |7 B" w
ftype exefile="%1" %*
' [8 y# b2 c! N$ ]7 L& s- F1 v恢复 exefile 的正确关联* X7 g* K4 Y v; ?
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令/ Y4 F0 U+ Z8 f5 Z) P# P; s7 @
8 q9 }* c3 }& k
36 pushd 和 popd% W- ^; M2 c, F
切换当前目录9 {; t% C* S z; L* u U
@echo off
! \ T- X4 D- ?- c) F( Qc: & cd & md mp3 #在 C: 建立 mp3 文件夹5 ^- R; O) X& G
md d:mp4 #在 D: 建立 mp4 文件夹5 a/ K- l/ m) I3 C1 P7 l' `
cd /d d:mp4 #更改当前目录为 d:mp4) n) ?0 w' e$ ^
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
, N0 }/ F" ?# E Y8 D7 Z# r8 Rpopd #恢复当前目录为刚才保存的 d:mp43 V8 g3 Y8 A. ` ~0 s9 R
/ m- T+ i# k+ l: \! \" h! W% e
37 for( G; r4 v: e% e
循环命令
/ r: a8 w3 D9 T8 p' f. w这个比较复杂,请对照 for/? 来看
4 T8 a3 |& h- Dfor %%i in (c: d: e: f do echo %%i) p. [2 I2 D [% {/ R( d) Z
依次调用小括号里的每个字符串,执行 do 后面的命令! f$ f# P, Q6 ?6 ]6 p
注意%%i,在批处理中 for 语句调用参数用2个%
7 C0 W" }; v6 y+ x& I0 U默认的字符串分隔符是"空格键","Tab键","回车键"
: z( G! f' |! N9 Ofor %%i in (*.txt) do find "abc" %%i
- U& J1 x6 X& P( v对当前目录里所有的txt文件执行 find 命令4 ^$ u0 `6 [% a. z( j# ]- m X8 T
for /r . %%i in (*.txt) do find "abc" %%i$ w8 M6 L6 b- U# J
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
' | v9 i5 }5 gfor /r . %%i in (.) do echo %%~pni
: f9 j: E+ k: }: g8 I显示当前目录名和所有子目录名,包括路径,不包括盘符( s" F) B4 g; \0 o, o
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
* c0 v; x) n7 q3 o& ?7 `把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
2 i+ c, B- \7 q1 Q% g' mfor /l %%i in (2,1,8) do echo %%i
1 ] o. g0 O: A生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1( R9 a% t0 V% p1 Q `5 w2 u
for /f %%i in ('set') do echo %%i
- s/ P4 F6 E0 f+ j7 @! q: j2 ^9 Q* L对 set 命令的输出结果循环调用,每行一个
& M* X. l# R, Q& I" |9 ?* Lfor /f "eol=P" %%i in ('set') do echo %%i
$ Q8 M/ ?+ ^; s2 G取 set 命令的输出结果,忽略以 P 开头的那几行5 M. H0 P: @, k4 G$ a
for /f %%i in (d:mp3.txt) do echo %%i
& ]3 ]0 H& p* i3 W2 o, _7 m4 s5 j3 g. T显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称 R$ `- U: S! W x7 I
for /f "delims=" %%i in (d:mp3.txt) do echo %%i
% V W3 f; |7 }! `6 J显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
7 r3 G( r2 {; N) M) }* g% `! bfor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a6 s9 m g8 S3 X8 {
对 dir 命令的结果,跳过前面5行,余下的每行取第4列. t9 g* v+ {- M X
每列之间的分隔符为默认的"空格"9 d% X7 c! M& E4 i
可以注意到 dir 命令输出的前5行是没有文件名的3 h, l! G0 Z0 ]. o1 J: k A1 p
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
3 V& G) `1 w5 F- s @echo %%a9 o. a7 \" z3 r- I* p' `
echo %%b
, h9 ^0 M: `1 j7 }echo %%c
. T" K$ X# E# E4 S)
! A' D7 o& y5 L0 s ^( j. k, i" B对 date /t 的输出结果,每行取1、2、3列: V7 E9 P3 {6 x4 ^6 j
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
. ^- @! L( R9 a3 s# W! P分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
# _/ q. i; i5 X! t3 n其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
: r4 N) Z/ }9 s2 tfor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b3 A8 @3 i+ [1 ^2 J
取第2列给 %%a ,其后的列都给 %%b
: w5 u. D [. B; s* Y
8 @. G% r" U( r38 subst (外部命令)
+ c9 Y- x) H' @( P A- U& G+ [: B映射磁盘。6 q) @0 ]) d3 r8 X4 C/ H: `
subst z: serverd #这样输入z:就可以访问serverd了
- h1 I* W- ~/ |! s( x1 `subst z: /d #取消该映射. z: @7 ~; l) c! t9 \: o( c
subst #显示目前所有的映时( A! q5 I5 } m" c! D0 I( M+ l
- u; V6 M/ v! C" ]; r39 xcopy (外部命令)/ \7 S' z2 C4 S# R) j
文件拷贝
( M. y) M. k& S K7 u2 Uxcopy d:mp3 e:mp3 /s/e/i/y7 P* [3 a5 K o: }! Z7 @
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
8 i$ e. B6 ]% ?* u7 L: z) [加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问: f$ g: I$ _6 g' f% J/ s( G
/ t1 K- P7 q9 v/ S
常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退3 N/ C% P" c# _, i# L! Y2 l }
- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:
+ H' q. Z) r- T
' q* O$ m6 a8 \/ M% c
@echo off- h) |* V; R. h4 d4 |2 x( S2 i
set p=aaa
/ Q" V9 s' m& L* G9 [6 R) i2 d6 Mif %p%==aaa (! l3 E8 t9 _0 _ ^ ^, g
echo %p%
I2 O' s# K0 g, F; c# @7 x; {set p=bbb
^- a" e7 i& x- y0 Hecho %p%) F# `: P( y9 N3 W
)
' i2 r5 `5 f3 u5 Q% b1 Wpause
- `& n( q R( y9 w |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|