|
|
发表于 2021-6-25 19:48:12
|
查看: 2372 |
回复: 0
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!. j9 x9 Y, r6 h) ?7 O2 F0 o
前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效) _; `- _# w9 I4 Q
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
+ Y9 x+ k; C9 x9 m& g) E名为bat 目前比较常见 的批处理包含两类: 9 G$ W3 d8 F6 Y( N7 p$ @! [8 {
- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理- m/ R, {7 P2 ~: m
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的/ V O0 V. W5 p. L( i, u% N
命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
) J$ a8 s, g/ W5 k( U8 f 怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出% E3 D. S3 |& d7 N* E* d" u0 h
批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set
# J! ]* l# {* p 批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||
. r' z+ E1 \* P: I 常用DOS命令- 文件夹管理:( c5 }+ X$ H: N& A7 t5 O5 t& ]
- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。0 o) ~7 v1 k2 `; Q! Z6 D6 S+ b
- 文件管理:
$ U" ]# z5 F# U. ]5 q- l2 p- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同3 M$ \& q! y6 r! M5 v
- 网络命令:
1 m% W8 V$ R ~5 \0 J9 z g1 w- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表* O6 @" j% Y, V
- 系统管理:5 L4 n/ c! R4 T" L& Y( v/ e
- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置
9 q" k, L5 M, ^4 f) j3 u3 { 3 G9 W4 M. A% z5 b6 }7 Q
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /? & |/ K1 \/ h7 z6 k; R; ^ w, V! \
L% k0 b( r2 @6 z) sWindows Batch 常用命令1 I" l, W, J8 X2 |, f( e& _
1 echo 和 @
2 \) N: w2 U& z' }% N0 l3 }# k9 o回显命令# s) p4 O3 l2 K. x
@ #关闭单行回显9 ^+ A5 ?5 Z: F# a8 Q( a
echo off #从下一行开始关闭回显* [5 t: R7 I) r# q& I( b7 @
@echo off #从本行开始关闭回显。一般批处理第一行都是这个
1 w: _7 B( e. D! S4 becho on #从下一行开始打开回显& m$ q4 j" w( F9 L8 ?
echo #显示当前是 echo off 状态还是 echo on 状态
) W5 B& i8 H/ [- U) qecho. #输出一个”回车换行”,空白行
# j: p" V; [& E; {$ p#(同echo, echo; echo+ echo[ echo] echo/ echo)
* W0 j! A- ~- ^1 h; _+ X8 Y7 B+ L) }9 Y. G
2 errorlevel7 v2 [5 X; w( b; w6 p
echo %errorlevel%" e! r- |( X q0 r% A0 S" \5 I
每个命令运行结束,可以用这个命令行格式查看返回码 F4 }) k3 p7 Z4 P
默认值为0,一般命令执行出错会设 errorlevel 为1
. V; o/ B: O1 j' j# f# F1 q F1 q5 Z9 o8 e& w" {
3 dir5 ~! B, m0 ^' A6 G% ], }9 r
显示文件夹内容- a" }1 e& E4 T" Z# r5 Y
dir #显示当前目录中的文件和子目录
/ h' M" P E, h. S& ]dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件6 z. @+ J* _6 @ A
dir c: /a:d #显示 C 盘当前目录中的目录' u( B) N. o( R* F# d
dir c: /a:-d #显示 C 盘根目录中的文件
3 ?1 S! `4 R1 X5 s% Ddir c: /b/p #/b只显示文件名,/p分页显示
! {+ C3 X" }0 Q- q- v( pdir *.exe /s #显示当前目录和子目录里所有的.exe文件4 M" o' S" j! s: L% J3 ?
% F) V2 C8 P0 f# r( p, C4 cd) t* w8 H* o. k- P# K
切换目录- e1 o- N3 Q9 N7 m
cd #进入根目录
. k$ B* O9 k+ m3 R* Zcd #显示当前目录
6 Y7 M3 f$ S; s# Y9 Q, f: @cd /d d:sdk #可以同时更改盘符和目录# V' ]6 z& |+ O( {) \
2 N4 i2 k4 D" C" ?
5 md
6 e9 d; p$ |) L' l3 P创建目录; W) I7 T3 R3 q/ `" R
md d:abc #如果 d:a 不存在,将会自动创建中级目录+ `( J4 E8 A6 |! S9 d' b$ N. Q
#如果命令扩展名被停用,则需要键入 mkdir abc
4 k" a$ J1 O: |2 C. e0 i/ q' P, B! b, @; t+ w# q
6 rd+ s( t/ W; I( {
删除目录) z: j! }: @: ?4 ?
rd abc #删除当前目录里的 abc 子目录,要求为空目录8 g, r1 e/ E" w { F( U5 Z8 R
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
7 J8 o' e, y# R5 o0 J) k I9 X4 q- q: V+ n$ F1 J7 {
7 del
+ a* e' I6 N' X删除文件 R4 N8 M( A5 k- E, \2 `
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
/ g; P3 [. S" Idel /q/a/f d:temp*.*( j4 I) Z4 K& ?" i( _
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
8 N; B" Y' I3 F1 s$ J6 n% {del /q/a/f/s d:temp*.*& f) {9 M0 U. w* c* P; V6 P
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录& X: g Y4 u5 m8 G
/ H8 m1 x. [+ F' M" P) b' i8 N
8 ren
0 ^0 F7 }& }- O4 Q6 e% a重命名命令: ~/ w: c1 H6 Z0 q6 o
ren d:temp tmp #支持对文件夹的重命名9 i/ s7 o& `2 P# u1 n. N
9 c$ a" w; e8 V1 M: L- p' c- x
9 cls
7 ]6 {1 Z9 `8 J' R( G清屏
+ `3 k' [& ~0 S5 i4 ~7 \10 type) C# Z8 T1 N* U7 s) @ l2 g
显示文件内容5 i4 D5 H( o# X
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
t9 q) c! \! L. }' w. dtype *.txt #显示当前目录里所有.txt文件的内容
3 B' `' h5 F+ c
) _; |. J1 P) h6 }) t11 copy! g5 P" e. N+ Z3 l. b$ j' E
拷贝文件
" q" t+ J( u- jcopy c:test.txt d:test.bak9 F& F7 a- b$ I# V- G! c
复制 c:test.txt 文件到 d: ,并重命名为 test.bak
% k+ U s2 z, N% v" y9 `copy con test.txt
. ]( O E( ]0 \* v从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
$ T6 v n6 l8 o& fcon代表屏幕,prn代表打印机,nul代表空设备
! @3 m6 p2 Z7 M. e1 ~2 G6 ucopy 1.txt + 2.txt 3.txt
8 o: ~: x9 b/ J4 [合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件# [' \ r; ?! v# \1 M0 X
如果不指定 3.txt ,则保存到 1.txt
$ f6 U0 [6 {& y; T Dcopy test.txt +
" ]6 W( M' Z/ X' L复制文件到自己,实际上是修改了文件日期7 L) P" P B9 W1 d( y& Y
* Y1 D2 e3 F$ N
12 title
2 @& t; X/ {6 L) R1 O设置cmd窗口的标题
% r( f6 o+ s) v8 }8 p: ?0 n0 ]title 新标题 #可以看到cmd窗口的标题栏变了1 ^ U/ l9 x; t
/ g) ~4 }) i2 {13 ver
9 W& o9 j a; _: t [1 \5 W显示系统版本
9 X% J, C0 y6 r# f) [/ u: Y' t+ L+ [! m. V* c
14 label 和 vol
( d6 k0 _+ I4 i- Q) t: D& I: ]设置卷标
/ V( D5 N. k- l( pvol #显示卷标
1 R3 D4 l/ g" U, H8 D- Y8 xlabel #显示卷标,同时提示输入新卷标' H- I% H$ D5 T m y2 C
label c:system #设置C盘的卷标为 system; Q$ G* f( V! f/ `1 Q' K0 C
, _+ t( ^2 M9 j5 \15 pause; D. v: F$ F2 m% j
暂停命令; L% ]- F% \5 @9 y+ R* M- t; i5 K
4 L- C- s0 y1 l0 ~+ `2 E
16 rem 和 ::
) ^% s- V; i' X/ C. Q注释命令
/ k; Q; U m1 y+ o注释行不执行操作+ {. L9 O- F* L; l* J4 {0 `# k0 u
: C9 l3 p3 h$ h/ o
17 date 和 time% Y: }, {! ^' Y, ^! v
日期和时间
5 V+ T* K) |- q; O" \& Bdate #显示当前日期,并提示输入新日期,按"回车"略过输入
" d6 }3 K' D5 H9 R' G! [date/t #只显示当前日期,不提示输入新日期
+ n8 S0 |- t; Utime #显示当前时间,并提示输入新时间,按"回车"略过输入
/ y1 i! ]( y+ {4 Htime/t #只显示当前时间,不提示输入新时间
3 R) C" |1 L) ~9 d( W' E7 d
0 E& [1 M9 v) m$ a8 D* }18 goto 和 :
9 ^' ^. |7 x) t# E跳转命令
- u5 @, p2 F3 k$ i+ n2 I:label #行首为:表示该行是标签行,标签行不执行操作! p6 _8 c" X1 o$ M
goto label #跳转到指定的标签那一行
0 O' J) U, K0 D2 d' T- E$ b% @) M. \/ X! c) S
19 find (外部命令) i# F: D! v7 O6 P5 S
查找命令
$ Q) d1 P0 x4 v6 @5 |& p; B3 Dfind "abc" c:test.txt
$ }. v1 l) d# u4 y; f. @1 ^6 e在 c:test.txt 文件里查找含 abc 字符串的行4 ]( N! w3 x$ c% {
如果找不到,将设 errorlevel 返回码为1: ~$ d# e/ O. Q, n% S
find /i “abc” c:test.txt7 y0 c1 i2 ?7 H( z1 Z# ^8 _
查找含 abc 的行,忽略大小写: O, j" q: T3 L
find /c "abc" c:test.txt
4 D+ f: a8 w& J& N+ y$ j0 P显示含 abc 的行的行数6 y; l* Z5 S; K
7 R6 K. S( }2 m6 j9 n* k& X
20 more (外部命令)
* l4 Y6 @5 @0 q4 O6 p) \逐屏显示: ]# C4 j+ M9 m" e, T1 ~1 h. d
more c:test.txt #逐屏显示 c:test.txt 的文件内容
; @& q) Q# h5 n. E! h( k; b. e. m% M) @1 y
21 tree4 d1 O" V* _" l# I* J2 [
显示目录结构
0 H$ Q3 M* ?" Z+ D; {1 otree d: #显示D盘的文件目录结构; b) j' K: |1 H( D# n, y2 s# W
" s6 c4 z! a# @$ J4 J8 I+ {% o22 &
9 `7 U/ W# j4 u" r! s2 B顺序执行多条命令,而不管命令是否执行成功4 r H6 ~5 }. ~- y5 f5 G
2 r& @0 I% Z; c7 H0 {23 &&5 l6 F1 s w8 L) L6 F: W% W6 M0 }
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
7 h+ h1 K$ t3 w0 Y1 t x& f7 }find "ok" c:test.txt && echo 成功
5 P) \* W4 G/ e3 w! w如果找到了"ok"字样,就显示"成功",找不到就不显示
' e& ?2 z+ Q# K8 l7 C3 h9 e8 R* q( b: \' s
24 ||
; y$ q* y0 o* H6 f7 N, z顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令7 Z. e/ G* I" W) u7 r
find "ok" c:test.txt || echo 不成功( v; V2 |+ S( Z3 ~
如果找不到"ok"字样,就显示"不成功",找到了就不显示5 i& M8 v. P7 f% o j% _
- S- p& Q) x' ]/ J8 O" ^25 |
& |' [. Y. b$ m# \* b! e" ]9 P管道命令& M- f9 p" L) w2 j, H0 m
dir *.* /s/a | find /c ".exe"$ v5 |; Y) N& q, Y2 s) I
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令+ B+ k3 x% j1 l5 E8 B* _
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数4 q- d' [' X ]& ^% K/ s
type c:test.txt|more, V5 V7 [# e# ?/ L( Y+ D0 V0 C
这个和 more c:test.txt 的效果是一样的
, x2 U, S! e' v4 Q! k W9 Z+ T0 N, Q* K- c* s( V
26 > 和 >>
. A; Y1 I2 c( A; F: p输出重定向命令6 ~3 _, E! t- O( P
> 清除文件中原有的内容后再写入
: _% f$ Z3 v+ W1 F' d( t$ N1 q>> 追加内容到文件末尾,而不会清除原有的内容* R" U# p) `7 P/ |! m
主要将本来显示在屏幕上的内容输出到指定文件中- L6 P$ O+ y9 h H" {+ n$ i
指定文件如果不存在,则自动生成该文件
9 @5 j9 p- P2 r: A( r8 Z0 j7 @7 U3 M) {type c:test.txt >prn# z* M! l; M, [7 c& Q
屏幕上不显示文件内容,转向输出到打印机
; u6 L7 R( R6 becho hello world>con8 j! X( C) I- b7 `! d5 j
在屏幕上显示hello world,实际上所有输出都是默认 >con 的
2 i5 h, |( K( Q; [copy c:test.txt f: >nul$ j% s0 j# p$ z; T3 l1 t
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
. u0 g* e2 m8 }; y Ccopy c:test.txt f: >nul 2>nul
/ w$ n. G, ?0 s/ |不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息! h: B6 a) f4 j J6 ?$ e
echo ^^W ^> ^W>c:test.txt
% ~6 R4 J) C8 I( I1 U生成的文件内容为 ^W > W
2 C0 F: E" e* g$ k5 ?% z5 ?^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号6 i9 R$ Q- a G _0 V- H
+ W# F4 X; U: F8 t; C* U27 <
. v, q7 O/ L4 i: p从文件中获得输入信息,而不是从屏幕上
( L5 P7 L- y. M$ _! X; V" u6 E一般用于 date time label 等需要等待输入的命令) |* g! Y2 F; t9 T; K( `
@echo off* w; f2 [0 }7 _0 k
echo 2005-05-01>temp.txt
+ R$ t: g+ m- Sdate <temp.txt
+ K/ I( X" o& r' k: @, n4 i8 U" Wdel temp.txt
3 B ` D7 L( \7 m这样就可以不等待输入直接修改当前日期& v8 J5 q5 U; a4 C6 O
" A# D! R' j& k
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*4 Z) t9 q3 T$ J, P' r4 j
命令行传递给批处理的参数$ d. u9 q0 B, |; N/ R3 _
%0 批处理文件本身: o( Q8 O: o8 Y2 w
%1 第一个参数
+ O( G M) e0 v7 p%9 第九个参数! g! m! Z* @# ?+ {
%* 从第一个参数开始的所有参数: x% c$ F( z. d3 v
批参数(%n)的替代已被增强。您可以使用以下语法:
% v3 y! P- U7 C: Z%~1 - 删除引号(" ), 扩充 %10 O/ F! a" v' L% F. `" s8 z- l
%~f1 - 将 %1 扩充到一个完全合格的路径名
$ q2 F8 D' }# A& f# G' D%~d1 - 仅将 %1 扩充到一个驱动器号! H: m% B$ z! A U) Y; i" X
%~p1 - 仅将 %1 扩充到一个路径
1 c. p: ?+ m( C9 ~( G% P%~n1 - 仅将 %1 扩充到一个文件名0 g1 a! U. Q3 @ a* _2 {
%~x1 - 仅将 %1 扩充到一个文件扩展名
6 U7 G4 M5 J5 W%~s1 - 扩充的路径指含有短名7 n. h5 C* s; ~+ H
%~a1 - 将 %1 扩充到文件属性! L2 b- ]5 v& N
%~t1 - 将 %1 扩充到文件的日期/时间
, G) c! r: m% P9 }: t%~z1 - 将 %1 扩充到文件的大小6 C" ^1 n/ E9 y8 p
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
( E ~* @+ \, p8 J扩充到找到的第一个完全合格的名称。如果环境
# |+ W; R3 j; o: W变量名未被定义,或者没有找到文件,此组合键会. H+ b9 W8 X# J- w5 E* o* {! r
扩充到空字符串
0 I$ z; f+ S; b4 S# y# t# \- L6 f3 a可以组合修定符来取得多重结果:
1 _# G1 Q& b# m, ?2 B+ e: ]$ N( R$ ~%~dp1 - 只将 %1 扩展到驱动器号和路径0 t* @4 z2 c7 g7 P; ^0 b/ X
%~nx1 - 只将 %1 扩展到文件名和扩展名
& V5 K5 @+ C6 k. R+ x' E& K%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
( w7 n7 ~# `! L并扩展到找到的第一个文件的驱动器号和路径。
' t2 B/ X1 I1 {" D" {. f- r%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
- `% v# ^$ C& {1 Y可以参照 call/? 或 for/? 看出每个参数的含意, p2 z8 V& o7 |6 z/ T
echo load "%%1" "%%2">c:test.txt
* W8 N) x W+ U( r9 d' o8 ]/ o! E生成的文件内容为 load "%1" "%2"
) k; ^2 y9 b, g8 R批处理文件里,用这个格式把命令行参数输出到文件9 k: L& {+ a; y
5 [+ n4 g0 d* Y& I2 F6 }29 if7 R* d D$ @$ L4 u, H: \; q1 R9 l. s
判断命令
! |( ~9 P7 U Iif "%1"=="/a" echo 第一个参数是/a6 r" y0 `! C) h, q w: _
if /i "%1" equ "/a" echo 第一个参数是/a) b3 Y$ |1 r8 C7 B3 R. H% ~
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
% D$ @) d* k7 B/ n; w9 h5 a yif exist c:test.bat echo 存在c:test.bat文件
* X; g: F. H8 @# l3 {if not exist c:windows (4 H' V; |1 _- H3 C
echo 不存在c:windows文件夹/ D1 d) b ^/ ~
): ]: f1 m; q2 p5 k6 E
if exist c:test.bat (
4 D* r+ _/ G+ d6 H2 Uecho 存在c:test.bat
n, O) Z& a$ e' M, ~4 X) else (6 G5 I ?% Y+ g
echo 不存在c:test.bat
: j! ~& U6 G; l$ Z3 W3 y# A)
) P& F6 W; `9 q/ a: D30 setlocal 和 endlocal- w+ w, l) j6 e6 m3 L7 N$ H
设置”命令扩展名”和”延缓环境变量扩充”5 N3 Z1 U; Q& t v/ M; B
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
3 _5 e Z3 [" k9 ?% ?SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
1 S6 ^2 l/ O% w* M3 eSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"4 T/ A6 Y! O/ _6 M, X9 y
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
' x3 w2 f& I) u+ ]3 O- {ENDLOCAL #恢复到使用SETLOCAL语句以前的状态
" o/ t& x4 Q7 {( l( A$ c“命令扩展名”默认为启用
4 `# ]0 V. L4 R% e6 }0 p' E+ m“延缓环境变量扩充”默认为停用
f, Q( [9 @) ?# Y, Q/ S( Z批处理结束系统会自动恢复默认值
5 t! p% M+ v( {: U& S8 J* B5 }可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程9 d6 v4 L; j" r
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
5 z8 M4 R7 H' s J8 t9 |) }2 o4 z保程序能在其它系统上正确运行: Y: o" t2 n+ {/ j6 Q3 X, y" R
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程: V: A: d; M. f1 t% W
c/ o# T f: y! Z" A/ s5 G
31 set: r) v; c% t* j0 I1 u0 z8 W
设置变量
% [! ?: J: t4 v2 R% P5 Q引用变量可在变量名前后加 % ,即 %变量名%
# x E' S4 e, P/ _( @set #显示目前所有可用的变量,包括系统变量和自定义的变量
$ w. @# \7 e- N( ^/ {, \echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用$ A( F* b" X3 A/ S% {, d) m# {. y5 ]
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
8 c: H7 u3 o) Qset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2/ M0 b* c" |3 A: I# O5 U9 C
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2+ a- e% X) ?( L* o. C
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
: A( d( |2 j. y: W* xecho %p:~6,3% #显示第6个字符以后的3个字符,即aa2
% `3 ~0 q1 V# x8 K7 @0 [0 _" s7 Y3 f' eecho %p:~0,3% #显示前3个字符,即aa1
+ `, y8 [4 O/ Z1 lecho %p:~-2% #显示最后面的2个字符,即b2
. w, V' x2 {( B6 x1 ^echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
; a' M. h0 P7 Q u, J$ decho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2# E, J g) c+ C6 j2 K5 }5 H
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
' Q4 f3 t/ n* [( L9 j* g. L/ f% g7 b) |echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
1 @8 Q$ C% T3 D' Pset p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb23 P: R; o( v- f* r* n3 V/ H# y8 L
set /a p=39 #设置p为数值型变量,值为39- P4 ^; U$ ?# z2 D5 t% V
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
6 L! F2 v! {, ?4 g: Mset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
" R2 ~0 p* W0 H7 A& w5 aset /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?! x5 N+ A2 R- i0 _( Z3 D9 z
set p= #取消p变量" f. p9 o! b+ o7 J
set /p p=请输入
* o! d9 F' x! [1 {5 I. X/ r" [屏幕上显示”请输入”,并会将输入的字符串赋值给变量p1 f- _ ~9 B: X) h8 U3 o
注意这条可以用来取代 choice 命令
6 x+ p8 f, l- P/ _3 k; w: ~" E& b注意变量在 if 和 for 的复合语句里是一次性全部替换的,如. y5 l7 j. h1 r( B# w; v, M: G
@echo off" c# _/ }' O, r' ]+ U" w
set p=aaa3 h( L O( n& @- t6 Z8 U8 q d2 U' ]0 v
if %p%==aaa () G$ J' n2 I7 A5 D
echo %p%
& O' e/ G# y; jset p=bbb0 p$ U5 G! M4 o c+ n# O
echo %p%% v0 Y; L8 l" C
)7 C2 e1 p5 k3 E3 }; s/ _
结果将显示, W& m% ^% L& _ j
aaa
7 o M6 J6 U) O W/ y Caaa7 S3 C5 F$ P* r T
因为在读取 if 语句时已经将所有 %p% 替换为aaa: a( D% ~$ q8 f# Q. H$ D+ l
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
# N; L! E" N/ u1 w9 W9 G4 Y+ r4 `可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
3 f* X( i8 g3 ^! M: F" T@echo off, T; X6 }# @2 s9 N$ |0 Q
SETLOCAL ENABLEDELAYEDEXPANSION
6 j& f3 k) N' r4 Pset p=aaa
! q d5 M1 \( \! ?! t% l6 jif %p%==aaa (8 `# ~$ C, V9 K; `1 x
echo %p%
4 g/ ~0 E( D& i+ i5 B" bset p=bbb
( f7 J- B: @" W! ^. n( W8 F) eecho !p!
0 y6 @! |; V( x! H+ \/ k7 a1 E)7 i2 X! Q* N7 ^8 ]1 q4 F& j2 s# k5 W
ENDLOCAL
0 k' E3 z- E7 N$ b6 s% y结果将显示
1 f4 X% ^. g8 W6 qaaa
* N7 e* Y8 ?7 V$ Y" X! Bbbb2 {, |8 X& h, |. V7 i" o6 U
还有几个动态变量,运行 set 看不到5 d; m& J1 U _' a. ?" n5 J
%CD% #代表当前目录的字符串
% z& V0 K9 @) C9 t3 Y% N1 ~9 G%DATE% #当前日期& q" R" V, K; r
%TIME% #当前时间2 o! m e$ q/ b" {3 b
%RANDOM% #随机整数,介于0~32767/ v- R% v* I- l, g
%ERRORLEVEL% #当前 ERRORLEVEL 值2 w5 `3 G$ F, l% @: B6 B
%CMDEXTVERSION% #当前命令处理器扩展名版本号3 T1 e# Y1 x" y$ Q7 T7 B
%CMDCMDLINE% #调用命令处理器的原始命令行
S# s: Q: i I: d2 e4 b! T- S可以用echo命令查看每个变量值,如 echo %time%
4 Q$ } B- f& q6 E. M3 @注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到2 N, y j! A2 t; g' ^. T% d
9 C0 U! R* |6 K
32 start7 B. h1 D4 V( Q6 t) F
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令5 L7 a& v8 N8 M7 T" a' q
! j% n4 \6 w9 G9 q33 call
4 f7 k" t8 C% a$ Y: Z8 t批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
/ h8 h- O! k) t q* R5 q有时有的应用程序用start调用出错的,也可以call调用) D2 Q4 k3 G1 c: C6 p: [
& r; w8 H% h& O" C! n1 j
34 choice (外部命令)+ `6 ]' c* }% A# o
选择命令- E+ j: g/ t- I \7 O
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……" l' C6 D* D# I, j6 j
win98里是choice.com
" V! u; H+ M$ cwin2000pro里没有,可以从win98里拷过来
* j0 q4 o% d1 u& K6 H/ f( A" A2 Wwin2003里是choice.exe
/ o/ Z7 { ?! {9 \) Hchoice /N /C y /T 5 /D y>nul1 K2 W1 }$ O+ }) L
延时5秒
4 @* ?4 g+ ~. G4 r4 H9 i" w$ h" E5 L- h! P( n6 L! R+ L( [
35 assoc 和 ftype
& x" Z4 u$ H! c4 E文件关联& R! ] p* P+ |
assoc 设置'文件扩展名'关联,关联到'文件类型') d# t7 t9 C4 f$ C4 x; ]$ `% y
ftype 设置'文件类型'关联,关联到'执行程序和参数'
& ~! E& r5 p- G% D4 U# E当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
5 X- e' Z3 ]' X8 b* ~8 f而是先判断.txt属于 txtfile '文件类型'+ v- X6 }: B( f; X/ Q2 V [
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1& l+ P& X. v2 L' }3 b$ F
可以在"文件夹选项"→"文件类型"里修改这2种关联
) h" q, L* ^" [8 ?9 ^7 Bassoc #显示所有'文件扩展名'关联
/ g4 X' k" y& U% J: N3 Hassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
2 G* E' m B: X- s2 s( \. gassoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
/ f: k) s& F5 _2 a# E8 B- Massoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
5 {. A: `. u7 j" Oftype #显示所有'文件类型'关联
" P+ y# N( w6 W8 ]3 L zftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*" u: |- H# W7 ]- g3 n9 ]- o5 |0 ~
assoc .txt=Word.Document.81 r5 l- U! I! s: G9 I8 A5 S
设置.txt为word类型的文档,可以看到.txt文件的图标都变了5 ]" Q0 ]' Y: I v; A
assoc .txt=txtfile
; k% q+ ^* |0 U0 t5 y恢复.txt的正确关联9 ~! E5 K) T& \& N5 d1 ]# W% I! s/ Q
ftype exefile="%1" %*
" E" S9 U, U2 Q6 Y2 _9 o* K" x' r恢复 exefile 的正确关联$ J+ r$ y4 b& I- G- f9 n! } K8 S
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令0 l1 n' E; ^: q: b0 M$ M
% M6 o, U7 s& M% C# d0 d: c/ P36 pushd 和 popd2 Y! e# d4 I( H
切换当前目录8 T% H1 @( y6 e
@echo off4 j8 w8 d. p4 v$ d
c: & cd & md mp3 #在 C: 建立 mp3 文件夹* j9 c. G/ R1 y* o
md d:mp4 #在 D: 建立 mp4 文件夹
% G5 T: W C! k$ xcd /d d:mp4 #更改当前目录为 d:mp4
; F/ B2 \" C' n* `8 }pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
0 c7 v! W/ {. E) Spopd #恢复当前目录为刚才保存的 d:mp4
+ m2 U/ h9 N5 u" N0 i6 x
1 g. l3 A6 D: f7 `37 for
9 u& n0 b9 d4 J1 s循环命令
f; f2 C5 W# n5 D$ t& q% O+ U这个比较复杂,请对照 for/? 来看. y8 y ]8 x( w
for %%i in (c: d: e: f do echo %%i
+ R) g9 k9 z5 ^) @& G依次调用小括号里的每个字符串,执行 do 后面的命令! d+ E& Q+ s( c a# M
注意%%i,在批处理中 for 语句调用参数用2个%
( p3 m+ a* R% b0 {" C, K默认的字符串分隔符是"空格键","Tab键","回车键") S! w8 C- [/ L7 ~8 s. k9 c k, B
for %%i in (*.txt) do find "abc" %%i: x( K4 F- g2 M9 ]) ~# A# w! D
对当前目录里所有的txt文件执行 find 命令
5 h! ]5 z$ i5 `for /r . %%i in (*.txt) do find "abc" %%i( [' n! S+ `1 u
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行5 N7 u5 K, W: q- k5 a& X! ?. V6 Y
for /r . %%i in (.) do echo %%~pni: m6 x5 f$ g' H' t r$ e- V9 h
显示当前目录名和所有子目录名,包括路径,不包括盘符2 ~, Z. @, b- D2 _' {+ i% w
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
) _8 L7 i+ Q5 @/ w! ^把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
1 f6 p, r, Y8 i- _) ifor /l %%i in (2,1,8) do echo %%i
# g1 H) h5 e B) I) ]生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
5 k8 ]% G" R# L: F: J' wfor /f %%i in ('set') do echo %%i
' w L' a% Y- `对 set 命令的输出结果循环调用,每行一个1 E; D- j0 B1 P
for /f "eol=P" %%i in ('set') do echo %%i7 }* j4 ^- B' p" B$ o8 c
取 set 命令的输出结果,忽略以 P 开头的那几行
. ~( \4 I" M& V5 f1 kfor /f %%i in (d:mp3.txt) do echo %%i4 I2 E8 h" C- }) [
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
- P2 a% H4 K$ \for /f "delims=" %%i in (d:mp3.txt) do echo %%i7 j3 b l: ~3 I5 ^" ~3 i$ U
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称/ \$ {6 K: u' E+ @
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a9 u4 f; C2 p7 j8 H
对 dir 命令的结果,跳过前面5行,余下的每行取第4列2 n6 u! N7 B' ?: `. X) |
每列之间的分隔符为默认的"空格" p: W7 q. ]) g
可以注意到 dir 命令输出的前5行是没有文件名的
5 z. H, K5 x4 z4 Xfor /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
9 m0 b' x X& P7 g Gecho %%a2 `! E4 o' S# e
echo %%b
( q: m* M0 Y; j% W z. \echo %%c
/ B2 a8 M& w! a+ c)) q% o1 X* B) z; R& \. H1 n! u6 y
对 date /t 的输出结果,每行取1、2、3列
& K T, K$ E( h第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列. Y' t$ s! I, r$ |& n4 c) a
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"% T( v8 ? |' D& L" Q. z* H
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的! u" z; E, u1 a9 ^7 _# z
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
3 f( e+ d2 `" L1 h1 [取第2列给 %%a ,其后的列都给 %%b
' b+ v9 ]1 G; y) G' K. @, ?/ X5 d; s7 T5 G
38 subst (外部命令): F' y! N8 O7 Y% Y7 Y% @1 s
映射磁盘。% v7 e; {) \3 p$ Q
subst z: serverd #这样输入z:就可以访问serverd了 P$ A. |# s! ]5 R2 W
subst z: /d #取消该映射1 L' B3 F& x/ V( Q, Y% ]& g
subst #显示目前所有的映时6 S1 X& ?0 _6 Y2 y5 f7 R
+ p( B/ D# x: m1 e7 h, H4 @- y
39 xcopy (外部命令)
0 l: }4 F7 H' K+ ]3 ^# m文件拷贝& C0 p6 o! U4 Q
xcopy d:mp3 e:mp3 /s/e/i/y n( @6 P( A, R2 ^" U/ B9 j% F
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件7 e- b& C+ Q- O* D0 c. L
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
/ X; X& T+ q+ R8 x; P% O- ^" Z0 u/ F$ }, S( o
常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
$ V1 W. ^5 u8 ^4 H* g4 w- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:
+ M& B- O4 V- t I
; I4 _5 i/ l9 f1 x, C* v* L) v1 n$ s
@echo off
, J. {( o8 P7 G3 W! P6 \# S( dset p=aaa# b1 Z& p& k" N2 r- m
if %p%==aaa (7 g- y3 J& `! e
echo %p%: |3 }% S0 T3 a$ q. P) L5 E
set p=bbb" w5 w3 H: X6 j7 z
echo %p%. i: x% z0 l/ `
)
5 `5 n: Z4 y hpause
2 E( k8 K3 G" c0 S |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
|