|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!
3 H% _5 V& r& ?$ N8 J5 V! T* I 前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效) p5 v) t6 _2 i/ ?( `8 m! A+ @* u
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
) M7 J2 E3 _! [$ c& p名为bat 目前比较常见 的批处理包含两类:
# T. T G& S/ X- G: |- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
' h' |5 C6 X! ?2 w1 q% k( ?4 h
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的6 \4 g0 `+ \! N2 i
命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
* q* ]5 G( j: [8 }# O" `/ ^ 怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
( d# W' M; a, y 批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set
+ _% [3 P, d! X" W6 K) R 批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||
; y( D6 \: \* |5 E 常用DOS命令- 文件夹管理:1 y P9 H/ W/ s/ K* ]
- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。
8 h* @+ K9 h p0 J7 M, I
- 文件管理:
8 j# w% h2 w9 T2 R$ t- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同
0 M" x' O% d' ^, g( L' O. y
- 网络命令:6 n% J* m& h1 o$ f# Z& Z
- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表
" u7 a( Y) Y# D; s4 Z$ t
- 系统管理:. ?% d2 b2 {1 H5 P2 q* `2 ^3 ~* M
- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置% Y8 u3 |+ l. O* G/ a8 k
7 {' Y, Y: u1 s+ u9 C5 j
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
2 X: K" l% `: q7 M
( O+ |% Q4 |6 o. {: B1 t! X, _8 ~Windows Batch 常用命令. t6 I. S" {, i" t
1 echo 和 @% G; k3 ?, u/ ~* m5 Z
回显命令
5 D) k8 p, U3 m4 E( N1 L8 S@ #关闭单行回显' l6 u% C. [! {8 V: f; v9 v
echo off #从下一行开始关闭回显
' ?( C. R2 S: C" E5 ~) f+ h@echo off #从本行开始关闭回显。一般批处理第一行都是这个& R9 h. y9 B+ s: _6 D' e
echo on #从下一行开始打开回显
5 S' F0 x" N: eecho #显示当前是 echo off 状态还是 echo on 状态
1 H/ m& u8 n' e( l8 L# eecho. #输出一个”回车换行”,空白行; H$ N5 l/ r, H. K' J/ b% R
#(同echo, echo; echo+ echo[ echo] echo/ echo)
& M3 N. }) N0 n
* M2 {- }6 S- M' U2 errorlevel% ]! z! m4 u/ a+ l
echo %errorlevel%6 d. L+ L$ B# f+ v
每个命令运行结束,可以用这个命令行格式查看返回码
' e; }8 }" n8 @9 d' t默认值为0,一般命令执行出错会设 errorlevel 为1/ p/ y* y. l$ {1 c: {
; }# O5 o) }0 s1 d/ K
3 dir
; @/ k H; q2 ?1 w显示文件夹内容
3 K- o: c8 k8 M2 `* i; s+ Xdir #显示当前目录中的文件和子目录
; A X8 g" `. N* Sdir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
- K) |9 [: ]& C5 u0 v" i& edir c: /a:d #显示 C 盘当前目录中的目录7 w; @( T* i% F2 _+ g. C& B2 `7 T
dir c: /a:-d #显示 C 盘根目录中的文件0 t( ~' l' u, b" t% P2 p F2 E$ i
dir c: /b/p #/b只显示文件名,/p分页显示7 U) t0 ]# w$ J) z" S) y
dir *.exe /s #显示当前目录和子目录里所有的.exe文件* y- w7 Z2 N/ k6 p
8 W1 L& ?9 b4 _# z& Z6 h
4 cd
( V' N& C- M) L& z7 L% L( O9 S: H) J# x; V切换目录
% u" o+ ?0 I! K4 _( W& Kcd #进入根目录) f# s+ k6 \% \- N0 F
cd #显示当前目录 u$ P g/ C: p' g
cd /d d:sdk #可以同时更改盘符和目录
0 ]$ z0 i/ Z/ m: b& n. f4 A9 `. t" R E
5 md+ Q) j* i" f6 W- V. ^' q
创建目录: O1 Q% B. l/ p7 }+ x" {* a
md d:abc #如果 d:a 不存在,将会自动创建中级目录
6 Y2 q) U! f: i#如果命令扩展名被停用,则需要键入 mkdir abc7 x) ~/ _3 |) T' Z2 U; Y
, t5 Q8 ^6 n$ Q) v6 rd, o6 r; u: S6 R, S& x1 g
删除目录3 ` E- Q5 u; e& f+ s* l3 W
rd abc #删除当前目录里的 abc 子目录,要求为空目录5 \+ r( C+ w4 K* \! p
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式1 J* _1 x C1 c4 ]! h' m& ~
6 u* E' M& Z$ Z9 R. P; p2 i7 del3 D# e( D# C6 x2 |6 \
删除文件; Z. e# x7 {" W3 m. [6 f
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
3 h9 Q& f, j, x8 L2 U5 ^& b8 x9 Wdel /q/a/f d:temp*.*
8 [5 e/ M% V# O4 m% G删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录) _8 D6 P& R3 I5 t
del /q/a/f/s d:temp*.** r9 [7 }6 M3 J! M) K, p7 C7 ]
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
: R8 ^3 q, w R- w( a; f& w0 b5 W6 G5 Q6 V
8 ren: J! f/ u/ r- g
重命名命令
* D) U ?& N( V' Mren d:temp tmp #支持对文件夹的重命名" Z3 J: K" \( T$ k b
. N% ]1 j0 c: T' |! c( z# @
9 cls
6 g" f4 I' B! j! g! \! e! W清屏$ A0 d) H: W1 M5 y# H1 B3 A
10 type+ N" d, R) A1 u G. F& Z, ~
显示文件内容8 z8 G3 v% N, d1 F* U, B
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码; @% I9 d# B% R' R* L
type *.txt #显示当前目录里所有.txt文件的内容& Y" r% C& z0 d5 ?* v. ~
- c8 v3 W- t) ^1 B11 copy5 J( w. r6 o$ d( V6 D* T& x" o7 P
拷贝文件
, \" j+ r& |" R4 F9 y# Icopy c:test.txt d:test.bak
* l3 T6 J1 D R6 [; N$ N; _复制 c:test.txt 文件到 d: ,并重命名为 test.bak( C! [ I" E( X& u
copy con test.txt
! p; `3 q. d' g7 @# N从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件# a) W/ l, Q/ B
con代表屏幕,prn代表打印机,nul代表空设备
: o& f4 d5 x9 tcopy 1.txt + 2.txt 3.txt
& Z* \; d8 i( Y合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
$ P0 K3 f. |, Z$ x* B3 T2 `9 p5 |4 @$ }如果不指定 3.txt ,则保存到 1.txt
; _& E3 o$ y# n: p4 l- v: ~copy test.txt +* _3 p# X+ m. R2 |( l: t8 ~# ]
复制文件到自己,实际上是修改了文件日期; Q# r) k( N$ k
3 k: Z6 }; R' N# H- l& m& P
12 title" O% s! \4 e4 v$ z
设置cmd窗口的标题5 \& r! L, X" L% k6 ]! l
title 新标题 #可以看到cmd窗口的标题栏变了
9 F Y; b* V% ^. d$ N% R u: p7 W+ U
13 ver5 t" g# W6 S5 M6 O" m# @
显示系统版本! t9 X2 n4 X* H6 \+ V
0 i+ N0 b. ?" v
14 label 和 vol( n! r/ q! ~2 j' E9 S6 ~' @
设置卷标
4 |# ?9 y" L7 O( {9 uvol #显示卷标# f% @! i! R9 }/ M m6 H
label #显示卷标,同时提示输入新卷标) t+ `+ L8 A0 i! \+ h' }. _
label c:system #设置C盘的卷标为 system
0 S3 I3 e+ J8 Y {4 M
! `, Y' V. Q' d" z; Z! F k$ v15 pause
- v. C8 g4 J/ R; \0 g: b* e2 n3 W暂停命令
+ u/ @' C; G7 G- I$ X
. P2 _# W6 X$ V9 H, @4 F9 }16 rem 和 ::& l0 }1 E) H- _! q; v
注释命令
- e. d j; Q' q0 b7 _注释行不执行操作
: s4 r1 s' q6 i) B+ m+ d5 v# a
5 c' k3 m$ U+ \/ a17 date 和 time+ k* d* y: T' q
日期和时间5 `3 t! _8 o1 D' K2 y$ y
date #显示当前日期,并提示输入新日期,按"回车"略过输入8 w$ |- Q. E3 k+ K# @
date/t #只显示当前日期,不提示输入新日期8 U% S& x E, V0 _4 o7 V: o
time #显示当前时间,并提示输入新时间,按"回车"略过输入1 T1 ?8 m$ }* ]) W* l
time/t #只显示当前时间,不提示输入新时间
# p& W b# p! C& [) k( B: S7 a1 L8 o
18 goto 和 :
3 r% E' q- ]6 [# K跳转命令
0 \" `9 \6 z; y: \+ K/ m0 I2 l:label #行首为:表示该行是标签行,标签行不执行操作. E0 z4 p: ^+ a U _# F4 S
goto label #跳转到指定的标签那一行! a9 p8 x! ?5 L6 }+ ]7 p
: v9 T: P5 }2 O
19 find (外部命令)
2 m) E. |8 b( C5 j0 n D+ y查找命令0 V. S/ O5 ?' ]
find "abc" c:test.txt$ w+ K5 N1 n9 E
在 c:test.txt 文件里查找含 abc 字符串的行) s- O9 F1 T8 J3 S( [% D
如果找不到,将设 errorlevel 返回码为1# D5 N9 _. u) X8 e
find /i “abc” c:test.txt
* I: }! B% G7 k) T" K: W查找含 abc 的行,忽略大小写. g/ o; y9 J0 ~% E2 E+ n+ z
find /c "abc" c:test.txt0 a) g! g: f5 }$ Y9 o. `6 @
显示含 abc 的行的行数2 @$ a2 q8 ~% D
& p& _. G. X, {/ `, Y! i) r! g% X& ?
20 more (外部命令) n3 L' l0 z% D# E! Q: u
逐屏显示
' I. W' e. ~9 H& Fmore c:test.txt #逐屏显示 c:test.txt 的文件内容
; K }+ c# r- N) y) V% N& G3 D8 q( O# g) a7 `, |9 C8 ^( s+ X. ?
21 tree
) M# U0 }* \5 g) ]显示目录结构8 j1 G6 E, k, T! s
tree d: #显示D盘的文件目录结构2 I; G2 z/ X% D. b, {3 t) }! Y
) W+ G* j6 ], z; C* Q6 @9 \" c& [22 &* Q1 R# d$ d) V8 I
顺序执行多条命令,而不管命令是否执行成功, {$ e5 X/ Z' P- I; m; @
, g( m! F/ s6 z7 H23 &&
: N6 x5 w, b% q7 h& T顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令" e3 \& W& M: `' F, J
find "ok" c:test.txt && echo 成功
2 A) \4 e. T; ^2 K" R如果找到了"ok"字样,就显示"成功",找不到就不显示
, B) G, b7 \3 ?' z! L; `! F
9 F# H- W. r" b24 ||
& M- ?; M$ U& y* _顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令' I) `+ Z3 S H. ]! t
find "ok" c:test.txt || echo 不成功: ]' A/ i6 h9 t6 T# U
如果找不到"ok"字样,就显示"不成功",找到了就不显示
$ _" _6 Y" j/ u! A2 z
. ~' Q+ o3 O B! ^: x# N+ ]25 |2 A- ~8 \9 n; d# D9 q7 [
管道命令) d- j6 K a% i& e& \
dir *.* /s/a | find /c ".exe"
+ I% R/ A0 E5 R: M管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
1 q, Q5 i7 X* j8 |; r: L a该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
' Z f4 M I6 h5 y1 a# Etype c:test.txt|more* a& R+ ?7 c9 z1 p/ i: d
这个和 more c:test.txt 的效果是一样的
/ ^1 X: k) @5 w8 {/ q4 m( k. H. o! p3 C
26 > 和 >>" t3 {3 c3 S6 J6 G( [
输出重定向命令
* N( A5 W M6 o+ J& t6 f& L: [8 ?> 清除文件中原有的内容后再写入& ~4 O0 O1 z( E
>> 追加内容到文件末尾,而不会清除原有的内容6 o& M( r/ G( A: p8 Q
主要将本来显示在屏幕上的内容输出到指定文件中2 X8 \9 s5 ?3 p% d
指定文件如果不存在,则自动生成该文件
6 H. d4 u' ^: u% [* f- Ntype c:test.txt >prn
5 Y! c3 V7 b3 p! ~$ A% O. U屏幕上不显示文件内容,转向输出到打印机
* i5 C0 C3 z4 R5 }0 pecho hello world>con
; P [% G/ Y% d$ W+ o; u在屏幕上显示hello world,实际上所有输出都是默认 >con 的
, l; [0 S" I* Q* \* u, q9 C: Jcopy c:test.txt f: >nul7 S, W, J4 R, n+ X( M4 k% W
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
% ?2 P$ B) U% V& a- Y7 Q& N1 }copy c:test.txt f: >nul 2>nul& g- ^ `# A- b: D7 B! T
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
' T4 @: C6 J" d0 q. W" {2 O2 Aecho ^^W ^> ^W>c:test.txt
" Y$ h* | Y& x K生成的文件内容为 ^W > W
& N3 S) q5 Q3 t^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号! ]& K; `+ P* F) F
+ Z% \' L; w1 g- g7 G8 v J+ i27 <
! I. n' ^5 x/ z9 k从文件中获得输入信息,而不是从屏幕上' e. x" g+ [/ B
一般用于 date time label 等需要等待输入的命令
- D! c, Y: K D6 c@echo off; o+ ?% G7 Q+ ?+ n+ B& d! z; w
echo 2005-05-01>temp.txt
+ @1 F+ v# L* s9 H+ f/ u3 L" @& R' vdate <temp.txt( |0 i* I) w8 a M/ o0 \
del temp.txt6 r, ?# p4 E- A* g
这样就可以不等待输入直接修改当前日期
# h8 C {1 m3 N0 { H% W
. B% S) ^; |! w4 a: w28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
7 V9 ?; x: m3 T- r命令行传递给批处理的参数
5 G. K# r, @) i; P%0 批处理文件本身, f5 t9 T- }, M+ o
%1 第一个参数8 V" e3 j. w, _& H4 ]
%9 第九个参数. a7 d+ P6 ^) } A" v" f
%* 从第一个参数开始的所有参数& P* g) U9 U6 _. b. H
批参数(%n)的替代已被增强。您可以使用以下语法:. F7 V0 a5 D; U- |; z) v; g3 O' \
%~1 - 删除引号(" ), 扩充 %1, m4 X! V3 v! x3 w! M
%~f1 - 将 %1 扩充到一个完全合格的路径名* e6 {. j3 D. M7 A6 L
%~d1 - 仅将 %1 扩充到一个驱动器号
9 n$ u9 K& c" T3 l: L%~p1 - 仅将 %1 扩充到一个路径
' v3 c' o- a; G: q%~n1 - 仅将 %1 扩充到一个文件名( |2 B2 Y7 r$ J& S
%~x1 - 仅将 %1 扩充到一个文件扩展名
, u6 a+ c. a, S P z2 e%~s1 - 扩充的路径指含有短名: ~7 `* q1 e' Q# j2 W
%~a1 - 将 %1 扩充到文件属性
L: ], _' s4 s$ D1 U- B3 F: k5 ?) B, m8 j%~t1 - 将 %1 扩充到文件的日期/时间
7 D9 M% G3 N1 ~( \1 j( x0 M7 J4 ^%~z1 - 将 %1 扩充到文件的大小( d4 R H. E: C+ d
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %13 f4 |1 s; R* Q$ L. I) t( e' o* i( d
扩充到找到的第一个完全合格的名称。如果环境
9 R0 q5 G- g" i/ u5 Y6 h$ A2 _变量名未被定义,或者没有找到文件,此组合键会3 y3 [$ @8 t% y, z" N' v, ~
扩充到空字符串
) c' f5 k7 F2 ]8 b& O7 E" a可以组合修定符来取得多重结果:6 u2 X" v7 A6 g( R( P0 N
%~dp1 - 只将 %1 扩展到驱动器号和路径
- l. q) p$ u% ?' D, Q; }%~nx1 - 只将 %1 扩展到文件名和扩展名) G3 P, K$ E# K. S0 W
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
; l- t9 c( j* z3 B并扩展到找到的第一个文件的驱动器号和路径。
% M0 c3 K( h. f( N; P# o%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。/ J3 R3 E: Q! ~3 Z& {6 O
可以参照 call/? 或 for/? 看出每个参数的含意" M; j( J( t* f! [" a5 t
echo load "%%1" "%%2">c:test.txt
3 r0 i3 d& i9 j9 n7 C) U. {! _生成的文件内容为 load "%1" "%2"
F) V. e: j: h" b0 p# _8 D% N8 D. c批处理文件里,用这个格式把命令行参数输出到文件9 \ F( T: v" Y4 e9 j6 l0 h
+ ~9 s$ R: }& p
29 if5 H# x' E" K* {) d( A" m; e
判断命令
]9 `* [# i) \% y- J- I1 J7 hif "%1"=="/a" echo 第一个参数是/a9 P8 E+ x, [* o! L* Z
if /i "%1" equ "/a" echo 第一个参数是/a. p2 m P# D6 y7 D% l9 g; ~1 @
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?8 I) U* U! N0 { h
if exist c:test.bat echo 存在c:test.bat文件2 _' u' w6 u- T3 \. R: [; M
if not exist c:windows (
! l8 Q% _2 m" C% decho 不存在c:windows文件夹
' Z- J% b% \ D a). b4 }1 `: i6 z# `4 R
if exist c:test.bat (( |3 m, k: d, u$ K. _7 F
echo 存在c:test.bat
- |/ [2 Z) h- w+ L) else (
/ j- g1 b% }) s( p) Cecho 不存在c:test.bat
1 H+ X. P+ |: [)/ h( P/ W6 g! V: T& m& f2 [: P
30 setlocal 和 endlocal
0 f; n# x; x; u# V' k设置”命令扩展名”和”延缓环境变量扩充”
$ ]- E1 O4 w8 [5 x$ w' e6 CSETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"6 L o3 C9 r6 M U- \% J! M! f
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"% } F/ W: v3 S W) u, Q9 `5 W! _
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"0 A% C, G& J6 g0 _0 o
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
) X& S( A$ L7 \! Q$ F. sENDLOCAL #恢复到使用SETLOCAL语句以前的状态# F2 z5 f. ?' N" Y& t4 q
“命令扩展名”默认为启用* x' c$ h. J; W( P' o, z
“延缓环境变量扩充”默认为停用
6 i# m' X' j5 F. i8 X" L! {2 P批处理结束系统会自动恢复默认值. Z6 E5 Q1 I$ `3 z, \, b9 H
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
9 g) D4 U+ l; {, _+ `* z4 Y序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确8 B% |* b4 j' P6 R4 F
保程序能在其它系统上正确运行
4 e0 r0 ]. x" {+ x& V8 ^"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
& y4 Y2 {' H- M, W; s/ @" e# ~4 m: ^: n& {' k8 Q
31 set9 }/ @3 o. p; T, s
设置变量
- d& T# g8 a3 y4 ]6 i+ I: Z6 |: k引用变量可在变量名前后加 % ,即 %变量名%
: F3 m4 a8 [& B* Yset #显示目前所有可用的变量,包括系统变量和自定义的变量: B i: c; C7 X" n, z
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
: `$ s8 w' L( L3 u0 @1 b+ w, g: P8 hset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1$ X8 C, n) k* n9 `8 C$ [: @
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
# v& T( o$ R2 c5 r* vecho %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
, R( i: h e( u) S% b) g# V5 E7 {echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
# e# J- ~! e0 O) z7 p0 ?% gecho %p:~6,3% #显示第6个字符以后的3个字符,即aa28 N1 n# v% C! K9 D
echo %p:~0,3% #显示前3个字符,即aa1
( ~7 L& Z5 o& i, H5 uecho %p:~-2% #显示最后面的2个字符,即b2. Y1 S" r* X7 {& a8 U' O8 ?/ C! [
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
5 I4 f; G- D+ Cecho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
! F% B! f7 I7 P0 V$ K: w* N. h0 Lecho %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2' M# z' q- t, i5 x" m
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
) K* X3 q9 ?* `; U+ ]1 tset p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
, ?% ]' _) Z3 W% }& r8 i5 O8 Qset /a p=39 #设置p为数值型变量,值为39
6 F8 l( L; ^) k) e$ Xset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
1 `" Z8 l( Q D& ~1 ]( O0 X! N7 C8 Sset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用( K1 i- ]% @6 J* V
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?( Y8 K; v$ Y$ O" n9 H2 X# R
set p= #取消p变量( C3 j5 x, R* K
set /p p=请输入
4 i4 z; W/ L \* b屏幕上显示”请输入”,并会将输入的字符串赋值给变量p$ w' W* m8 g8 o+ M
注意这条可以用来取代 choice 命令
; x+ A- Q- V8 ?! @2 A注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
# e9 r" u& j" b& E- }@echo off
; e& f* A, ~( ]- o% mset p=aaa
& j4 n* v: R1 E7 F K9 Z( i4 W/ O: `; {5 oif %p%==aaa (5 N, c+ I5 V! \7 Y
echo %p%
' G6 `' ]' D" d1 O( I6 g! } F. ^set p=bbb' f+ Z8 x+ L3 j* F/ Q
echo %p%
$ t& M# b. e( l& a" P8 d! Z# k)" m3 ?( G" k& n& K8 p( T! I
结果将显示* d, c/ { m/ f' ~9 L
aaa
& p5 Y/ h; y' }2 iaaa/ b9 ?0 m4 ?. R `: S
因为在读取 if 语句时已经将所有 %p% 替换为aaa; j4 |. t- V6 x7 ^/ v* y. V G
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
3 t$ E2 V$ u# a! J* c w可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
- g: u h% `) e/ r9 D9 Y# t. p. p8 K/ ~@echo off
6 t0 K) X, }" l2 l1 ]) J" w3 J; YSETLOCAL ENABLEDELAYEDEXPANSION5 t. I3 A i# R4 H6 h% {4 @
set p=aaa& H8 X) N l5 h: t p+ k E9 V3 q6 D& N
if %p%==aaa (# `1 O( _! v: f/ N6 |! [( X
echo %p%
9 p7 f# ? J; }# e6 m6 kset p=bbb1 E, s. V) J8 z: K0 s+ _; U
echo !p!
( j( q; K8 I/ [! S% I- s2 a)
% M4 X* w2 u+ F, _$ qENDLOCAL
2 @1 `$ }7 H, j1 K' p结果将显示
$ E8 T' g$ m( Qaaa) ~) _7 |" b7 J% j, t
bbb5 G. ~# p6 |% z" X/ X
还有几个动态变量,运行 set 看不到0 J+ P2 ?# e4 e8 W/ V2 L
%CD% #代表当前目录的字符串: Y5 R4 |/ I, h
%DATE% #当前日期
. ]) y5 Z3 v$ v0 P! _. V%TIME% #当前时间
. a3 g- H- B3 d4 f1 g% b" P* [8 ?$ T%RANDOM% #随机整数,介于0~327673 ?0 Y f" L8 ~2 }' r) Y- d
%ERRORLEVEL% #当前 ERRORLEVEL 值1 Q) w, N* X- i3 r
%CMDEXTVERSION% #当前命令处理器扩展名版本号
' E" d5 C( Q+ r%CMDCMDLINE% #调用命令处理器的原始命令行
0 T B9 P7 }) @可以用echo命令查看每个变量值,如 echo %time%
9 x$ |0 H0 o; F: I5 g$ @注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
' J! n5 `' h# ~/ [0 z; t' L
$ f; @# y$ A- r) F* `: g ~32 start
9 @3 {$ P& X3 b6 r" k/ |批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令9 `- R2 _; T) c
d( J; Y% f0 h- \' Y& y2 |33 call" K H6 {4 E+ C$ h
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
/ K2 a. c; m+ I# c有时有的应用程序用start调用出错的,也可以call调用* t6 U) O" |4 Z1 l, J
$ ^! e( F8 U( e+ z9 \3 f34 choice (外部命令)! m/ g+ a7 q$ A/ _
选择命令5 x7 s) h0 O, o; F; {2 q: Q
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
/ i3 ?& p! h# C9 P3 hwin98里是choice.com
, _3 Z$ v/ h, @$ H [& H5 ~/ b6 o. Twin2000pro里没有,可以从win98里拷过来
3 }; _& S2 m3 ?win2003里是choice.exe" z7 U- N5 a$ e
choice /N /C y /T 5 /D y>nul
! @; R z9 T2 _1 _. j延时5秒
+ {" l/ e' u+ P4 N! p" s0 N4 r1 L: T7 w0 A- }& b
35 assoc 和 ftype8 e: f1 W8 I' m3 T) F6 _
文件关联' J u* N: t6 v6 }4 Z' _* E6 }
assoc 设置'文件扩展名'关联,关联到'文件类型'
0 r; j+ H' h% ~$ P. p: F. j# Yftype 设置'文件类型'关联,关联到'执行程序和参数'2 ~* Z0 s$ | F8 \3 G/ h
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
/ m' I& W9 C9 N5 w& }% m而是先判断.txt属于 txtfile '文件类型'( y( c$ l4 M& B4 }/ d' L
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
, p$ P" _: a, V O+ c4 I, V7 R可以在"文件夹选项"→"文件类型"里修改这2种关联
/ q$ N% @4 }: W; o3 _assoc #显示所有'文件扩展名'关联
& ]5 p/ R- J0 U% f e& e4 Iassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile! {0 O2 g' a- C5 U
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
' I' e7 ^/ W) ]% |+ N' `assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
, [* P8 H! P0 }' Uftype #显示所有'文件类型'关联
6 @) o' O& J( i4 l4 p& x: {ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*8 p) k4 r% }7 }7 O) o1 r" ], v8 g
assoc .txt=Word.Document.8) g4 h! f! P; v# y/ o
设置.txt为word类型的文档,可以看到.txt文件的图标都变了
% B' i1 ?5 D6 G6 [3 p- |: \assoc .txt=txtfile$ v: q8 {! s; v& u; r
恢复.txt的正确关联
c7 B0 M6 r& U6 u5 H. `ftype exefile="%1" %*
2 e! L1 T) _) `2 U) R0 z3 ^恢复 exefile 的正确关联' P% T& @1 E, T
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令. P/ C! L7 D" B, i" X* q
+ T1 @5 y2 N4 k. w C' n" e
36 pushd 和 popd
' j. I# q* z% f) b# z切换当前目录
/ W0 @3 L; r1 m, r@echo off, W# B ]9 m( k) L
c: & cd & md mp3 #在 C: 建立 mp3 文件夹4 n4 K& i; B* X; c, ?, Z2 F
md d:mp4 #在 D: 建立 mp4 文件夹
0 ]5 N9 U* }/ c! p* Tcd /d d:mp4 #更改当前目录为 d:mp4. j/ ?. Z3 R1 l7 b' [- ~8 Y
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
3 S2 A) U# Y$ J; ]: l3 h+ epopd #恢复当前目录为刚才保存的 d:mp45 Z. l7 v/ O5 V( w
. a0 R9 P8 J1 ?/ v* p+ w37 for
3 T: d2 q. M! g3 n循环命令- h, R: @/ w9 g
这个比较复杂,请对照 for/? 来看 U9 r" V5 w( M: Y0 J, B
for %%i in (c: d: e: f do echo %%i& ~) Y9 ?' e& A! |, o7 v( d0 Y
依次调用小括号里的每个字符串,执行 do 后面的命令
o8 k' y p, B4 t注意%%i,在批处理中 for 语句调用参数用2个%
; c. L% P6 y) r# s默认的字符串分隔符是"空格键","Tab键","回车键"7 M2 B; N! \' Z/ Z2 f+ q
for %%i in (*.txt) do find "abc" %%i
: S4 G. t' c, z. Y对当前目录里所有的txt文件执行 find 命令$ n L4 R% E0 a
for /r . %%i in (*.txt) do find "abc" %%i
: T1 f# V% E9 E! n4 V8 \) a; E在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行4 o9 I6 r' Y; a1 @
for /r . %%i in (.) do echo %%~pni. ?7 J9 A8 U# ]5 \) G
显示当前目录名和所有子目录名,包括路径,不包括盘符
8 w& y- q7 x/ ^5 t6 Lfor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
6 c( [7 y) d7 S! p把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去" h3 X H" J/ p
for /l %%i in (2,1,8) do echo %%i$ m1 a2 e9 e l9 H4 s3 ~1 D
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1' O) W9 }2 [" a4 g" |# o
for /f %%i in ('set') do echo %%i
8 N( o$ g) u Y7 F$ H. ?( v# Q5 z对 set 命令的输出结果循环调用,每行一个6 C) n! ~0 X- z/ _$ \- G# `7 y& I
for /f "eol=P" %%i in ('set') do echo %%i
8 S2 I; G& |& G+ D% m" i" [取 set 命令的输出结果,忽略以 P 开头的那几行
! t+ c' B5 `4 {for /f %%i in (d:mp3.txt) do echo %%i
8 j! m( r) w0 @, `& a# @( F9 r显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称: h4 f9 t& n0 E% \0 s; Q/ J
for /f "delims=" %%i in (d:mp3.txt) do echo %%i
+ _$ U) X. I; K8 i! W4 c显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称4 L: Y. ], Q/ H4 I
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a3 ]3 ?2 |6 n/ s- a r+ t1 c
对 dir 命令的结果,跳过前面5行,余下的每行取第4列- W+ \6 M) e9 r/ N! K- b: }
每列之间的分隔符为默认的"空格"% p+ G2 P, [2 |; O, y0 l" i' N0 P
可以注意到 dir 命令输出的前5行是没有文件名的
6 M P B6 n3 f/ l/ Lfor /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (' v8 r) ]# n$ y& K9 L N
echo %%a. S6 F3 s6 e) u$ v" ?" r
echo %%b7 z% M0 E4 l: W7 B
echo %%c) V. X; T- _1 V1 Y5 p
)
( S8 [0 C S `* s1 l7 b对 date /t 的输出结果,每行取1、2、3列
5 l3 J2 ^; o- p第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列0 D1 E# b: W- M- f
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
+ V! n0 S# q) G2 I其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的$ N9 ]6 E/ A6 z
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
5 h* L2 }: o3 h8 g h2 N) k6 X取第2列给 %%a ,其后的列都给 %%b
7 p) b, c$ b" Z% F4 U6 q
( W6 F9 ] J5 z+ Q38 subst (外部命令)
! b$ M0 O( m ~8 w# M2 E映射磁盘。
3 w/ |7 m% Y3 q" i0 c7 X8 m' {7 Vsubst z: serverd #这样输入z:就可以访问serverd了
9 K( H1 i2 ^+ _; z! d6 n9 Nsubst z: /d #取消该映射3 a+ W5 `: @$ v3 j
subst #显示目前所有的映时: E1 d3 f( o8 D
0 D$ z) B# ^' T/ X- L7 P5 w39 xcopy (外部命令)- N' ~- n6 \! {' x0 A4 |5 l, w" N
文件拷贝8 v9 ]7 m* o% ~, ]9 ?; T
xcopy d:mp3 e:mp3 /s/e/i/y
$ f/ P& e' i# L* V复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
* l% `( G' v ~3 |: f- \加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
) F) L5 B, o: W( N1 P, k# b/ H/ h, q/ b7 @6 Z
常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退1 a( d: m# p$ p3 B. A2 Y
- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:, Y) s+ r4 L7 x* W0 _: u. X9 `
4 p7 }0 @" ?+ e5 C
@echo off) K4 b, h5 k+ A% x$ @" e* q+ k- r
set p=aaa' z/ P) o' T9 z8 @9 I' w
if %p%==aaa (4 Y8 H5 k* G6 _! {9 T, ]- p' k6 r
echo %p%
* y2 `7 r9 M+ w# p' u8 d. kset p=bbb
" @5 z, i! w- U9 P/ mecho %p%
" ^6 m8 G" m& V)9 G' D8 [" ^. k, a
pause
截图:
9 A6 `# b3 y7 D: r 2.批处理.bat 文件中输出中文乱码
1 W( Y2 o: `4 @+ R7 x) ~7 f2 u) j- 原因:记事本新建的文件,编码不是 utf-8
- 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
- 操作截图:2 c5 r2 f4 R; J# ]7 B
- 效果截图:) b3 E8 A2 }: f/ ~
- E! X( n* |; @' d2 y) `0 Y! j
' q5 o1 y8 a8 ]; T ! g& a( |6 K2 @5 x8 ~
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|