|
|
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!# S' ^8 l+ w0 a
前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效) r( m) }% a- {% I4 o1 {
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
; p* @+ ]* a S$ W) `名为bat 目前比较常见 的批处理包含两类: 2 J8 t) T0 B2 o( V4 v+ i
- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
: B& U' g; K4 e
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的8 m9 c: ^* U, ]' `" ]2 Z
命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
8 I2 E1 O, w: x& k2 L5 r 怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
% _8 c. O/ l# }' S m 批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set
3 x7 c" g7 @. v2 A. {) O 批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||
* [6 J' Y9 i8 @# E* X9 b 常用DOS命令- 文件夹管理:
$ e& B# H& o# r& i+ j/ ]- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。
9 K5 l1 [3 Z; @, K7 c
- 文件管理:
; Q8 j4 a" T; {4 O- z! m8 k- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同
) T! f5 g1 G; w& G5 L3 p' m
- 网络命令:+ K% k# w3 ?* i/ r4 q& S
- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表
2 V! e) }* [0 e, z
- 系统管理:' x) i7 ` j" Y! i: ?3 u- L4 }
- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置, B7 g- t: G2 [. T+ ?
' W7 P/ ^. X5 ]) u* h* Q9 Y1 O7 S
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /? ( N8 v \- K) I. @0 R; i
9 H; u& V l6 m# L4 p: d# s
Windows Batch 常用命令
2 y% A u' i5 ?( g2 o' [1 echo 和 @
6 [9 e! ]5 q6 k$ ^; y a" q( F, _* p% T回显命令1 H7 s! N5 ?% {
@ #关闭单行回显: j7 c! c5 f' ]5 k5 @
echo off #从下一行开始关闭回显; d, h+ p2 z. K+ W, D, u$ C
@echo off #从本行开始关闭回显。一般批处理第一行都是这个
- O8 q |, W* L& _" p( ]" hecho on #从下一行开始打开回显
0 m/ H1 U7 _1 P' E. O6 Z z& gecho #显示当前是 echo off 状态还是 echo on 状态
! o$ i b" h% {echo. #输出一个”回车换行”,空白行' O: e4 z! W: H; V W
#(同echo, echo; echo+ echo[ echo] echo/ echo), b; c4 ]: f. j4 d# v' H
8 b5 j; \2 y5 W+ Q
2 errorlevel& V3 d# h" d- x& M1 ]9 |: d
echo %errorlevel%
, ?% d8 r3 S' U" {每个命令运行结束,可以用这个命令行格式查看返回码# q6 U- \3 v1 |. _! K
默认值为0,一般命令执行出错会设 errorlevel 为1
X) l# E) \/ Y; A/ P! o$ B; }7 A7 O
8 U" L; g$ c% }, a1 u0 M$ z) g3 dir
: f0 S# c, a4 \5 O7 N# V显示文件夹内容
* c) H" r, l* y6 K# Edir #显示当前目录中的文件和子目录
% d/ [/ U/ c# `, Sdir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
% f! z5 M2 { m/ p& @, a- s5 B( xdir c: /a:d #显示 C 盘当前目录中的目录( F1 n7 K0 J" H8 K( a, D* I
dir c: /a:-d #显示 C 盘根目录中的文件
]. z! }1 W/ O2 p ~dir c: /b/p #/b只显示文件名,/p分页显示) {# A) v' g- @+ `9 U
dir *.exe /s #显示当前目录和子目录里所有的.exe文件# Q% s6 u7 e3 X
/ a( H9 Z" ^, h* `- \4 G: ~! Q
4 cd
3 Z+ z0 a, ]1 y6 N5 P4 ^3 h切换目录/ d3 ^) j# z) e" l
cd #进入根目录
" J! r! v3 A9 g% ~& u7 ocd #显示当前目录! c ^1 H- E" c/ ]: I; h( {$ [3 i+ O
cd /d d:sdk #可以同时更改盘符和目录
+ }- }- }! u6 d7 e
$ M3 R/ b$ X6 H2 V/ D8 Y9 K5 md
$ x |7 \% [6 j3 ]创建目录) a5 s/ w% _; c' \, ]! B
md d:abc #如果 d:a 不存在,将会自动创建中级目录! }9 @/ q9 M1 B+ K3 H
#如果命令扩展名被停用,则需要键入 mkdir abc' ?( W# i" L& Y& a( {" S f
& D" W! R3 S& d$ l
6 rd
+ \+ I" y' o- `删除目录
9 l6 h# x$ m: ^8 ?- V) _rd abc #删除当前目录里的 abc 子目录,要求为空目录9 m$ n- ]3 U) y4 Y! N
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
3 E* d! w, Z# T* |# v9 [
+ h% q a; X* X* L2 g" O' \2 A7 del
/ M( W$ v' `! }- ]删除文件: @; P' e9 s- A# |, p9 ~' P* ]
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件* a" `& s# }: f: L
del /q/a/f d:temp*.*+ M$ U* j( [8 f2 J ]
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
) i6 u' b6 m! f/ c* M! f0 adel /q/a/f/s d:temp*.*
# l. V$ C3 w7 R2 d删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
( c6 R6 j; f( X( P$ j# @: n9 F: l% ^: t
8 ren
! r$ u$ z0 K" x重命名命令 M$ B: z$ @/ ` d
ren d:temp tmp #支持对文件夹的重命名7 D( s3 i6 r+ e
, j. q6 a: |& K( x2 [9 cls
0 \" V7 c' U; q, v$ m9 U8 U. v清屏
) I) X' m! z! ^5 T10 type
- E- }! `( H; U, V- L; o$ O7 c显示文件内容
- _% {& y$ n5 Y1 o9 Atype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
0 L- E% U! D. R8 v y3 |type *.txt #显示当前目录里所有.txt文件的内容
+ A: y" _3 ^: b8 E- i6 G
6 h: K+ Q: `, }/ {2 G5 \11 copy d" g1 a; B9 y0 Z S" f( g2 Z4 `$ K
拷贝文件# X2 H s: d. n9 t
copy c:test.txt d:test.bak% `) D% ~ W9 `# t v j9 y1 k1 f
复制 c:test.txt 文件到 d: ,并重命名为 test.bak
, o( R# y. h+ [; o" | S" Ocopy con test.txt$ P! s" i# q" Y9 d- m/ D
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件# z& H5 Z! D3 {% X9 D
con代表屏幕,prn代表打印机,nul代表空设备
5 W2 z8 N+ g$ Y: Dcopy 1.txt + 2.txt 3.txt
0 `# [( O5 T0 L9 G7 E \/ c6 w合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件9 O! J3 D b0 L. r. D* v
如果不指定 3.txt ,则保存到 1.txt7 J' V5 @' V z- G, k4 J
copy test.txt + S; y$ G# d9 S* J
复制文件到自己,实际上是修改了文件日期# ?3 Y! }% n7 f* u" g4 h
) t a; Z+ P' X1 a. c12 title6 J3 |: z# w) t+ k; Q$ Z( ]
设置cmd窗口的标题7 H( _% y" S: p/ P
title 新标题 #可以看到cmd窗口的标题栏变了0 M2 P$ A. i' D R) E! @
; H5 S2 e8 V2 }$ {
13 ver
+ \5 U& `/ c: q O* A0 l显示系统版本4 P/ ~. ] `% ~: V. U0 R; `5 e
! i9 C8 p2 t ]9 q0 Z4 ?6 c! y14 label 和 vol
0 V4 b1 ?6 `& [6 Y% e设置卷标
5 ]8 w# b6 q& E4 g- mvol #显示卷标% h& ^6 D3 B1 w$ R: v M
label #显示卷标,同时提示输入新卷标
s0 v- ], b# k3 l) flabel c:system #设置C盘的卷标为 system3 b1 Y" c! i6 q: U3 }. [' m
( P6 v% I2 z* r6 ]
15 pause+ K' K1 G0 c" s
暂停命令$ K1 ?! ]5 x( C4 Q( a- l
5 S- n/ o: X' S: Y0 Z16 rem 和 ::
6 F- s5 T3 K3 }5 m$ h+ s3 x注释命令: o L8 l9 O1 a. c% k4 H8 {: H
注释行不执行操作
; O! o* _& Z2 j Z" K/ w- f+ M. p9 |: K
17 date 和 time
1 }. c l$ F/ x% [* f日期和时间. U6 ~; o+ h" A0 W: ?
date #显示当前日期,并提示输入新日期,按"回车"略过输入8 K- ?! t' e3 b' a. k
date/t #只显示当前日期,不提示输入新日期
, v: X, a5 T7 E4 g3 K4 }" I& Ptime #显示当前时间,并提示输入新时间,按"回车"略过输入- I/ o h/ m7 R: d- `; u% o
time/t #只显示当前时间,不提示输入新时间0 I5 R% p) h$ N- X* F" O
) F9 f6 h, H2 C$ m" D7 A
18 goto 和 :
0 ~6 T6 d @7 m) D. E! l" Z* V跳转命令
2 Z6 }2 A l, G- Z+ L2 b$ ~2 l6 F8 I:label #行首为:表示该行是标签行,标签行不执行操作$ X4 L5 F& n G& A
goto label #跳转到指定的标签那一行
' K5 p! Q! ]! c- O5 k/ e2 k( l) p0 Z& c9 f$ w7 A0 z
19 find (外部命令)- m6 x* a3 J4 ]" Z3 }% m2 W
查找命令
2 v; s2 L- U) i3 r; T( nfind "abc" c:test.txt
/ `8 `4 ?0 Y f0 j" A$ `# S. D在 c:test.txt 文件里查找含 abc 字符串的行- u1 ?0 e1 h) C' Q% M' j: _. Y
如果找不到,将设 errorlevel 返回码为1
! ?' _0 M& L6 Dfind /i “abc” c:test.txt
$ A/ |& c# x0 |7 f+ D# ^查找含 abc 的行,忽略大小写9 J* I1 m5 ^) D
find /c "abc" c:test.txt
* l$ T3 d6 S! {" |8 |显示含 abc 的行的行数7 g, c- O! A8 P4 _9 Y2 a! k
+ w, I. j9 y" @6 u" k/ k% f0 Z20 more (外部命令)
) w% r4 W$ F3 V- X/ g6 e逐屏显示
! g; K. U% h+ \$ d* ?! I( Nmore c:test.txt #逐屏显示 c:test.txt 的文件内容
T' \+ b! C4 ]' K: s
4 d# e: g8 {* |1 p) W( ^9 n21 tree
9 k d5 _4 t( \+ M+ K显示目录结构
. P! U! T* f% A6 }+ I* ltree d: #显示D盘的文件目录结构& c# v1 t" O3 g4 B
N8 P& q' K# N5 p6 b4 w/ l22 &, ]) G" H8 e! P- o
顺序执行多条命令,而不管命令是否执行成功( G! X. P% H/ G' [
/ N; H+ } J2 e. H$ K5 x0 v% Q23 &&8 C0 _$ x4 I$ Y7 e6 x, n( O5 M2 Y
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
, F- k2 E s Q" j1 N) B. Zfind "ok" c:test.txt && echo 成功5 E8 _+ @* J9 N& ]+ l6 Q
如果找到了"ok"字样,就显示"成功",找不到就不显示
! |. S/ p: A% g. @3 d- M( c2 L9 h" B6 k
24 ||' N/ i$ N* Q* g4 Q
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令/ \* O* \3 M6 A
find "ok" c:test.txt || echo 不成功
0 |- p- W7 ]1 |$ U) P8 R* q如果找不到"ok"字样,就显示"不成功",找到了就不显示
- p2 E1 c2 @+ D, N
) x# I, t# g, d& J7 U% o$ H/ r. D/ v25 |
0 p* X0 X+ t6 e5 i* u, o; U7 U管道命令5 t8 R5 S5 N P+ X4 d6 a
dir *.* /s/a | find /c ".exe". v, c3 Y+ S- X* y4 m+ n) E( m
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
$ k* n6 k& @: e7 j3 x6 }( _该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
! g8 S i: e6 t6 u0 _$ z* atype c:test.txt|more
2 D- J8 ^0 u4 M, X" u这个和 more c:test.txt 的效果是一样的) ^# p. C8 X" e& y
! B: y4 c6 v5 x" }5 N, A; ^0 `; s
26 > 和 >>
! R' C. Y6 }' e$ C输出重定向命令
+ U" t8 [5 F( ~ l: w> 清除文件中原有的内容后再写入
* X& L" k8 ]! J; A>> 追加内容到文件末尾,而不会清除原有的内容6 G6 } |/ p2 P4 B' Z
主要将本来显示在屏幕上的内容输出到指定文件中
! r3 U. S8 I) |2 F& c: h S指定文件如果不存在,则自动生成该文件 ?3 C8 e* M+ J" l7 Z" E
type c:test.txt >prn) w* ?* e! |, S' U6 p, v4 E/ e
屏幕上不显示文件内容,转向输出到打印机
% q+ v& f- Y. lecho hello world>con
) T* b, F. n- \' G. z6 D/ f在屏幕上显示hello world,实际上所有输出都是默认 >con 的* C7 H: I+ L9 W
copy c:test.txt f: >nul
" ~+ O3 o {1 z& @5 U拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
3 g7 [6 c& S* E: ?& F2 Tcopy c:test.txt f: >nul 2>nul2 A( ~* h; T$ T$ X/ _# A; S
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息 f) L! k6 U5 L5 I9 b
echo ^^W ^> ^W>c:test.txt
' k2 u6 B* P& l) J% l生成的文件内容为 ^W > W& n3 L+ e) t2 x0 ~) W5 L; c& m4 U
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号; ]: S7 i- H/ N# G# O
- a0 e6 @; z9 n3 s9 E2 c27 <9 {" W. p; {& z+ o Y
从文件中获得输入信息,而不是从屏幕上
1 V9 v( [3 B b8 A- f4 K一般用于 date time label 等需要等待输入的命令
5 t' P# y1 q" z& H' S* J$ z@echo off+ V6 a' B& w; ~+ b
echo 2005-05-01>temp.txt9 w5 p& L- W6 L; o$ o0 E' a6 Q
date <temp.txt) G. z& H: B( Q) U# Y" K/ S
del temp.txt
- a3 E8 {* h9 i这样就可以不等待输入直接修改当前日期* ?: p% R' M7 V! p
. r5 X# Y# F N9 } P- V0 u28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*/ D- g! A+ K o$ A" i6 U6 H
命令行传递给批处理的参数
- P$ }1 {/ f8 l7 C( [%0 批处理文件本身 I) z. X- R% v; S% y- g
%1 第一个参数, ]2 n# |' p) j& j+ q" M- N" W
%9 第九个参数+ N. e; P. O. ~$ C& V* z( L/ x; U0 V
%* 从第一个参数开始的所有参数
, ]( M) E2 Q7 S9 T; y5 X$ P批参数(%n)的替代已被增强。您可以使用以下语法:
, u# I) A: B' P$ i# P9 O%~1 - 删除引号(" ), 扩充 %1
3 N: _/ K+ ~0 x$ I6 ~%~f1 - 将 %1 扩充到一个完全合格的路径名
o3 U$ i' e2 C% M& h: o9 K ?* \" p%~d1 - 仅将 %1 扩充到一个驱动器号6 X k- @+ g; ]1 u
%~p1 - 仅将 %1 扩充到一个路径
- l: E. G3 w5 A) p2 {" g& O) Q%~n1 - 仅将 %1 扩充到一个文件名
' E# }% a9 `5 U9 f$ H( }) r4 P%~x1 - 仅将 %1 扩充到一个文件扩展名& h$ l/ o7 h) ~* R) M" L: J
%~s1 - 扩充的路径指含有短名 i i) M& b) p3 l
%~a1 - 将 %1 扩充到文件属性
% Y4 i" S# O. e%~t1 - 将 %1 扩充到文件的日期/时间; ~/ X9 A3 N7 J# u
%~z1 - 将 %1 扩充到文件的大小
4 O5 W7 e6 R( q/ Z3 i: W1 g$ D%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1# h4 R4 j7 {6 Y! l
扩充到找到的第一个完全合格的名称。如果环境
! N1 Y( \% f- K! v. E) t) z& r! }变量名未被定义,或者没有找到文件,此组合键会1 l3 I9 T. w. N- c1 z6 O
扩充到空字符串
2 K; d n8 F. h" Y) T8 e# M1 M: Y可以组合修定符来取得多重结果:# _" M! [6 \4 x
%~dp1 - 只将 %1 扩展到驱动器号和路径
4 M' E: N- R# i. Z* Q0 [8 u0 W7 R%~nx1 - 只将 %1 扩展到文件名和扩展名
" V D. {+ M6 G9 \%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
+ D' j' N* u9 z, B6 y并扩展到找到的第一个文件的驱动器号和路径。
, E) m/ a( _/ x$ B. \%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
]/ A1 m8 b4 v+ M% o5 r3 R9 b可以参照 call/? 或 for/? 看出每个参数的含意6 A2 c$ w; o8 r: L3 }, F
echo load "%%1" "%%2">c:test.txt
6 G6 c! Q* \+ Z; E/ x7 Y生成的文件内容为 load "%1" "%2"2 w C2 y9 i7 [9 @# S" |4 E! p4 G
批处理文件里,用这个格式把命令行参数输出到文件
/ E! {4 J+ d L2 g
: k3 i+ U! b3 P% z& r8 Y; m( I29 if* S7 X* o9 \) h9 @% v
判断命令6 h3 n- r. E- v! |* Z D
if "%1"=="/a" echo 第一个参数是/a
; W; a, s1 H5 M% ?/ v8 e' vif /i "%1" equ "/a" echo 第一个参数是/a
* k- n1 G+ @% P/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?9 z0 z) m: G/ i3 w, J$ S
if exist c:test.bat echo 存在c:test.bat文件" e0 w) v8 H- ]2 F
if not exist c:windows (! D6 t# K9 y% C' h9 @7 N% P- D
echo 不存在c:windows文件夹0 J# `& h$ _ _4 P
)7 h. J' T$ N: y6 @# o+ u& }
if exist c:test.bat (
- ?& r+ ]& O$ n4 n Oecho 存在c:test.bat
) l. s" I. `$ a5 N$ C- t) else (
7 i" V: A- j% o1 Cecho 不存在c:test.bat' S! u- o* g3 ^# e8 D. R
)0 }8 C) A- ? g. x
30 setlocal 和 endlocal
& m/ n0 |+ H. W( z设置”命令扩展名”和”延缓环境变量扩充”5 c" V- t& B" O3 v$ \, e4 x
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
4 y& m" @# `2 eSETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
/ R, m; m$ @- l s3 e O: @2 NSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
2 h* |. Y- X! L: f- z6 f9 f6 @" hSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
9 L* O* }# W( R* ]ENDLOCAL #恢复到使用SETLOCAL语句以前的状态
5 q1 Z$ M2 {5 A3 K- E“命令扩展名”默认为启用2 y% W1 [) } i+ b/ D0 P
“延缓环境变量扩充”默认为停用
2 J* z7 P" p# f1 P% u( e$ O批处理结束系统会自动恢复默认值: v7 @- z6 z3 X5 {
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
6 {6 D" _" b8 ^3 s+ D( I序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
- p- ~( q9 w( G0 t5 d0 H保程序能在其它系统上正确运行
4 Q( Y: b, q4 z! r% X- D) \# v7 P"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
* Y$ I3 Z, i0 r/ t0 {5 j' P
2 T ~8 Y2 x5 q31 set0 b6 o1 N4 n: m
设置变量6 W% F5 \# S( x
引用变量可在变量名前后加 % ,即 %变量名%
8 ?% ?9 { C/ T# k! M- N+ ?$ pset #显示目前所有可用的变量,包括系统变量和自定义的变量
3 X7 P6 A1 x8 ]/ ]) S: oecho %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
0 v/ e$ \( H+ q% \3 y9 rset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
" C7 A2 X0 B" O3 aset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2- n8 g' `6 I; h
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb21 h3 {, w! s H* n( M8 [( X) h1 l/ ~. ~
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb27 n$ [+ ^' j7 O3 Y1 J
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2& g% U+ V' c/ R7 o- E7 H7 n
echo %p:~0,3% #显示前3个字符,即aa1 @$ q# Y. _$ {- S, ]
echo %p:~-2% #显示最后面的2个字符,即b2
0 Y6 y3 E1 a' m2 ^- b# Vecho %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b3 G1 p* e4 K p* C" m2 [
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb29 @# T' a u' b' Z/ Y" {
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
9 `7 B- _0 s3 c7 } ^8 q5 D/ \ Hecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
* |- Q Y4 d3 [' E% a+ q& _5 wset p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb20 @1 ?# v: `1 A$ A& H0 {% B
set /a p=39 #设置p为数值型变量,值为394 |" S' ]7 K% B# j6 i
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
4 Y9 C% i+ } G/ M: nset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用/ c- ?% V& }% C- W5 i
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?$ t: M" [& V" g Z! _' H
set p= #取消p变量
: @' M: L$ L* c0 Dset /p p=请输入7 p8 e ^0 c: m) R# P& g5 c M
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
$ z5 @9 ~" C' u3 q. V7 _注意这条可以用来取代 choice 命令
- ~& l- K, P) p1 y9 X注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
6 q) f1 I) D' Z/ C( Q6 I2 a@echo off9 ?5 c3 t5 ] z
set p=aaa% n6 u- O6 f' \" |) b. _+ {7 u* ^' f
if %p%==aaa (; `3 J9 ~1 e9 b: @
echo %p%
, ?# q' x2 p% o4 r( p0 aset p=bbb
+ K- F9 j6 ]# N8 W) d# h* xecho %p%& D; Y: S/ O" e7 }7 q2 _
)
% W, b. U! D, Q* C% F* O结果将显示1 W6 K% r c8 t! \: W5 L7 i
aaa5 `& U8 g# ?- h" U6 e
aaa& R" j% n4 I D7 G. g
因为在读取 if 语句时已经将所有 %p% 替换为aaa
2 K5 \8 Z; l/ W8 |; ?这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"0 j' n; b' S; C: f ?$ ?
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
2 x0 d x; [& |@echo off& H. _, G! d$ U. }' M7 c. |$ g
SETLOCAL ENABLEDELAYEDEXPANSION& T2 C% {: g1 L. S
set p=aaa
& t8 y: Y( G) H/ g2 j- x4 y& Mif %p%==aaa (, J8 k6 h* r! @8 \6 E: X
echo %p% e+ _" S& b9 x9 Z- p8 S
set p=bbb
3 N1 Z# h6 a, V& m0 vecho !p!: B, O$ u6 o( y7 u& a
). w& H4 W: y( h, L/ d$ p
ENDLOCAL4 ^4 z+ O6 A1 j6 D2 y( U& t5 X7 V
结果将显示: { h9 d6 o) P/ E) U. w
aaa
. D4 q: p. a; L0 j$ p) Ibbb6 I7 x' L5 t0 V- [ x- y3 `1 t: t
还有几个动态变量,运行 set 看不到
$ p) o* P1 D4 H%CD% #代表当前目录的字符串
4 M8 X2 s- Z& r/ g& b% @%DATE% #当前日期6 Y- [/ K9 Y( v2 b
%TIME% #当前时间
7 T/ t( T+ o5 Y%RANDOM% #随机整数,介于0~32767* d+ I c1 Q% i# o3 P
%ERRORLEVEL% #当前 ERRORLEVEL 值" g/ Q9 v. t! Q
%CMDEXTVERSION% #当前命令处理器扩展名版本号8 f6 e2 K8 K; R; |! K3 G
%CMDCMDLINE% #调用命令处理器的原始命令行) f; x: I2 J& Y5 y7 |
可以用echo命令查看每个变量值,如 echo %time%
+ X) V t q- n r2 A注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到+ h4 o, g) a8 J& O$ r
* o5 Q. T: B5 n: J3 A32 start
# l7 k+ }' P1 }0 V1 I/ y批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
! i0 H5 u" w4 o2 O) ]& i) Y4 o- H; ?" c8 B
33 call
5 \; n$ E2 V' f3 n) M! ]$ U批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
* e2 l: R! J6 {) j' d2 T8 s; e有时有的应用程序用start调用出错的,也可以call调用4 i2 v A/ D, p, M- r
& u# s7 C& } ]8 G' w
34 choice (外部命令)
9 f1 B& W$ J4 E* k5 P选择命令- q8 \+ M' ^( h# e* ]3 h
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……* @' T6 c+ d/ U( A3 j! e
win98里是choice.com. ]9 O2 i! O7 E6 N. h$ W
win2000pro里没有,可以从win98里拷过来
0 @/ x7 T5 o% k* Vwin2003里是choice.exe. T. C! G" P/ l: _
choice /N /C y /T 5 /D y>nul* A+ O5 V1 i: l7 v
延时5秒
5 a( q+ P! i I! B. h4 a8 n7 F1 h& O$ I- ?9 e. Q) m- K
35 assoc 和 ftype
; R4 S" v9 F [# g文件关联1 ]0 `7 D* D3 i% k
assoc 设置'文件扩展名'关联,关联到'文件类型'
3 b& ^, d1 G/ `ftype 设置'文件类型'关联,关联到'执行程序和参数') q' y0 q* z9 c9 h
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开& Y( `( C' T! p4 A B6 q& F) @
而是先判断.txt属于 txtfile '文件类型'! x- e0 l% O, D+ L4 K$ ]* w) e
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
1 Q2 B% K# Y5 v6 o) o* ]可以在"文件夹选项"→"文件类型"里修改这2种关联6 q5 k8 ~+ t; R& c6 y4 k! G) {
assoc #显示所有'文件扩展名'关联
) H' `) j1 P& G8 T1 S! G4 ^, }3 J, qassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile, b3 w8 ]9 w& J* M; _1 r" ]- o% F
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
$ Z, I8 P6 o8 Yassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
* K- h8 K3 P8 g6 \% F4 t( |ftype #显示所有'文件类型'关联
% M, ]0 K6 v! \. J2 f* |3 |ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
9 W- V7 ~! }# M; _( iassoc .txt=Word.Document.8
& G# Z' x" p5 C) H; g+ V9 q- K设置.txt为word类型的文档,可以看到.txt文件的图标都变了
# Q6 A% U+ P+ t# D! Uassoc .txt=txtfile! B: H% x; Q9 |1 Z0 Z
恢复.txt的正确关联
# N7 s/ K8 \. J6 p6 d Qftype exefile="%1" %*
6 m; ^! [. ]6 S# C: J: _6 j! Z6 N# g% C恢复 exefile 的正确关联
; ~6 y+ c/ O, T- D如果该关联已经被破坏,可以运行 command.com ,再输入这条命令# i* p6 _3 Z8 S h$ e
9 @$ }+ D9 }7 @, O! T f" O36 pushd 和 popd
3 C2 W) E. N# I% {切换当前目录6 {! r8 J- i- U6 F$ P
@echo off, `5 \/ A( m5 \4 `8 a# |% {
c: & cd & md mp3 #在 C: 建立 mp3 文件夹
- q/ z( O# B0 [! [2 z* _/ nmd d:mp4 #在 D: 建立 mp4 文件夹
5 i5 A" b: N6 C" n+ g3 u2 ycd /d d:mp4 #更改当前目录为 d:mp42 ]6 G) Z L( i$ N
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
2 g% L8 l2 U$ L6 w0 e- Bpopd #恢复当前目录为刚才保存的 d:mp4
' E" I- W0 w, b4 V9 f3 o' }- S4 Z5 s6 ^
37 for
! [6 D( J/ q9 R# A$ s' u循环命令+ G5 P7 X; x( G: i
这个比较复杂,请对照 for/? 来看4 e$ ?# ]# S0 W2 l( @2 i- r7 @5 x
for %%i in (c: d: e: f do echo %%i
$ B. q- `# Y" g8 d: i" _: c+ D0 r依次调用小括号里的每个字符串,执行 do 后面的命令
3 q! l N; i0 p5 [" K/ ^/ F X$ ?注意%%i,在批处理中 for 语句调用参数用2个% G/ h$ e/ r: q( L
默认的字符串分隔符是"空格键","Tab键","回车键"; Z, u5 B& |) q9 J3 o2 ~$ W
for %%i in (*.txt) do find "abc" %%i
& @4 j" F i+ e/ N4 u( Q5 i# H对当前目录里所有的txt文件执行 find 命令) i) k( f' K R" J- O
for /r . %%i in (*.txt) do find "abc" %%i
3 C; S( s! b( F5 V0 P: T0 C' T在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行& p3 f, i8 ~6 X9 J9 j+ {
for /r . %%i in (.) do echo %%~pni
& t# n/ p, g: `! o) M2 A* G显示当前目录名和所有子目录名,包括路径,不包括盘符
. Z. U, _: f U6 Gfor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt8 p" B: ]' }/ N; @. |' v
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
0 D: t0 A4 P M6 lfor /l %%i in (2,1,8) do echo %%i2 b+ k+ ~+ \% I2 i5 d
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
7 c% k3 f3 r" l% |8 Zfor /f %%i in ('set') do echo %%i
0 B6 c7 T# y% m9 q# g" q: [对 set 命令的输出结果循环调用,每行一个
/ d/ G2 X8 S) J* y K' g: wfor /f "eol=P" %%i in ('set') do echo %%i J" R5 b `7 z( p5 ]; t
取 set 命令的输出结果,忽略以 P 开头的那几行6 j( o2 P4 c1 M" x- n
for /f %%i in (d:mp3.txt) do echo %%i* D; n; \0 n8 E# N( b& l
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
I! z! g) @4 u% M* W, jfor /f "delims=" %%i in (d:mp3.txt) do echo %%i/ s( p* [. ]: @) L7 d" Y, ]
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称! Z5 c# }! I$ R6 _8 V) X8 ~
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a* K9 z9 d N2 H1 H
对 dir 命令的结果,跳过前面5行,余下的每行取第4列
0 B ~+ J2 |5 e8 `3 |' H5 x每列之间的分隔符为默认的"空格"
1 i2 l- T7 z: v7 j可以注意到 dir 命令输出的前5行是没有文件名的
7 ?* R+ U ~. H) l0 O. J P/ ^1 B6 ~for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
" D7 M9 Z! b/ z4 F$ ?% R# h% M' M* vecho %%a; z! b" a- l `: n% K
echo %%b
4 o0 q$ D% D9 a. I! f: d+ o* s, k" Wecho %%c- @2 f8 |: x6 u8 A1 x3 T( X
)
, V3 n( y% K6 Q- @对 date /t 的输出结果,每行取1、2、3列
! M& S' h1 m" ]$ x/ V第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列 `/ F. d$ \; K, H
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
( r: e8 H8 v$ y4 M其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
0 r' ~2 G" J5 p1 i0 g: M2 c2 |for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
" v3 ^, a7 Z& Z) e# t取第2列给 %%a ,其后的列都给 %%b* g, Y1 }1 W F. `
9 C7 m1 w% J. A3 E% W8 `9 N
38 subst (外部命令)- s) r' I8 T$ c9 [
映射磁盘。* R/ T+ p* U6 b" u" T' O' s
subst z: serverd #这样输入z:就可以访问serverd了# C3 C [+ V" x& m2 E* C6 Z
subst z: /d #取消该映射
7 z: x6 T: n' T# f& l4 ?: o- Hsubst #显示目前所有的映时" ?& q: F- t5 N* F& x( `; H
+ `& A! s' |4 j! X- h" i39 xcopy (外部命令)
7 X9 F3 k" K' n2 V& k2 M文件拷贝
4 ^5 ~+ L7 `7 a0 R" n% txcopy d:mp3 e:mp3 /s/e/i/y" D) ~' @! i/ b1 n8 a
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件( D( B5 p/ P6 g7 p. M2 N
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问) |! |9 E9 F4 t5 Z# a5 \
' i: a7 Z) J% |4 J/ u! L常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
" _! s1 k; r1 F+ l4 w" ]9 J- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:
! E! G% g' B% k, v / w2 N7 a7 @8 |% ?/ o, C' X" W- }( W
@echo off6 t4 T' G9 _! {9 l6 z% S7 G
set p=aaa
/ W- d0 x1 L; n$ P% N' j' Mif %p%==aaa (& F" |0 p2 d2 c' Q2 m
echo %p%; p# ]" b- K0 K+ ^& f3 R
set p=bbb
; s' d4 S3 G# T/ u5 X( R; jecho %p%, q/ u S6 K1 t9 T, ]) T0 Y
)! ^9 p8 b) D: M! l+ f, S: h' D' q
pause ( I! o, q# H% @% v" q! U7 J P
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|