|
|
发表于 2021-6-25 19:48:12
|
查看: 2245 |
回复: 0
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!
$ [# K' @4 K1 I0 e9 F! @ 前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效/ ?# f& q m/ D$ v$ B T
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展8 ~8 y* M* @" s
名为bat 目前比较常见 的批处理包含两类: + ]# a5 _( ?$ e" V% @ `# E' Y
- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理' s! y* B# Q9 ?! f4 y9 \/ m
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
/ v7 ^( b3 v( h' Q5 q- _! x6 f" H命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件 5 P: b0 ~: I# a. t: b% E4 [& v
怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
$ f( P0 s5 G/ o. I6 S: ] 批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set4 s. ^1 ?' R4 c3 P2 I. C5 k6 L3 r
批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||
* G3 q/ H, k! w+ a7 W4 E 常用DOS命令- 文件夹管理:* C# h# e6 y2 W1 B1 [
- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。
; {* y8 J9 E$ l- n* i) D' ^2 o& d% D
- 文件管理:
# Z" X, ~0 O9 P8 K2 U% E- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同
3 z8 l- M4 [! x# Y5 ?4 E7 _
- 网络命令:
( R" _. @* i3 f" X, I- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表
1 w# U6 Z% M+ `/ l
- 系统管理:
) U4 Z. X- o8 l7 ?: A+ g6 o$ v- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置
: p- w: F0 x9 z% k" a1 _+ ^# ~9 k2 i & v4 {1 `# t; J$ g) ]; @- X* Y4 j j
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
) t+ B/ T- x* W F; m& v& ^1 ?
8 Y. p# [$ s/ I$ ?Windows Batch 常用命令# y4 w. Q. Y( L+ O- v
1 echo 和 @6 c0 z/ }+ _7 z+ J! K( _
回显命令" V$ P P. N* C
@ #关闭单行回显5 a0 Y6 V! w+ c
echo off #从下一行开始关闭回显# K" O; m0 t8 x( N v' o
@echo off #从本行开始关闭回显。一般批处理第一行都是这个# f6 ]! \& N( }. S, m
echo on #从下一行开始打开回显( l: {$ N9 i- w) \3 D* \8 w2 t- ]
echo #显示当前是 echo off 状态还是 echo on 状态
& M; q5 [9 n' _1 d3 P& Qecho. #输出一个”回车换行”,空白行
. a$ j9 t# z% ^" X: c# U& ]9 b#(同echo, echo; echo+ echo[ echo] echo/ echo)/ X, H }( D8 |4 v4 V4 n! ]
# o0 x6 O9 S- c6 v& k2 errorlevel
9 V5 t d$ F) |5 G) e9 h# yecho %errorlevel%, p, M* r1 F3 R2 A# s
每个命令运行结束,可以用这个命令行格式查看返回码2 U7 ?4 Z, \+ D: E
默认值为0,一般命令执行出错会设 errorlevel 为1
; W9 @! j6 [7 h( t& Z! l6 u) T+ T+ ?' S9 E$ j0 \" B7 m
3 dir" O" c$ Q& p+ W( U$ G, {# b: I
显示文件夹内容- j& z, _$ P% z; V" z8 k- n
dir #显示当前目录中的文件和子目录" H8 H ]1 I, B4 |. r7 K# w% [, Z
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件& Q; {9 s8 E8 z
dir c: /a:d #显示 C 盘当前目录中的目录
0 }% C) E/ |# t/ H1 m& O4 Sdir c: /a:-d #显示 C 盘根目录中的文件' X9 _& o+ j5 T- C9 g1 i; b9 R' T
dir c: /b/p #/b只显示文件名,/p分页显示
: C! q# J8 b8 F/ A% ndir *.exe /s #显示当前目录和子目录里所有的.exe文件+ S" m, _4 R9 n1 s+ l
5 H% H9 W; m3 h3 _' \1 e
4 cd) L' z% o+ z0 y: @ a
切换目录( N' O* q3 J7 }. _' `/ e! c
cd #进入根目录: {) {1 V, p Z2 l4 t
cd #显示当前目录
4 K1 k, T9 W" ~5 X/ K/ Rcd /d d:sdk #可以同时更改盘符和目录9 d* s6 n2 p: m8 {
; v0 ]8 g. g' z5 md
1 r1 [9 | q+ w4 o5 n创建目录
2 z3 r0 h# j/ [) W9 I$ H7 a8 Qmd d:abc #如果 d:a 不存在,将会自动创建中级目录
4 D( g1 a1 i- j# U#如果命令扩展名被停用,则需要键入 mkdir abc
3 ?2 r# g& H: V# c' o7 A6 y( l% s
$ _. Q O8 i8 S/ l& W0 b. Z" q6 rd/ K" B; _2 @7 e# q; @( M7 y; J/ [
删除目录$ p% K7 C8 t( ` j+ d
rd abc #删除当前目录里的 abc 子目录,要求为空目录0 q5 r& D/ Q. w1 s
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
Q: u/ B' T, \
5 N9 |2 b/ k2 |4 Z! S7 del
1 l5 A, X% {' b' K4 g删除文件
; m. y3 @. O1 V% \: |, Q! sdel d:test.txt #删除指定文件,不能是隐藏、系统、只读文件9 V0 Z4 l- Q/ N7 t$ p
del /q/a/f d:temp*.*
9 }* `+ h; Q: G' \删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
" `' {" [, W% _5 kdel /q/a/f/s d:temp*.*0 ]+ Q; b: D! {# v
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
5 f. ~) I C( }
4 I2 Z4 P! s' e0 Z. D" v1 L8 ren
. k }4 {# ?3 T" U+ h* ~重命名命令* M# r% O6 q1 G a. K* ~
ren d:temp tmp #支持对文件夹的重命名2 e3 V) {0 T4 P1 t' ~" a# P
! n N/ G- B* e& C: V$ u
9 cls0 g6 `+ Z" F3 X3 V" {
清屏. O5 o2 j2 N. b/ d8 C! J9 R( `& W$ w
10 type
0 h6 {! X' k$ l3 M8 T+ d9 Q# \显示文件内容
O5 C, K- V/ t9 q1 @( P2 Wtype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
" A7 E, j( Y. V+ H1 W: v( Ctype *.txt #显示当前目录里所有.txt文件的内容
$ j, ^ \5 ]/ B [' D" S
( ^, G# ~3 w; {9 I3 b/ \11 copy4 L( H0 x( w; E
拷贝文件9 V) T1 J$ i- A+ v$ w0 @' u
copy c:test.txt d:test.bak h. X& @5 Z; a) w
复制 c:test.txt 文件到 d: ,并重命名为 test.bak, a. z8 b5 s2 J; W1 q6 _" D. M
copy con test.txt3 l$ p1 I; K0 T. I
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件6 L, x' [. g9 c9 [5 E
con代表屏幕,prn代表打印机,nul代表空设备* G. o. O6 b* V! r! P
copy 1.txt + 2.txt 3.txt: i( b1 e* c5 d* \3 N0 z6 u
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件6 K" m' @/ V( }4 p
如果不指定 3.txt ,则保存到 1.txt+ Y3 K7 r( [; ?" Y
copy test.txt +& `! r- s3 t# j% P+ y
复制文件到自己,实际上是修改了文件日期
+ @* J5 j0 Z! ^. N' O2 t9 g' k r! `' B$ u0 v* n( l; _/ S
12 title
* I) v [3 A5 H6 B2 n设置cmd窗口的标题' \& W4 e3 c" N4 T$ J/ B% D
title 新标题 #可以看到cmd窗口的标题栏变了 [" a1 P+ U' M
7 K2 Z/ O, U( f ~
13 ver: k& M2 F, d2 m0 n6 T9 R, M/ k
显示系统版本# I. c8 |, ^$ s
% o* v( G( d9 h, X14 label 和 vol
' t ^1 f. s9 b4 X# N设置卷标 d! ^. A6 b( D! {
vol #显示卷标& Q& V2 e9 W* u u1 D- c
label #显示卷标,同时提示输入新卷标; U6 `% }5 x3 Z) V8 F2 h
label c:system #设置C盘的卷标为 system; ~; X$ x3 e2 ?: i h. F' C
% E5 ]5 W1 Z4 a- v8 I# x6 A15 pause
0 C: s0 I* U8 k' n1 s暂停命令# H# [ P# {6 s+ e" @+ Q) ]
" g) S$ `% a" h$ x& Z/ N
16 rem 和 ::
. x+ ]; r& I( N1 h: Y) ~注释命令& j+ F, M4 D( ^5 N( J0 E7 U& {( Y
注释行不执行操作) u) d6 G( ~) w5 j# K0 u" y
- H6 B$ Z+ C' @. _* |17 date 和 time9 m/ X* Z" g: m1 D3 l6 {, ?
日期和时间6 v2 b) D7 ~" Q) W! F: W
date #显示当前日期,并提示输入新日期,按"回车"略过输入
* _* Q! x% O2 `" N+ h5 t7 |7 Edate/t #只显示当前日期,不提示输入新日期
3 ]0 N/ @- `5 L' L! { Y4 Htime #显示当前时间,并提示输入新时间,按"回车"略过输入% Y2 o* Q3 c0 g7 } Q6 [
time/t #只显示当前时间,不提示输入新时间
8 H! q) }/ U4 N! V7 [! @' m8 |% V: y+ d" v( Y: d! |
18 goto 和 :& k! ]2 H$ ?# @ ?) j
跳转命令
+ Y, J! B1 d0 A' N% d; p) g:label #行首为:表示该行是标签行,标签行不执行操作
7 [/ M9 e) Q" V Q) dgoto label #跳转到指定的标签那一行2 I% m7 D' {% @& ~2 {- e" q, Q% {
* ]+ h/ ^- J% q, P
19 find (外部命令)
, Q$ K1 C" K4 S2 a' t8 R+ E6 `查找命令
0 W4 ~ K" C* h0 W1 O, ofind "abc" c:test.txt9 ]- A8 ]5 K8 t# T9 S
在 c:test.txt 文件里查找含 abc 字符串的行
2 \% u8 r5 G, t2 _如果找不到,将设 errorlevel 返回码为15 M1 o) w' `5 N1 h f
find /i “abc” c:test.txt7 t; U |) F' X7 z
查找含 abc 的行,忽略大小写
- z8 Y1 m- D% Y8 a$ jfind /c "abc" c:test.txt
6 J& z: v- O/ g8 { I. ]( z9 O显示含 abc 的行的行数" m) E. l) q9 O1 t& `
- \# O! D/ m- g4 C3 H20 more (外部命令)
* }& G% U7 O) V) W8 k8 u逐屏显示
9 ~3 g4 H2 P& H7 Q3 Xmore c:test.txt #逐屏显示 c:test.txt 的文件内容
9 R+ y5 Z6 I" D* @' Z5 P
4 d# Z" w) }6 }0 w21 tree
3 V) f. R: Q/ ^# @; B显示目录结构
. ^5 ?. J5 g- N0 k/ s" xtree d: #显示D盘的文件目录结构
1 c7 O0 }7 V2 C3 [! [6 D& E8 a- o' ?
22 &9 b2 }/ ^6 C5 y2 g: k5 D5 X
顺序执行多条命令,而不管命令是否执行成功$ g0 P+ B, _ Y
% |' P5 D: x1 w7 i0 D, z8 v6 r3 C" F% D0 y
23 &&- }# t' {* R7 X: @ r: K4 I
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
0 K ?6 X5 u6 I9 B% c- Qfind "ok" c:test.txt && echo 成功
/ ~3 }, q5 M4 b: _& t$ e: F& ?$ h如果找到了"ok"字样,就显示"成功",找不到就不显示
$ Y! _2 O9 L. t$ R0 T2 D" t9 g
3 K/ } S) e$ |5 [24 ||0 C# A5 S7 Z0 ?, ]( a1 k
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
/ S ^2 V+ m, }8 K' F( A; wfind "ok" c:test.txt || echo 不成功
& v! q3 q- j$ A/ l) D; N2 N如果找不到"ok"字样,就显示"不成功",找到了就不显示
' ]" O, L: D9 b3 I/ x: `
3 V7 H! @9 V( Q! C25 |; L# D# b; G) h! ]: m' P% E. l. O
管道命令
7 w8 A* q9 h, d! u z8 _4 udir *.* /s/a | find /c ".exe"* c& l# l8 }! e1 @
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
2 b: w& s3 U5 }( p# u% H2 V; Y8 e该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
, _+ d( m1 ^5 H% ^type c:test.txt|more
0 V& U, ]- \" K这个和 more c:test.txt 的效果是一样的# }% V- j, j/ z9 h% g/ w. `
' N3 Q/ l5 A' f8 p1 M
26 > 和 >>
% I# h0 u7 S7 F" {0 j4 o% H# k输出重定向命令 W* I, J; J0 T2 R* m, H% e
> 清除文件中原有的内容后再写入' D# o. m8 H Z$ E1 I* d
>> 追加内容到文件末尾,而不会清除原有的内容
) A) P. {5 ?5 e8 d主要将本来显示在屏幕上的内容输出到指定文件中
: I4 \2 [1 c3 Q! g* c指定文件如果不存在,则自动生成该文件
+ Z5 H' H9 b! N7 m! x3 B' ktype c:test.txt >prn* T/ @. j. j. f3 {, c) R+ E
屏幕上不显示文件内容,转向输出到打印机$ S) w4 ^+ d( b: @
echo hello world>con2 P) @6 D8 C0 @! [5 d( E+ m
在屏幕上显示hello world,实际上所有输出都是默认 >con 的
! k' b: d5 q# G: _% k$ ?% p. mcopy c:test.txt f: >nul# N# c& B5 i3 \" o
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息9 g7 W S" s1 @$ p g/ r
copy c:test.txt f: >nul 2>nul
$ z5 k/ U3 S2 g( a, R! z% B' b) v( l不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息# ~: H& o/ _' h2 Y/ s$ n1 D+ u
echo ^^W ^> ^W>c:test.txt6 i. p0 S z* e$ S/ o
生成的文件内容为 ^W > W C' @% y" V& [: @2 j1 i0 F
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号/ }0 U* ]9 m! N/ G9 Y
6 c2 h) u; [ p- _27 <
7 }3 [/ d9 k$ G. o* o从文件中获得输入信息,而不是从屏幕上0 ^7 o- N9 [. v9 @! V( `
一般用于 date time label 等需要等待输入的命令
: l2 L# d6 m) V# [* B: o@echo off
9 v/ \7 ?! F2 {4 j2 i8 p. ^/ becho 2005-05-01>temp.txt
8 c. B3 X0 R) p; \) n1 S- [date <temp.txt, U/ O5 J" [2 c, s8 \6 B1 d
del temp.txt6 |! K9 d) s9 ~! n" l5 \2 E
这样就可以不等待输入直接修改当前日期5 O+ o. t9 C5 L
. K, l* Y: y* Z/ @) K0 N- u( u' L% a28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
5 d) g' v5 ^4 A5 x命令行传递给批处理的参数
8 b- @1 x% P% ]0 k$ p6 `: i0 ?; X5 w. L%0 批处理文件本身* H/ @& `3 x# }8 E. O8 |$ X+ Z
%1 第一个参数
& b% k# w* {# E) J$ Y% p1 C%9 第九个参数
/ m; X; {, B6 A' ]%* 从第一个参数开始的所有参数1 H; s$ y. F& [* e2 ]2 b
批参数(%n)的替代已被增强。您可以使用以下语法: W! f+ G2 l; W4 X1 [7 T
%~1 - 删除引号(" ), 扩充 %1
9 G; Y9 z5 [6 s4 R+ R5 e%~f1 - 将 %1 扩充到一个完全合格的路径名
$ W- S+ G- O$ o( C%~d1 - 仅将 %1 扩充到一个驱动器号 F& c! Z9 H% z+ V. }
%~p1 - 仅将 %1 扩充到一个路径! H2 Y( s0 @) i: g# Q8 n, T
%~n1 - 仅将 %1 扩充到一个文件名
+ b7 x1 g( k; ?7 R1 Z%~x1 - 仅将 %1 扩充到一个文件扩展名2 r5 O9 r3 X/ S- v* C% v; r
%~s1 - 扩充的路径指含有短名
8 s, J6 {1 A* X( i) }1 z%~a1 - 将 %1 扩充到文件属性% M: L) n1 ]: d2 S0 O* f& k
%~t1 - 将 %1 扩充到文件的日期/时间, @3 F( b; G. h: o
%~z1 - 将 %1 扩充到文件的大小
a% r: P5 \1 k8 x$ L9 Z' y& A7 M%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %14 |8 \1 j4 Z% Z" B; c Y( H
扩充到找到的第一个完全合格的名称。如果环境$ k& [9 z" m* k: Q: m+ b+ [& Z
变量名未被定义,或者没有找到文件,此组合键会* |: v! L3 h8 S# S
扩充到空字符串
3 X+ ]% N# h- S: y; v可以组合修定符来取得多重结果:/ u: K7 p, ^+ R) V' y& M
%~dp1 - 只将 %1 扩展到驱动器号和路径& O% E1 g9 S3 \/ f! M# K5 I5 z
%~nx1 - 只将 %1 扩展到文件名和扩展名 ^- L# ~) f' G' K; b$ r/ m! U
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,; `& N) W; B9 R3 \, z. E/ S$ ?
并扩展到找到的第一个文件的驱动器号和路径。4 t# u8 y4 D/ V
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
, q1 p0 W& f: K. Y可以参照 call/? 或 for/? 看出每个参数的含意0 D8 E7 O; t$ i! J5 T
echo load "%%1" "%%2">c:test.txt
/ x4 e+ s' H& M' P& T" i生成的文件内容为 load "%1" "%2" f+ G8 j$ U- ]& `4 p. ]/ I
批处理文件里,用这个格式把命令行参数输出到文件
9 L* e) a9 Y' y+ f: D$ f- j( j! w; x% y3 t; i" D
29 if
: @; ?( o! s; d/ p判断命令4 L1 \/ d9 [" W% @, e2 w5 z' h+ m
if "%1"=="/a" echo 第一个参数是/a/ d" u8 {& Y$ k; I
if /i "%1" equ "/a" echo 第一个参数是/a: i) y c8 Z6 R0 i# E
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
/ G G P4 F4 y* r) c' Sif exist c:test.bat echo 存在c:test.bat文件
4 c- t* l& ?/ w+ P# V$ Dif not exist c:windows (
7 l/ Q. ~: l2 E. g! w, _- f- |! ?0 X6 necho 不存在c:windows文件夹
3 E3 z1 [2 L2 O1 K/ ~)! i/ I( R/ U j( s3 K
if exist c:test.bat (4 D! @- d* M5 w) z- z9 \
echo 存在c:test.bat
) v8 r7 h9 V0 G, m4 m2 _3 c7 w) else (
- ]1 l+ i- |7 L- v3 x' qecho 不存在c:test.bat3 v! i7 T2 F& j) S, z
)3 \ ~* K% S- c9 {2 r
30 setlocal 和 endlocal! P0 H/ _% g" k; T
设置”命令扩展名”和”延缓环境变量扩充”
- J$ l% r9 Q% x! h% vSETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
4 h" f& h+ T/ ^! a: ~SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"1 n7 w; c# w$ V
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
' l5 A, k+ u$ rSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充". @2 H! \% J" M4 J
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态, }3 R. T4 [. U2 \/ m6 Y$ b
“命令扩展名”默认为启用
! `/ L4 a6 O T4 E; f4 N“延缓环境变量扩充”默认为停用2 D; H% n1 q2 d3 @' A" a1 w5 O
批处理结束系统会自动恢复默认值
8 R0 R1 s# ^! U4 f可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程5 `' Q/ k; n* p& [' z F
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
) {8 Y, w8 g1 v5 W/ h5 ]7 |保程序能在其它系统上正确运行' p+ |9 R1 t6 P C
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程/ x& [) P; g @
9 R* V7 W m* W: y! B4 L8 t& e31 set: l8 e3 i+ P4 A/ Q0 E
设置变量
" w$ m8 ?% U, G' P! ~8 r2 a引用变量可在变量名前后加 % ,即 %变量名%1 }: P8 h6 ? C7 z
set #显示目前所有可用的变量,包括系统变量和自定义的变量/ y+ ~$ b! ~( M$ |& a; m
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
! Y2 V! E0 d P# Jset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1: K4 Z" U$ i. Y+ A, i; @! C: f
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2' Q& c8 F9 w: |. N9 T
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
/ y* g' a& C$ B% _: Pecho %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2# o/ S/ F; v ?. j; [! b7 c6 F5 \
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2
: T O1 Q0 n: f4 A) }echo %p:~0,3% #显示前3个字符,即aa1" D9 T# X5 Y1 m3 E, U/ G
echo %p:~-2% #显示最后面的2个字符,即b2
( L; |+ T% S# Hecho %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b6 n: [+ Z4 G% L# Y4 p8 F# c
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb25 e* t' x- Q4 m. M7 p
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
& Q0 M! ^: d6 g7 Qecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2, l3 k- P' ]2 i" p
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
0 B. w) k( W# N( K8 y+ ]1 d) Aset /a p=39 #设置p为数值型变量,值为39
, k+ Q' ^) G2 I- cset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
/ }% T$ U! t! E4 w2 sset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用9 c0 Z+ v0 l4 l% J; S
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?3 x' Y) A+ L+ |
set p= #取消p变量
* V0 x* I2 W% [/ J' {. Lset /p p=请输入
7 d7 ^0 ^3 K3 V屏幕上显示”请输入”,并会将输入的字符串赋值给变量p2 M2 P, K8 ?- z; }! B
注意这条可以用来取代 choice 命令6 \ s3 x4 U( s% L
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
3 r9 Y9 q ^6 p8 ~5 Y@echo off
" Q1 A0 I3 x. f$ p& Zset p=aaa" q' X- q! {6 g; ^$ h
if %p%==aaa (" g. h* ^# g( \, j' J1 `7 c7 k
echo %p%
( i0 n' k1 `' C2 H) X" u! uset p=bbb/ z' P$ I6 C; X# K
echo %p%
# E6 B. a0 j- S$ S)5 S4 z o6 y8 b# s
结果将显示
6 M. _) q: g5 R$ Faaa2 J k7 j& y4 F2 N
aaa5 Y7 \8 L/ Y2 ^8 j, j
因为在读取 if 语句时已经将所有 %p% 替换为aaa
1 j& ]* F; N& y, I! g) \; N" e1 ]这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"% ~2 J, H% L! n5 Y& ]
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
2 e4 u- O1 {% G@echo off* l% n/ {- ]! c& _
SETLOCAL ENABLEDELAYEDEXPANSION
' d3 ~% r. E/ i) j- }! |) @# q2 Mset p=aaa
* V' i% `# C) R- \ ?) B7 aif %p%==aaa (2 H: q8 o6 l; J2 { k7 O# t, X
echo %p%
3 c8 S0 V3 t( t( O/ K, t( W; Lset p=bbb: L" y6 ` V* J( B* B/ c" x0 b
echo !p!, z, U/ @ X, G
)
6 P" m% _: m0 ?; J" c* B F. U+ mENDLOCAL, q& `; D z6 j7 [% G
结果将显示( G7 n9 t# D) _/ ~) U
aaa
, w8 k6 K& |: A8 N* k1 h& Hbbb/ O2 i3 \, ]6 K2 f
还有几个动态变量,运行 set 看不到& K1 x! s' B1 I1 |/ k, a; g4 L* l
%CD% #代表当前目录的字符串
( r, ^9 c& J2 I6 p2 T/ _0 x%DATE% #当前日期! M3 s$ I4 N1 Z0 b! O0 L
%TIME% #当前时间, a8 I- g) {, T4 w
%RANDOM% #随机整数,介于0~32767
8 o4 U9 H4 } }$ V) j# E%ERRORLEVEL% #当前 ERRORLEVEL 值8 |4 F7 }) A0 {" M8 P* m% W* L5 t$ n
%CMDEXTVERSION% #当前命令处理器扩展名版本号
# Z! k( S+ k% ^$ Q( v" d$ m%CMDCMDLINE% #调用命令处理器的原始命令行9 g7 c" G# a* O: z- Y" ~. j: V
可以用echo命令查看每个变量值,如 echo %time%3 ?# j0 c' h; c T) H
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
2 i7 _( i7 t& p' u0 s/ ?; E* y5 O3 J2 f9 d6 `# o4 h$ T; ]8 s/ a5 B
32 start0 |0 T: W4 o# ~9 c5 b$ M- c
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
5 F) Q( t5 ]6 `8 T1 h2 t* m: y$ C* V# o
33 call- D2 ~% M9 D/ k% H. j+ W$ W9 Z" j* D
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行 q. _9 E* J% Z3 w4 q7 ^1 I: [
有时有的应用程序用start调用出错的,也可以call调用3 ?, O h1 B6 z
2 q* d" | Z/ }4 v- ]. M: _
34 choice (外部命令)# W _) q2 `: _2 R% Q, }
选择命令" i" t L$ k. C* F) u
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
/ G0 p O+ l' h: X; G2 N" e" Cwin98里是choice.com5 D+ J, u5 t% n
win2000pro里没有,可以从win98里拷过来
- S; \# M" |3 @) e9 C& I* Twin2003里是choice.exe% e# \0 s5 G+ }5 ^3 v7 u4 o3 F# k
choice /N /C y /T 5 /D y>nul
8 P3 J) C' e# P* c% G延时5秒
7 _: C4 t; U, T. V) l$ Z: g% H
% B# K1 I+ }+ x3 J2 ^, L9 G7 r* W35 assoc 和 ftype' E7 D2 i) o* l+ F
文件关联
7 G1 ]" \2 _1 K6 tassoc 设置'文件扩展名'关联,关联到'文件类型'
' {; m% ]- @5 W- Z: n9 Cftype 设置'文件类型'关联,关联到'执行程序和参数'
; k) D: Q( N; b* G4 m6 o$ H2 Y+ m当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
9 j3 B' U$ e( j. ?) i* X而是先判断.txt属于 txtfile '文件类型'6 C( D l4 H9 E6 E/ n' e
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
% E% _# C7 ^" \& l. ^5 u0 n6 \- J可以在"文件夹选项"→"文件类型"里修改这2种关联
, V: P' s; K+ Z. i0 hassoc #显示所有'文件扩展名'关联
7 c: R: Q4 j& A, A" Fassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
( M; r8 { I: N8 v' Vassoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
! Q6 d0 K$ E, K- W# ^; Uassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
% Z7 g4 ^% @, W8 b: T9 \* wftype #显示所有'文件类型'关联/ w# g2 k# s+ y& s
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
9 P& ~5 I: y8 A0 z/ H6 U$ Qassoc .txt=Word.Document.8
+ o9 b4 O4 ]9 ^4 \+ P设置.txt为word类型的文档,可以看到.txt文件的图标都变了
5 ~3 @3 |# f: gassoc .txt=txtfile! t* p4 z4 m7 D1 C; J
恢复.txt的正确关联" \! Z8 Y$ }1 O! ^% l: p: R2 v
ftype exefile="%1" %*8 Q) {4 i! m" C
恢复 exefile 的正确关联
; b* o5 e6 b$ }" I2 F1 a3 P ^如果该关联已经被破坏,可以运行 command.com ,再输入这条命令% s! }$ {- |5 B- Z# F% B
" i) h x; D& m; ^
36 pushd 和 popd: D' T9 U2 t' M
切换当前目录# P( s& W# E7 ~1 }
@echo off! n* W) u& `$ _8 H& ^
c: & cd & md mp3 #在 C: 建立 mp3 文件夹
: x& L# J; |3 O" i* S( Y6 Emd d:mp4 #在 D: 建立 mp4 文件夹5 b# D- I2 J/ E
cd /d d:mp4 #更改当前目录为 d:mp49 z1 @% t; p" q* c. [
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp31 g3 {9 k9 M& X
popd #恢复当前目录为刚才保存的 d:mp4
! U6 u- z- n4 r, Q: u9 o. l5 c% n/ F4 r
37 for- h3 i# u' ]$ {) D
循环命令
" [( W) S9 Y! M) g7 \) Q这个比较复杂,请对照 for/? 来看
% L+ R* }" y+ ?6 H6 {for %%i in (c: d: e: f do echo %%i
/ K+ I" V9 Q$ J6 b5 `) P1 F2 a依次调用小括号里的每个字符串,执行 do 后面的命令8 Y- K; g* v% }: R
注意%%i,在批处理中 for 语句调用参数用2个%
" }+ ?: p/ v9 j. T+ g9 U! R& Y默认的字符串分隔符是"空格键","Tab键","回车键"
& P4 c6 x6 p7 _2 D2 pfor %%i in (*.txt) do find "abc" %%i1 {! [4 C1 A( X/ s
对当前目录里所有的txt文件执行 find 命令: {/ Q0 ~' J' y& v& p/ C4 A8 I/ q8 a
for /r . %%i in (*.txt) do find "abc" %%i
# ~7 V7 }, y) Z6 {7 m在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
H- r4 z: a! D2 D& zfor /r . %%i in (.) do echo %%~pni
& i! V3 o' M# P7 j显示当前目录名和所有子目录名,包括路径,不包括盘符" q% t% d/ O# d
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt2 F' F% T" Y# _2 ]. `
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去. n# N, I; F, [6 |
for /l %%i in (2,1,8) do echo %%i: ~) L+ Q( Y" A3 s; z
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
/ w& M" X9 L( u' R7 rfor /f %%i in ('set') do echo %%i
; j' a3 h3 s! B8 p" H对 set 命令的输出结果循环调用,每行一个
: |" m" z& w9 Z9 F @ Rfor /f "eol=P" %%i in ('set') do echo %%i
: m$ l2 d2 J8 o4 a3 Z }; v# ]. y取 set 命令的输出结果,忽略以 P 开头的那几行- w2 l4 ]3 X# N1 e9 t# [- {
for /f %%i in (d:mp3.txt) do echo %%i s' k4 q3 K9 J7 p6 a
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称% n h2 |% V4 F( d# O$ k5 l R
for /f "delims=" %%i in (d:mp3.txt) do echo %%i- S4 n4 u4 c6 y/ j Q2 ?5 }6 A- f
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称! q$ Q# E U3 I2 n! C
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
' x, f4 o0 W1 j h6 L6 f' V对 dir 命令的结果,跳过前面5行,余下的每行取第4列
3 F M+ W2 b5 p每列之间的分隔符为默认的"空格"
) ]+ i9 Z9 V1 i% q; W可以注意到 dir 命令输出的前5行是没有文件名的; m0 L4 N1 _; {$ f' Q2 B
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
9 d1 V6 l- Y) h8 e- w2 k9 E/ aecho %%a& h, t; k% X, {
echo %%b) L, _% x6 f! H, b) g" N5 B* M
echo %%c) s+ M2 Y" G9 p& m$ E
)
U/ J% T& g+ `& X: ]对 date /t 的输出结果,每行取1、2、3列. s: g1 r6 n' l$ p6 }$ I3 |
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列9 r9 A1 O" i- N8 g- v$ o. f' U
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
8 c' Z) L8 x, r3 z9 i* v其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的# A) v/ [2 [4 R5 O, M- x
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b# F& h# b5 R5 Y; B4 }- ^- Y
取第2列给 %%a ,其后的列都给 %%b7 y, g4 _# _& q0 w/ s2 A
/ g* z4 u, m9 K$ R8 @38 subst (外部命令)
! v: X: j N( \ N4 ^4 P映射磁盘。
7 g) R/ ]6 e# @. A& psubst z: serverd #这样输入z:就可以访问serverd了
- F6 Q$ p7 q2 r( M$ C# l# `3 ^ u& _subst z: /d #取消该映射/ H; }( w3 p+ g# f
subst #显示目前所有的映时' j# Q a- o% c/ q" Q; ]% W
9 M4 M% n8 W; k& K: @39 xcopy (外部命令)
7 j+ _: }" ?4 p& B' X文件拷贝# s& l4 O* v/ o; S3 ^0 M
xcopy d:mp3 e:mp3 /s/e/i/y5 T2 ~# Q. W9 ^
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件5 }. C! C4 Y/ H" X; x" v1 X
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
2 ]1 E* P$ T: M) g2 e# K% s" a
2 \, A7 ^. p6 t* ]1 |/ E) q常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
( t: V- U7 J8 |8 `% j o; J' ]: X q- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:
& k2 [: N, S* n T. d6 z 2 w/ G, @6 [/ z$ [/ \1 s8 y
@echo off& Q! K6 `1 z" q2 z' P/ x- t
set p=aaa) E0 G% B, r" X$ B, Q
if %p%==aaa (
; j" n, A" m6 B ?echo %p%
9 |) u# [9 S- y* R$ x1 p- {, wset p=bbb, x1 [& R' [' e1 P
echo %p%* \7 S3 @9 g) ?% X6 g: i+ @% u4 a
)
7 d! j! i d L& R4 q' [ h3 s6 Ipause / s: M9 P$ f5 |
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
|