|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!
# m4 ^7 C6 m% `4 ? 前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效
3 H: i h r' v K! U! L( r
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展 p; U4 u8 h- _. b0 A6 y
名为bat 目前比较常见 的批处理包含两类: * A# J7 T9 ~8 w6 r% l6 R J7 k2 `
- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
0 B2 \9 F/ w5 V
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的: s7 n @1 X" |- r) v2 a
命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件 1 v3 _4 z# f0 F
怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
7 `" I8 t2 U9 c 批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set
7 w" n/ j: j5 P0 x& r. H 批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||4 p! i5 N. [. v% O" v% c
常用DOS命令- 文件夹管理:
7 c* M& c: \ S, x4 _- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。
2 t6 b% I: T& F' f8 _; L
- 文件管理:% F. S0 @; l1 y& G$ ?
- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同7 ~ L/ T- Z7 o7 ?
- 网络命令:
7 @; | C) _# F* T: }- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表; }. R( E4 o7 y+ @
- 系统管理:
: F( ^- ~5 s% i* _- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置
' e( ^0 @; U' @0 e, T 6 E3 d: ?0 R! G9 S3 O, D( K
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
* ?" d2 z! M* i5 C0 ^: U. C/ h W0 c1 [6 @4 l- p
Windows Batch 常用命令8 W, y1 E+ I& n% i% e9 ], S3 }
1 echo 和 @
5 X |# d v9 y9 }" C# w回显命令" B/ T. v2 B" N
@ #关闭单行回显
?5 n& D: O& g% q7 F0 \) s4 ] Fecho off #从下一行开始关闭回显
' E: R& z$ r! d( [ K2 M@echo off #从本行开始关闭回显。一般批处理第一行都是这个
4 K& ~1 m/ W5 I1 Vecho on #从下一行开始打开回显
% f; R0 e- d: h1 B' X3 W4 Yecho #显示当前是 echo off 状态还是 echo on 状态
; m4 G& j# H6 a2 [4 E. Recho. #输出一个”回车换行”,空白行1 T ?0 q' C0 y. o) h/ f! c
#(同echo, echo; echo+ echo[ echo] echo/ echo)
1 i; w( b0 @# b; {3 F7 `5 `8 W, V) {6 H" F9 O
2 errorlevel \1 ^5 K( m- D9 b+ a
echo %errorlevel%
1 v# I" K9 {1 }' t! n每个命令运行结束,可以用这个命令行格式查看返回码. P! A. Y; ], J* S, U9 f
默认值为0,一般命令执行出错会设 errorlevel 为18 ?: h# {! O2 p( o k; r# B
9 t$ _: J0 Y# z6 Q
3 dir/ l. R4 u+ t( Z0 F$ Q* ? v
显示文件夹内容
3 C) M! `8 s O6 A2 mdir #显示当前目录中的文件和子目录
, q8 s) V8 a1 g( o; `6 ]dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件% Y/ x+ X0 Q6 h; h8 d6 y6 I5 H" V
dir c: /a:d #显示 C 盘当前目录中的目录3 R; d: q6 O) ]) V
dir c: /a:-d #显示 C 盘根目录中的文件+ ?/ `9 C4 \! f4 l3 I
dir c: /b/p #/b只显示文件名,/p分页显示3 L7 ]/ N" v& }3 y+ P, L4 ]
dir *.exe /s #显示当前目录和子目录里所有的.exe文件, @# B8 V5 ?, C: r
4 ]# C: \2 ]+ c/ A' G% ^9 y
4 cd
% Y5 D( x& e7 n切换目录+ A* t! {; g9 N- h6 F8 ~
cd #进入根目录' [" \% J; ~6 a, C! w
cd #显示当前目录
2 b5 W9 s: e. S4 ]* Ccd /d d:sdk #可以同时更改盘符和目录
, l* E1 b4 y: F# J
7 _5 w% P1 U, N2 n8 [5 md
' |- F5 Y) A3 }( e创建目录- j- B4 r7 G8 v5 {0 O9 o y
md d:abc #如果 d:a 不存在,将会自动创建中级目录( z; u& ]1 P8 u- o5 [
#如果命令扩展名被停用,则需要键入 mkdir abc
?, h- B) I( S/ H5 b& A' e; A3 z4 j" a- `6 y- _: F
6 rd
1 M- q+ F; I/ s x4 e4 O1 j7 e% t删除目录3 U' T1 A4 M: a w
rd abc #删除当前目录里的 abc 子目录,要求为空目录
+ m- J6 U* a3 Q7 E! [rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
3 U' P& R" K o6 P
& Z* F- E- O" U8 ~2 q: a7 del
1 l/ O, L/ A7 l/ M+ b删除文件9 p5 @/ v$ O9 Z3 a# v1 O
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
' p6 T* {# g, K8 S5 ddel /q/a/f d:temp*.*$ s6 k( P( m6 X
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录8 @/ X# C4 { e; U8 ?
del /q/a/f/s d:temp*.*
4 L- v* L" \7 b* H( L删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录* _3 ^0 d5 s! v/ k2 | ^
1 F& E: J8 F! D. j/ h- `! e* Z% D8 ren' w2 r" J+ r' l, x6 _
重命名命令
7 u- F. q m1 J3 }9 h) I1 X6 Mren d:temp tmp #支持对文件夹的重命名
3 |/ \, k0 U% L* I+ I# @
6 }5 d1 k! d- t* @# Q% ]$ E. c9 cls
# k: @6 b* i* w& g. F- ?清屏
# g4 ?# A0 }) o# r. I! b1 @ Z10 type
$ z4 B3 d: n9 q* A显示文件内容
) I7 u* \ R. x* Ktype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码) R) j! w- G! D& d
type *.txt #显示当前目录里所有.txt文件的内容
7 e5 s7 c* G9 v" J: z& U, `2 [7 u x$ Y* A
11 copy. y3 L# w9 @4 F7 p4 B* K0 C0 v
拷贝文件
9 L z- N) u( x2 n+ z5 h- o5 acopy c:test.txt d:test.bak' M* I0 [& |( ~- E1 k3 H5 J3 o
复制 c:test.txt 文件到 d: ,并重命名为 test.bak! X( A1 l4 l# m
copy con test.txt
. ~; B% N1 t; M) J) R# u% [从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件6 F5 c( M+ V( I" n3 S$ [3 }
con代表屏幕,prn代表打印机,nul代表空设备0 _7 u. L$ k) J I, y, h/ ~
copy 1.txt + 2.txt 3.txt
U6 i+ d: ?" w$ U6 L3 J% ]合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件2 X8 A# T$ v; A1 W
如果不指定 3.txt ,则保存到 1.txt9 U. q- V% T9 P: e' b
copy test.txt +
% o6 b7 O/ p5 L! }; b5 a1 }2 m复制文件到自己,实际上是修改了文件日期" _, k& N* A7 ^
: z/ L+ S$ g/ L' p! {
12 title
2 c& ]" e( X& M' k& ^3 C; f设置cmd窗口的标题) ?3 D5 n% b) V# `9 I$ |/ O0 } |# N7 n
title 新标题 #可以看到cmd窗口的标题栏变了, L" U, y. C1 l7 g0 y& s( J
7 Y' A7 Q5 P! e5 u, v13 ver
' l- l7 t# s+ M, ]显示系统版本8 n0 w; @: _! m7 [' ~. s
c6 X6 ~5 b9 b( ^" C0 r: p. S
14 label 和 vol
7 J) J2 x* X( s& K6 a设置卷标! u1 u+ Q1 \$ I% O2 p% C
vol #显示卷标
3 M4 j) p0 ]4 alabel #显示卷标,同时提示输入新卷标: r p& ~, H5 |
label c:system #设置C盘的卷标为 system: A/ v9 x# R5 A0 o8 }
% c" F J# k/ \ ~( b9 S
15 pause0 j* r/ x4 F0 n
暂停命令" k/ |+ k8 f: k Q5 w
" V. _7 v/ C) O1 D
16 rem 和 ::+ G9 v g, m: @, h6 w' B+ q
注释命令& ]) E; {1 ^) A! ?
注释行不执行操作$ R% i' M% _5 O& J, _
) a) W( }+ F" C3 y% U" n. H- B17 date 和 time" t0 Z: w, P& U3 i
日期和时间# D# w! Q' \0 n/ [$ A
date #显示当前日期,并提示输入新日期,按"回车"略过输入
+ O% n4 `0 A W% t" Vdate/t #只显示当前日期,不提示输入新日期
( z& e+ E$ H( T7 xtime #显示当前时间,并提示输入新时间,按"回车"略过输入
: ]+ c2 p; l U$ Gtime/t #只显示当前时间,不提示输入新时间
/ H C# e& [; z8 Q {; ?
+ z/ G4 t1 I0 N$ @5 N5 R/ ]18 goto 和 :
( m. @8 P: U5 Y& A跳转命令' x; r/ W6 K1 `6 u" g
:label #行首为:表示该行是标签行,标签行不执行操作3 W6 i2 S1 `& Y
goto label #跳转到指定的标签那一行
( r% h0 f9 F+ @* T( [( r6 l' v* ?8 \8 f4 }/ R4 A* z- G2 Z
19 find (外部命令)
9 c+ E; B6 ~) c m6 T1 d! _查找命令4 }. j: W: }9 J+ ]' v
find "abc" c:test.txt4 U1 l3 m$ g, r. m- K4 S
在 c:test.txt 文件里查找含 abc 字符串的行
* W- M4 W; r7 I8 V" h1 K+ X! l如果找不到,将设 errorlevel 返回码为1
, e2 v+ R, p! q4 v( c9 l: k, m/ qfind /i “abc” c:test.txt
- ^8 q! r8 I& X; m查找含 abc 的行,忽略大小写
5 P$ b; `7 y9 P: {1 X) H6 Ifind /c "abc" c:test.txt0 s" S" x! r# f: `
显示含 abc 的行的行数
0 R. |8 j5 N$ V! b
% Y9 ^9 ?/ Q5 k0 [1 d' Y, U9 M20 more (外部命令)4 n* y: D# D' L
逐屏显示
2 I, z+ K* U3 u8 cmore c:test.txt #逐屏显示 c:test.txt 的文件内容
/ E, z: K! |$ i/ U% i* g N
5 j. c% r! J% J6 o21 tree
( Y% n8 s/ O' v" f( b3 t! O显示目录结构" j: J; L) a" v4 \% M
tree d: #显示D盘的文件目录结构% a7 Q4 `: K. l1 i' |) Q
7 D" Y1 r6 D9 Q2 Q( b: ^
22 &
% m- Q1 {$ ~6 [/ ]8 D顺序执行多条命令,而不管命令是否执行成功& l0 T; J& X* O' i8 Q, @1 J
8 K5 ^/ c {* n" o
23 &&
3 p/ z7 h1 L* ~% K4 X1 N7 ~. U顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
) w, p9 j9 c1 Ufind "ok" c:test.txt && echo 成功5 z% C; [& D9 W. P4 X
如果找到了"ok"字样,就显示"成功",找不到就不显示
# |+ g# z! ?: J# P- h5 T2 x0 D; t+ k1 C; A9 ?9 l" ]9 p# g& m
24 ||
0 s2 c7 ^9 h6 T顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
* o4 c- i- G7 {' [, t% Zfind "ok" c:test.txt || echo 不成功* x' h" N; l/ C( j9 Z) f1 b7 S
如果找不到"ok"字样,就显示"不成功",找到了就不显示. U R" ]4 u: r7 ]6 z. X# }2 O
# I6 z7 R- [' g h7 f( c
25 |
# e; y+ U" @- v1 W5 r4 p% {管道命令
. t8 \+ s( Y& ?; [% _$ j& r( R! ]dir *.* /s/a | find /c ".exe". G2 K2 }$ u: e t( X! k
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令' e% c0 C( C2 q: _& X. M3 Y I
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
3 H! y3 \0 L; x( b- ttype c:test.txt|more/ o3 Z3 N5 P; p0 y1 x ]$ p
这个和 more c:test.txt 的效果是一样的
W5 Y F f6 A7 @7 D; D, n' k! t+ D" b' i
26 > 和 >>
, O! Z& G; W$ L输出重定向命令
' S9 ^. m3 e1 _' z" v% x> 清除文件中原有的内容后再写入9 n8 y% @' M8 k
>> 追加内容到文件末尾,而不会清除原有的内容
/ \: S5 a$ y" Y4 K主要将本来显示在屏幕上的内容输出到指定文件中
- k, d$ f# D- v y) M3 Q) L0 S指定文件如果不存在,则自动生成该文件5 z+ a& u" m* L+ j) }5 t( C8 |
type c:test.txt >prn8 g' N/ m2 U% D/ _* ^
屏幕上不显示文件内容,转向输出到打印机
' j c" `* p( H K' u+ Lecho hello world>con0 h; w/ L+ k& F+ A8 {$ ^! j7 o5 Q
在屏幕上显示hello world,实际上所有输出都是默认 >con 的3 O2 {, U+ [" m( z+ D) _$ y
copy c:test.txt f: >nul( \" t( p: Y$ H
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
) H5 h6 C" Z3 J% U7 ocopy c:test.txt f: >nul 2>nul8 Y2 q* O% q8 Q/ B' ^
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息& ~. `8 H; @3 w& W
echo ^^W ^> ^W>c:test.txt
7 h" b9 w4 W; l! b生成的文件内容为 ^W > W/ o8 J+ w& L$ W G. ~
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
- X# \6 N. s! u+ C% d* }" ~2 p
27 <2 y) s) k- n$ z/ _1 @9 p
从文件中获得输入信息,而不是从屏幕上
7 r4 \! I4 A |6 P/ V一般用于 date time label 等需要等待输入的命令, h8 F7 r* Q& \. b1 D% V
@echo off
, V: U' [% P% a, Techo 2005-05-01>temp.txt" f8 r- g' d8 k" a* f, N
date <temp.txt
& ]) ~) f. s, vdel temp.txt
% ^$ B# y/ k& D% s9 Y这样就可以不等待输入直接修改当前日期6 d. y; \$ t. n+ c6 w
5 m2 E2 Y% ]. l
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*7 `- J( a. X r4 V, |: X! @
命令行传递给批处理的参数
: L6 o7 @! x1 \3 N0 \+ a7 H%0 批处理文件本身
* b" Y8 \2 E. i8 C/ d%1 第一个参数$ p) t% _+ I4 Q7 g
%9 第九个参数0 O% F, u( y" b* L4 W
%* 从第一个参数开始的所有参数: l; K1 u2 v1 _% t0 I( g
批参数(%n)的替代已被增强。您可以使用以下语法:6 I- D5 ~4 q( a
%~1 - 删除引号(" ), 扩充 %1
, z* B- N' ^/ t5 s%~f1 - 将 %1 扩充到一个完全合格的路径名7 o9 |2 x+ G( L/ L: z- X
%~d1 - 仅将 %1 扩充到一个驱动器号- W4 k6 y( P" s h
%~p1 - 仅将 %1 扩充到一个路径
+ Q, d+ ?; b0 ~8 j%~n1 - 仅将 %1 扩充到一个文件名6 ^8 r" C0 |9 f+ G2 N
%~x1 - 仅将 %1 扩充到一个文件扩展名
! `5 N; p6 ]+ Y2 B%~s1 - 扩充的路径指含有短名7 w7 \$ p& e4 T- a
%~a1 - 将 %1 扩充到文件属性) b6 B8 I0 P1 t/ n9 u' L5 L
%~t1 - 将 %1 扩充到文件的日期/时间# S% F4 V; T& z
%~z1 - 将 %1 扩充到文件的大小
4 i C; l" a, i' q' f6 [%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
( t2 G1 s/ b' h9 t. ^扩充到找到的第一个完全合格的名称。如果环境9 ?+ i' [; \8 g2 d
变量名未被定义,或者没有找到文件,此组合键会; @# Y/ ~) x" F8 B$ _2 T1 `* r" N
扩充到空字符串
$ B; C9 Q9 p( y' g/ K可以组合修定符来取得多重结果:
: u9 h8 g7 |9 J+ P%~dp1 - 只将 %1 扩展到驱动器号和路径# e7 r' a& @7 x) p5 w
%~nx1 - 只将 %1 扩展到文件名和扩展名 u# I& b4 F: `$ W7 e; K3 W/ e I
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,- l5 n/ z$ h, g# m' W
并扩展到找到的第一个文件的驱动器号和路径。
2 O; H$ ^% K' e% x7 O1 e4 W2 V5 x%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
0 j. d/ o3 ^0 b2 a( d1 O( U4 M可以参照 call/? 或 for/? 看出每个参数的含意
2 F- A0 I& w! I6 secho load "%%1" "%%2">c:test.txt7 `" K" d, }* ~ c+ ~
生成的文件内容为 load "%1" "%2"# n, P* Y& ]- Z9 |" h" t: o! p6 u
批处理文件里,用这个格式把命令行参数输出到文件& { p8 C& V; s( Y
7 v) L% j# a7 g2 O
29 if- P# _. Z$ G; v! n) ]
判断命令3 {0 j' v/ s8 Y+ M/ i* W
if "%1"=="/a" echo 第一个参数是/a8 c6 q ]6 c. k; ?
if /i "%1" equ "/a" echo 第一个参数是/a
3 w( P3 P% S. g) f" B( e/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?! q T* _$ U/ d
if exist c:test.bat echo 存在c:test.bat文件
9 b [' V$ U* yif not exist c:windows (
# K) X- M0 e6 {- Y* A# ]' a decho 不存在c:windows文件夹, L( Z ?, F9 P: J7 U* d
): z+ m, ]7 m2 g+ ]
if exist c:test.bat (0 |! Y0 q x; i" L. R8 B
echo 存在c:test.bat2 p: m$ l9 U. _4 O- }- L) i
) else (
4 S; N/ i- |) q& Q# zecho 不存在c:test.bat
5 w9 E7 x( P6 l: ?1 B. D9 _8 O4 H)" w3 I7 l9 c8 T: d
30 setlocal 和 endlocal
+ q- Q0 H" j9 Z; G8 B5 T! \设置”命令扩展名”和”延缓环境变量扩充”$ J, n N! s/ i! G
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"+ j5 }6 O* n1 b$ A
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
5 q" ?/ P K& y( n8 kSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
" l& N$ n: a( T# U' j" s+ O% j0 WSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"+ s0 t. b* A' Z8 \8 r' t5 h
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态' ^( U' v8 C. w3 ~- P1 l8 Z
“命令扩展名”默认为启用
7 |4 W5 @; |% e2 v! l3 \5 J* S“延缓环境变量扩充”默认为停用+ z2 Z0 A! Z) v- |' T9 A% c8 F
批处理结束系统会自动恢复默认值
7 ?+ q% f/ g! [3 i% [0 ?) y可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
) x- y1 \/ }* p7 X序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
7 s5 c1 d: M) X7 b保程序能在其它系统上正确运行: @8 c" l( k* f
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程# n. g6 s2 L6 f$ U4 j
4 i7 p; {6 h2 p# c+ F
31 set
3 ]% J, X/ y& a7 ?: l4 f设置变量
. J' a. a6 [; _, i3 _引用变量可在变量名前后加 % ,即 %变量名%
9 c7 y- V/ P! d% dset #显示目前所有可用的变量,包括系统变量和自定义的变量
9 z. Z8 P, x1 T! W, ?4 T" B2 [; {echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用# F2 B0 R( G W- E! b Z6 w k% n) }& _
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
, `* b) B0 Z3 N- S4 N: Zset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
) u2 n0 }. Z$ }, i( } N+ yecho %p% #显示变量p代表的字符串,即aa1bb1aa2bb2( Q/ b# O: G3 W& m0 k9 L8 _
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
& g1 \, _: b1 x, H% uecho %p:~6,3% #显示第6个字符以后的3个字符,即aa2
6 }" ^9 m5 l8 g% Techo %p:~0,3% #显示前3个字符,即aa1
$ V% |1 t- i! h8 Recho %p:~-2% #显示最后面的2个字符,即b23 F; w: }. z+ e2 f
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b" x0 b8 t% m0 ?' W! \7 J5 I
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
* D2 ?3 M, a) ?/ {echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
4 i" {# K- a [+ ^5 \/ E8 eecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
) h! D* T" L) ~, [% w* oset p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
' j0 ^6 V( k4 F @0 iset /a p=39 #设置p为数值型变量,值为39 l a$ c. W: R2 E4 R
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
6 m1 I7 D+ R' |* o3 I' N0 vset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
3 z5 M8 c( m7 Q6 `" ^5 |set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?9 D4 y6 ^ q4 N+ t; Y
set p= #取消p变量- @" z5 D2 w. E; n. m2 S
set /p p=请输入, w `1 @6 _* _9 u0 P# B7 Z
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p9 p% U% ^7 K s8 b: u0 V- r
注意这条可以用来取代 choice 命令6 u1 m, W8 w; a6 u* q0 C
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
$ h1 M9 I$ X5 V' T; m@echo off
" D' @/ M1 x8 h: Y, n! }set p=aaa
' }0 p( s0 g2 _4 @- Y/ lif %p%==aaa (8 _% l4 ?. i) T4 ~
echo %p%5 p+ S. L6 ]1 G$ X, L
set p=bbb6 O. e; B, ]0 i& A* c
echo %p%
$ n; z) j) [. Z; c: m)( h# W/ n" D% ?0 t1 k7 M' {
结果将显示! d2 e$ S0 |/ z, }
aaa( }& ?4 |1 t; N% K% i1 s9 @
aaa- m! t* T% ~: K8 I. P- d2 C9 Z
因为在读取 if 语句时已经将所有 %p% 替换为aaa7 X4 I4 q( U; L0 Y9 F
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
& ]6 t) `; M: r% x% X可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!; X5 q! j: D8 }
@echo off( |2 T7 G& v! ~3 A. _
SETLOCAL ENABLEDELAYEDEXPANSION
3 s3 G, I B' _: Gset p=aaa: {( ~! Y. Q0 C; p
if %p%==aaa (/ n, R, ~3 d$ V; M$ O. M/ t! ?
echo %p%# i; j+ r0 X3 @. R
set p=bbb
$ U) B `, J3 r x) ~echo !p!
3 f1 F$ J/ b( G& m)9 I2 I6 ]+ Z- a& c
ENDLOCAL
4 B: _' a. L/ F$ L- m' R结果将显示: _0 a) Y* v3 _* y% `6 J
aaa1 O' \- ~! f% C" @9 r! _/ ]
bbb! d/ i& h- W A! o
还有几个动态变量,运行 set 看不到% O& v8 c7 D% z$ C2 ~( J- x5 W
%CD% #代表当前目录的字符串
0 v" f7 `/ M, X: t%DATE% #当前日期0 O' ^/ T+ B3 o3 u8 B- b! E
%TIME% #当前时间) c+ W7 X) H( c( w' [
%RANDOM% #随机整数,介于0~32767
9 U' C# o7 K* e/ l( f%ERRORLEVEL% #当前 ERRORLEVEL 值! T5 v/ L$ I! A, L- J3 Y6 ~+ y
%CMDEXTVERSION% #当前命令处理器扩展名版本号9 r `, ~3 F1 M
%CMDCMDLINE% #调用命令处理器的原始命令行9 Z# u$ N# N3 _- W
可以用echo命令查看每个变量值,如 echo %time%
8 e1 _3 }' V3 S" y注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
& U" V5 n* G+ ]. N2 ^0 i: [
0 z0 S9 [4 {( F1 v32 start
( ?( M7 m8 o. t0 g6 v批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令. [; \ o7 r0 y
) w! K: O6 q V( g: u33 call; ?3 w5 O1 t5 C/ z" K
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行6 B6 Y$ z5 G0 n3 Q- T& {
有时有的应用程序用start调用出错的,也可以call调用: m) q" u& ^6 z: @; F# A; ^
1 \: {0 G7 _2 \/ C p, P
34 choice (外部命令)
- K. F/ u) {' v- h/ [( m9 f选择命令
& t6 x; W1 ]7 u5 w1 U让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……1 G5 T: a4 v$ w+ v0 ^0 c2 V
win98里是choice.com9 R; C' j! `" C# d& U, D& V- ]
win2000pro里没有,可以从win98里拷过来
% p% B9 P! i' H7 @# l/ O2 cwin2003里是choice.exe
" Z( k o* g0 x! D2 i9 Zchoice /N /C y /T 5 /D y>nul' z: z5 U" T1 l+ p
延时5秒
: l( S7 m \: I1 K3 x4 ]& x7 L \; Y: Q, E2 C' u3 r9 j
35 assoc 和 ftype
1 j- \# q( m& R- `1 J. }. @文件关联
4 F) ~. U" h) z( {' {: |3 L/ I+ Tassoc 设置'文件扩展名'关联,关联到'文件类型'
" S3 G, k& h9 s: W; D! d& pftype 设置'文件类型'关联,关联到'执行程序和参数'; v$ I. k3 B# T2 {% v% G
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开0 Z7 x4 X( V% W0 @+ ?. \& B. D4 i
而是先判断.txt属于 txtfile '文件类型'8 \2 a) @( _5 X- k. s# N3 i W$ U
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
x; X2 C6 w. z* N# l可以在"文件夹选项"→"文件类型"里修改这2种关联0 M. [/ Q5 J, b
assoc #显示所有'文件扩展名'关联( s. F5 r/ c8 E$ O" T! ^( D7 B
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
$ f8 _+ q2 ~* Z0 \) g; Passoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
/ v! n6 q- X+ f% Aassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile1 K" x( a: ^8 M
ftype #显示所有'文件类型'关联
) d! G; b- y4 j7 w4 d( R1 u3 h- eftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
% |& r" n% W4 q8 b0 v0 Iassoc .txt=Word.Document.8
9 \4 N1 u5 N6 N3 v% V% C设置.txt为word类型的文档,可以看到.txt文件的图标都变了
# _2 q) e' ]# s8 t5 d: N* Gassoc .txt=txtfile; m7 C) v6 k/ C4 G% m
恢复.txt的正确关联+ ]5 G! H) x- C- {$ ^. D- r S
ftype exefile="%1" %*9 \: ^/ j! q- F* L& B: U- X( g
恢复 exefile 的正确关联! d3 a1 A R/ H! F7 L3 C
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
. l! ?5 P G6 M$ M: R& R
r2 i n% o: t6 [0 T36 pushd 和 popd) J' p6 ?5 { _: d5 c$ k9 Q9 H& Z
切换当前目录
; t9 [9 L) l+ i' X0 n# E& a@echo off! v6 U% w8 t( F* M8 h1 O5 l6 {# @. O
c: & cd & md mp3 #在 C: 建立 mp3 文件夹5 {, ]* y4 |' K+ w& l
md d:mp4 #在 D: 建立 mp4 文件夹3 T G- Q5 t) s# l/ ]- W+ L
cd /d d:mp4 #更改当前目录为 d:mp4' T+ o1 ^7 H. I. [! V' Z9 o K
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp31 y0 s% i+ w7 ]/ p- y4 h% z
popd #恢复当前目录为刚才保存的 d:mp4- C3 [" n' f- v7 s1 O: @! ?
- Z9 A9 c- F& S, j
37 for/ }9 X# [, u' [4 V) E8 v( p
循环命令
4 C9 H$ H3 M0 X这个比较复杂,请对照 for/? 来看4 r$ g. x( ]/ r5 R8 H" `, Y
for %%i in (c: d: e: f do echo %%i: a) R/ T2 K# |" w( S$ ^$ \: e
依次调用小括号里的每个字符串,执行 do 后面的命令% m$ G8 y6 Q' A$ L( B
注意%%i,在批处理中 for 语句调用参数用2个%
1 l5 b0 ?* _% g默认的字符串分隔符是"空格键","Tab键","回车键"1 T3 Z2 [8 x( I7 S5 Z# ] B# f( _4 u
for %%i in (*.txt) do find "abc" %%i2 R! D$ c' o b# c5 r0 g/ T
对当前目录里所有的txt文件执行 find 命令* w; w" Y5 f" l: _1 P
for /r . %%i in (*.txt) do find "abc" %%i
4 X1 _5 C! d2 K$ ^. y在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
- R7 L5 y/ B3 y* Ofor /r . %%i in (.) do echo %%~pni
! c7 G& c6 w* d5 \/ C显示当前目录名和所有子目录名,包括路径,不包括盘符
: U: M! X( H6 O9 Kfor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
- ~& x$ Y' V- [4 J把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
" b8 J" q/ m# h5 S; @for /l %%i in (2,1,8) do echo %%i
+ u f+ F1 Z$ J7 w生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1! I8 K% d0 p$ Y
for /f %%i in ('set') do echo %%i
9 R/ \2 @4 @" M6 }4 g对 set 命令的输出结果循环调用,每行一个0 X$ r' i: J( Q2 R! M
for /f "eol=P" %%i in ('set') do echo %%i0 ~( a9 ~9 X* c9 R$ m/ i S
取 set 命令的输出结果,忽略以 P 开头的那几行
: b/ x" w2 E b1 n1 S, u I: vfor /f %%i in (d:mp3.txt) do echo %%i. x. j) O) Z% e9 `7 }
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
5 Q6 y" U. q. C9 w3 Efor /f "delims=" %%i in (d:mp3.txt) do echo %%i4 ?* A" ^- C/ S9 I z: Y' [" q
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
8 V# l, c( r' t: }for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a1 {3 G6 @' J7 v" a+ _
对 dir 命令的结果,跳过前面5行,余下的每行取第4列5 p( h8 J1 @* Y2 s* n# S+ k
每列之间的分隔符为默认的"空格"/ e9 \' I9 k2 Q" k
可以注意到 dir 命令输出的前5行是没有文件名的9 d! {% p" k) D2 E& h
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (4 r6 A y+ C2 p5 Q& R5 s/ p8 {0 W& [9 Q
echo %%a$ |# { h5 @; a( m
echo %%b$ ]- g' A; `6 ^& E: M. `9 {
echo %%c" @ p, @6 B" p! d5 T9 s3 T
)4 Y' Z5 i% Q6 q! O- j
对 date /t 的输出结果,每行取1、2、3列, \& H- a7 ^3 Z+ R
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列2 X% {3 N" P$ m* \; @5 [
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"6 B2 g1 [- r3 P* _+ s9 {
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
B- v" ]( S# ~% Cfor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
- C: N2 a) t' K3 m! I取第2列给 %%a ,其后的列都给 %%b
% [: I7 _ e1 O! I; @2 `
9 a' o+ y+ {8 t2 `4 t38 subst (外部命令)0 d, ^, z. u- O3 D2 g
映射磁盘。
6 t$ e, V6 a& u3 ?subst z: serverd #这样输入z:就可以访问serverd了" ] F F' a r- W
subst z: /d #取消该映射
# u7 w; @5 X V$ B7 P! h8 }subst #显示目前所有的映时2 D$ t( v4 |) W) g, `* g: T8 [
; h# R$ F; } N" w7 {
39 xcopy (外部命令)# Q) ^% f R& w, D3 b6 o& ~
文件拷贝
# W# J% D* }* C% Z0 dxcopy d:mp3 e:mp3 /s/e/i/y
- P0 D/ L6 n* Z% S. d复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件$ D! P6 L7 ^$ k# T0 M% r9 n
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
% H) O0 i/ c% H' P0 T( ~ v9 t# S; d1 p
9 u, `) l9 d0 N2 l0 O$ b常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
) b$ ?) J6 h4 C! g7 W5 }- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:% M6 l3 B: d3 b$ Q
5 Z# F. R9 Q6 {9 m* o
@echo off
2 A- w# ?. W" F# n4 W% Q* H4 I' Mset p=aaa* I5 t4 [% d8 [$ a# M9 ^" i
if %p%==aaa ($ ?) ]( m9 g# ^, t# U
echo %p%4 U. Q2 P: _5 Z1 y- v
set p=bbb
5 H$ e3 O& c, f( q& N( T& E9 ]6 |echo %p%. h" n# v$ M& p1 `- H; x" Y3 ]
), [( Z- A% ^9 r1 f2 y( b
pause
" q$ a$ T5 A7 {$ ]* K( R |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|