|
|
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!
8 Y$ l# i9 D, q! M _7 M- z. l 前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效: |9 i" r* ~9 N6 s
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展3 p. }9 Z/ j$ w( T- b
名为bat 目前比较常见 的批处理包含两类:
0 P- S+ K/ x6 Y( u) x3 H- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理( S9 G" w$ p5 W" P6 y! ?$ b( o# {
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的 w7 q$ R x/ f6 Z5 r# ]
命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件 $ F" q- r9 R3 `% m
怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出$ D Q% n1 @5 ]- u! C6 j# Q
批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set2 C9 r( V8 {9 B% p& T/ i# I
批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||
9 i: ^& t% ~9 a& K( x$ R$ M 常用DOS命令- 文件夹管理:! h# V8 v/ J& H7 j, D4 @# S+ d
- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。. q/ K/ }6 b: |1 W4 Y+ H/ \% ~
- 文件管理:; k+ {4 g4 o; `+ K F
- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同# X/ ~! B- f8 H& Y
- 网络命令:
2 ~+ y [ Z; `- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表. V+ H2 o* @8 U, Q$ Q q- |
- 系统管理:+ P2 a7 z4 C3 A3 D' T# H6 j
- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置
$ {3 J, b. B& [: {8 a0 e5 h) d5 `0 h * l+ `+ U7 i3 p8 C
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /? 6 h l' X+ Y7 K8 \+ c% ]* _/ i
5 G0 a( h! |" Q1 N% j3 j4 F
Windows Batch 常用命令
8 z _; u% }5 m( K: ?1 echo 和 @4 C6 L; P$ ?; n. P' G+ d
回显命令
: U* ^7 e+ |3 K6 T@ #关闭单行回显' M: n- o) e) k$ Y1 R* N
echo off #从下一行开始关闭回显
) R; ~+ H. a: _# c$ [) M@echo off #从本行开始关闭回显。一般批处理第一行都是这个
" ?4 E' T t, M# n5 [0 s( Y+ Becho on #从下一行开始打开回显
& N8 x3 ~# \1 R, [echo #显示当前是 echo off 状态还是 echo on 状态. [# r" d9 ]' x& \2 j$ e0 ], D
echo. #输出一个”回车换行”,空白行! W1 q8 f% u- O; T
#(同echo, echo; echo+ echo[ echo] echo/ echo)
' a, W. ^- a G/ @2 E% a6 \* t2 c3 h4 `
2 errorlevel0 M# l+ I, X- E% d
echo %errorlevel%4 i1 Z5 a5 Z. ^( h' F
每个命令运行结束,可以用这个命令行格式查看返回码
4 ^- I, s: X9 u默认值为0,一般命令执行出错会设 errorlevel 为14 H8 ^* {; V* |! Y! v1 e* b+ M+ U
* l! G$ `+ G" O1 R" |2 J+ \
3 dir) S. A! y( e5 R; Z" x
显示文件夹内容; X: R2 l+ |) B- O4 Z8 G
dir #显示当前目录中的文件和子目录
3 G/ u1 K% S8 b0 V4 |! k* P3 v* [dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件, R8 b8 d4 k$ M9 w, q
dir c: /a:d #显示 C 盘当前目录中的目录8 f) ~8 j& {0 P- ^( a% p+ @2 f% R, G
dir c: /a:-d #显示 C 盘根目录中的文件
4 U/ g9 j6 E* ^+ F/ v2 k6 s- Edir c: /b/p #/b只显示文件名,/p分页显示
% C& _ g" R. |& ?: F: r% v3 ldir *.exe /s #显示当前目录和子目录里所有的.exe文件
6 c5 W; c( \% k& v1 s) u/ ]3 u8 ?8 N' W, n1 ], |0 L$ L) o
4 cd
3 U; k v- y1 ?切换目录8 r' `$ I& N, N" ?( j
cd #进入根目录9 }' Q1 s! k8 H( H# E
cd #显示当前目录
# p: i1 `1 }1 I* B' q4 Ocd /d d:sdk #可以同时更改盘符和目录4 P! \1 Q$ `4 E" [" W( W
1 R1 i6 p1 }5 w% }3 s/ \# M) M$ Q# j5 md
- s5 L) z8 z9 Q- o* p创建目录/ q. [( E% ~! D$ J' K/ C
md d:abc #如果 d:a 不存在,将会自动创建中级目录% \7 X: k% |3 F+ z. k4 c
#如果命令扩展名被停用,则需要键入 mkdir abc
/ h% s# n" k" L# R5 M% b5 e* P: O) Y4 k) {
6 rd! X7 W+ |8 U4 q) g$ I
删除目录
) Q7 B- N& m+ @5 `rd abc #删除当前目录里的 abc 子目录,要求为空目录8 w" j6 q& z: c$ s' s( A }& X
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
. Q: o( e; _$ L5 N+ U9 E+ I" ? P. |8 A
7 del
; M4 @& d* m- C, n$ Q0 O) w' H( l删除文件
8 W& _+ d6 Z% i* Mdel d:test.txt #删除指定文件,不能是隐藏、系统、只读文件$ v, x2 X+ X4 v. v
del /q/a/f d:temp*.*
e5 K1 ^4 z& j9 H9 E+ ?: N! P/ N删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录, q" K( k# n$ ?' t* Z& J
del /q/a/f/s d:temp*.*" E1 Q) j+ J% F L- }
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
n. m+ D$ _* D8 \
' X+ m: T* o' z8 X: o8 ren; ?/ U( i) J0 L9 d: I$ F! g
重命名命令/ v+ S- s0 [6 x& I; ~( l7 m
ren d:temp tmp #支持对文件夹的重命名
o5 G$ x' T: I+ @9 o1 ~6 _7 Y4 a% `- b( [- R3 i, P( h4 C
9 cls
3 s/ V; g [/ E5 Y4 @清屏) N* V C. v, ?5 Z9 U
10 type
+ u6 w- r- j7 a( v" P) b# Y) E显示文件内容
4 {/ E# Y- g- D& r" P8 Y4 }type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
9 h: n4 h. \# P) Utype *.txt #显示当前目录里所有.txt文件的内容) h: U; E# i! }; V: T
' |: U0 U% {# K f* ?( p( D
11 copy+ u/ R; H# G6 T% A7 K0 j8 z' \4 @8 N& u
拷贝文件
7 u7 e/ j4 P. k4 b7 o. Xcopy c:test.txt d:test.bak7 M6 i4 n" L" Z
复制 c:test.txt 文件到 d: ,并重命名为 test.bak. B- e" i6 B3 g5 Y9 `
copy con test.txt
: S/ \" d0 R5 o从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件* f4 t, N7 e0 B, p* ?
con代表屏幕,prn代表打印机,nul代表空设备
* C4 c4 i$ Q3 @! }' q& n9 d$ Icopy 1.txt + 2.txt 3.txt
4 v3 P" ~) V, S, W. y+ V3 [合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
! m, s' [- l. T& [* S8 \如果不指定 3.txt ,则保存到 1.txt
4 l+ Y$ Z9 I2 d% t1 a1 Ncopy test.txt +
' X$ f) o4 i8 L0 j8 `+ z) t( M- r复制文件到自己,实际上是修改了文件日期 i+ r& Q3 q8 y) z' Y/ n
( t$ N A# V8 X }4 B% o. O
12 title* e! o% W# A3 j# Y9 @$ |" b" x
设置cmd窗口的标题
' Z& s, u# c* X# ~title 新标题 #可以看到cmd窗口的标题栏变了! ~% v3 Q* B v7 Q
; i- y# d7 L q$ ]13 ver% X! V1 T/ R9 R7 H5 E& P. h1 i
显示系统版本1 n$ Q2 z |0 W1 n1 i0 [
! l& s5 ~. C4 m: P; S
14 label 和 vol% G& e2 g* k+ [" X% W M8 K
设置卷标6 v3 F: { t! t- n0 C" r. N, m
vol #显示卷标
! U! M i3 K. P( Ylabel #显示卷标,同时提示输入新卷标6 Z& G q8 o' B9 F @
label c:system #设置C盘的卷标为 system
" k1 O/ n' e! Z' j7 G6 [. ]6 R0 u
$ m7 @: [0 r' J1 h8 [15 pause% {3 B- k }$ l3 X7 v
暂停命令' Z% U3 D& N5 x! H3 M& E
0 O* t; ?/ v! I ]
16 rem 和 ::; `& _- [. Y( H
注释命令
5 Q: z- S( ] X$ o. E' F( Q注释行不执行操作$ A% d3 `; N" b8 C
( e( B6 W! \8 P: A ^5 H: w
17 date 和 time* A) k: Q6 Q' J" h4 o, N: _
日期和时间9 I! z \" w) o% G- o
date #显示当前日期,并提示输入新日期,按"回车"略过输入/ z6 K2 c2 s9 } @. B. v2 E
date/t #只显示当前日期,不提示输入新日期
; r( {" y. i4 _* s" ktime #显示当前时间,并提示输入新时间,按"回车"略过输入1 W; b. b4 M, _( t/ ~
time/t #只显示当前时间,不提示输入新时间
2 `& g8 E& _& J- D* x9 G( z1 F* k; C0 }* U
18 goto 和 :
/ b& Q8 K n, M6 ?: s跳转命令
6 q! W, D, g$ R; a1 l5 }:label #行首为:表示该行是标签行,标签行不执行操作. D) Z. P; g7 s: g' x$ H3 P8 ^
goto label #跳转到指定的标签那一行- g" e5 C/ _) c7 c# V; S6 T
# D5 {( ?$ C) {1 y19 find (外部命令); S, ^1 A2 [1 V" D2 x* o; u
查找命令
3 [4 {0 j- I# b. H# ufind "abc" c:test.txt
" [) `& l& O% c% P v9 @" n! w在 c:test.txt 文件里查找含 abc 字符串的行2 M, M1 e+ s6 c) p+ J0 ?% [2 B) U' W
如果找不到,将设 errorlevel 返回码为1! v: V9 z" ]2 ^ j- R0 \1 C1 K P
find /i “abc” c:test.txt
. x' K& W* n/ ^$ u( T查找含 abc 的行,忽略大小写) f2 f$ g) |* u( P' G
find /c "abc" c:test.txt' G. r Q0 P/ t, q+ a. D, c
显示含 abc 的行的行数7 g0 ]% k; Z* K4 V# V
/ {- l& ?* ?: b7 w. F20 more (外部命令)+ f% [! z0 Q5 N# { H
逐屏显示: {; T, A( K: j4 ^
more c:test.txt #逐屏显示 c:test.txt 的文件内容! w7 Y/ k1 m2 r4 G/ X* U
' l W& c$ {' }$ N: s e21 tree
$ b/ O: L% b2 u0 ^( f; F w显示目录结构
( M' H( _! X' d* f0 wtree d: #显示D盘的文件目录结构
% y5 S& }- e; ^! n' }, K# S6 ]5 L- U, b. c2 ~/ G
22 &
! Z2 c* E+ c$ L& D) I" e顺序执行多条命令,而不管命令是否执行成功
9 t7 }. K& Z" ^% R
$ W. e6 o9 r$ p$ \' k' f23 &&: f6 |3 E& u% S& t
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令" J' `' A0 ?! e w
find "ok" c:test.txt && echo 成功
& ]5 m4 G* c1 S& S5 D d如果找到了"ok"字样,就显示"成功",找不到就不显示
- G: e5 y* o+ ~; [
9 O1 n9 s' ~4 ?3 b24 ||; V7 X0 P! D* x
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令2 U) `% K9 r/ B( b
find "ok" c:test.txt || echo 不成功
# s. S9 l, o2 u如果找不到"ok"字样,就显示"不成功",找到了就不显示
. F) @2 M. B& z& d& c0 c- F9 S' f* j) @! M
25 |3 A: V$ M2 A1 T, y- \" U" e
管道命令) L2 Q/ x1 J# w7 m6 {( h
dir *.* /s/a | find /c ".exe"
5 c, G) v3 @: B N* D管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
2 ^4 n( T- {* |& q8 y! | @该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数 n2 C2 r% W- a: W' v! p
type c:test.txt|more
) t2 Y- m7 ?3 D' G这个和 more c:test.txt 的效果是一样的
8 h& {" g2 T" q ]! h4 O/ C6 A7 v* F+ D
26 > 和 >># w1 _ y$ `' }& c( }0 I9 Z2 D
输出重定向命令
8 b* j' ]5 T1 g/ O2 z> 清除文件中原有的内容后再写入
2 A& s& A2 n6 T) u% o* b>> 追加内容到文件末尾,而不会清除原有的内容$ c2 @7 c% F+ {$ G: d) w% t
主要将本来显示在屏幕上的内容输出到指定文件中% _7 i8 R3 C( L2 E
指定文件如果不存在,则自动生成该文件
) e, R' Q" p1 g1 p& dtype c:test.txt >prn6 y5 }& d4 S! f/ M4 h
屏幕上不显示文件内容,转向输出到打印机; N0 N# _( o- p7 I$ x z
echo hello world>con$ D* s5 m8 u$ W7 U
在屏幕上显示hello world,实际上所有输出都是默认 >con 的
" b8 j2 |& ^5 C0 ^' Acopy c:test.txt f: >nul* c ~7 l, @5 A) @
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息6 u' n" g/ _) p0 I
copy c:test.txt f: >nul 2>nul% |0 w$ s% R, ` A
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
) P3 A7 C9 u" C/ S9 aecho ^^W ^> ^W>c:test.txt+ X3 x8 s. @6 e2 Z& Q+ T
生成的文件内容为 ^W > W
4 _9 D# W: {7 {. V1 y; N^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号( \: H9 _9 T: K
, V# R, r* M5 l# ?& P
27 <
5 A, R5 Q: P' F3 Z! s$ @- m* u9 m" f从文件中获得输入信息,而不是从屏幕上
& n h: a( |: F* v一般用于 date time label 等需要等待输入的命令
. t- G' D% @% Q/ p@echo off h- ^# h1 S& V# R( @4 `* a. m+ f
echo 2005-05-01>temp.txt2 I; ]% Z: B2 w2 P1 l
date <temp.txt( S. D, \3 t5 C
del temp.txt& r+ b8 h! Z7 s, l$ Z0 j
这样就可以不等待输入直接修改当前日期
. i8 C- R8 p' S4 ]
0 c r5 ?/ c; I) z8 r5 c7 y+ [28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
$ U+ O3 S0 X1 f命令行传递给批处理的参数
* ?, N3 f6 ?+ w# W% m% J5 V%0 批处理文件本身9 J' r7 X8 _3 _9 w5 {: Y
%1 第一个参数3 Q; |9 v- i1 G
%9 第九个参数7 A$ X+ N3 e8 U" W3 x" q, \
%* 从第一个参数开始的所有参数- G6 N* x' i# x$ a
批参数(%n)的替代已被增强。您可以使用以下语法:' n t5 l3 u; A; e4 t& g
%~1 - 删除引号(" ), 扩充 %1# `2 D$ e7 y! P- F p
%~f1 - 将 %1 扩充到一个完全合格的路径名! I" C: u( b4 F% n# [
%~d1 - 仅将 %1 扩充到一个驱动器号
1 s5 p' Z$ ]( r5 ~/ b4 W5 U%~p1 - 仅将 %1 扩充到一个路径% g8 D* ~' m+ M1 h4 @& n0 g) `: \
%~n1 - 仅将 %1 扩充到一个文件名4 O% u9 t- a' f! c6 w- I1 b
%~x1 - 仅将 %1 扩充到一个文件扩展名
7 ~7 a, g- L* m2 E%~s1 - 扩充的路径指含有短名7 P$ I& g$ O- k) h) O1 T
%~a1 - 将 %1 扩充到文件属性
, ?$ T* r7 s0 i h7 x0 f%~t1 - 将 %1 扩充到文件的日期/时间
% Z( n! p5 P6 T/ _5 @%~z1 - 将 %1 扩充到文件的大小9 Q3 z2 \8 i/ d# A f8 G3 `
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %16 n( e% Q$ ]: v
扩充到找到的第一个完全合格的名称。如果环境
; C8 [; S% |: V" k变量名未被定义,或者没有找到文件,此组合键会
. m5 X/ m" |1 @0 R; s( B扩充到空字符串: a. Y9 s7 y( W# R9 d
可以组合修定符来取得多重结果:
7 X$ `& z t% P%~dp1 - 只将 %1 扩展到驱动器号和路径
5 ~0 i7 I. m! a Y%~nx1 - 只将 %1 扩展到文件名和扩展名# g' ?3 n1 ?' O! E+ g
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
+ l" l( f1 k" a并扩展到找到的第一个文件的驱动器号和路径。- R' Y9 ^" A8 W* l @8 F
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
2 H" l4 \: @- K3 U2 H" |可以参照 call/? 或 for/? 看出每个参数的含意# i' |4 d9 O3 g' s" X6 h9 K! d7 m
echo load "%%1" "%%2">c:test.txt
0 f7 P# @/ l* R: L" }生成的文件内容为 load "%1" "%2"8 C$ w3 s( o% f
批处理文件里,用这个格式把命令行参数输出到文件
: v& S7 H1 s% Q y9 D" _
) R" ^) p- @3 r/ Q: }29 if% L/ _! _, a! X9 [* z1 ?
判断命令
- `1 C7 [) n, |) w& U( Nif "%1"=="/a" echo 第一个参数是/a
6 y& s. }1 D! x9 jif /i "%1" equ "/a" echo 第一个参数是/a" q& Q, ^# q3 _0 D# ~$ y3 O
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
6 I: i5 {4 Q- k5 B) hif exist c:test.bat echo 存在c:test.bat文件1 j( t4 `" A0 S- e9 i5 T
if not exist c:windows (
; H2 Q P, D% |0 n' ~$ kecho 不存在c:windows文件夹
: _2 w) y: i" k m)4 e6 f& ~ C# z) _: {' R
if exist c:test.bat (; x8 {' B; V; w* B; G3 w% Z
echo 存在c:test.bat
* d0 L$ }+ ?( @. P* g) else (
/ @. ^! }* w' k! D4 d5 G+ g0 Decho 不存在c:test.bat6 t" p2 i% P4 I3 T; ^, e6 I
)5 e: X) d! r9 e9 n S
30 setlocal 和 endlocal" f$ p6 M3 {! L! I4 B: S# t2 C) Q' X
设置”命令扩展名”和”延缓环境变量扩充”5 s- s7 \/ u r2 l
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
; f: E2 s4 F4 ]# bSETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"- d) i8 R* n& L7 m+ ~$ D. N/ ~
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
* K' D. `" t7 W* V6 d( B9 p( d$ OSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
5 z& e% F6 G* MENDLOCAL #恢复到使用SETLOCAL语句以前的状态
# ?* r- q9 e6 g: ^* z# U6 }“命令扩展名”默认为启用
+ |7 G/ u* ]8 [3 E' L“延缓环境变量扩充”默认为停用
& q% Z- v4 D% R批处理结束系统会自动恢复默认值
# w- E( p: a" ~7 K& W5 [/ R可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程 O4 E0 u8 r& \! j7 B; {% i" _
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确$ w: G( a) G% w" C2 s& s
保程序能在其它系统上正确运行2 C$ U) L# o: ?6 N9 q3 L
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
a; Y5 d* q0 b) z
; z2 s) U& u; L31 set
0 |$ r& L- ^& d8 V1 {设置变量$ }+ s5 W3 e1 J; S+ R
引用变量可在变量名前后加 % ,即 %变量名%6 I/ x4 f, ]( Z6 y! y& P4 ~
set #显示目前所有可用的变量,包括系统变量和自定义的变量 n, Z, M+ l! o' m0 A" o
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用! }# K d* v7 ?; i
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1% E" B0 g+ }9 b3 K3 U4 O
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb26 Z! {0 p0 K0 |% W5 e5 L" S
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2) y" b. L7 X% T7 ~! x8 t
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
2 l/ J1 w3 s1 m2 y" C$ c3 Pecho %p:~6,3% #显示第6个字符以后的3个字符,即aa24 Q; b2 e, h9 E7 a- L5 c
echo %p:~0,3% #显示前3个字符,即aa1
_" m2 b" Q, Z% L. d4 kecho %p:~-2% #显示最后面的2个字符,即b2
- D+ T6 H/ p& i8 f' lecho %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
5 ]# |5 C+ A( s Secho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
) q; U( B7 n1 uecho %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
$ Q" r0 Y% y! e% r' v4 r$ kecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2. n2 @8 P: c$ t5 S0 s3 t8 _
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2, S! U* c& M( o" s0 H4 n
set /a p=39 #设置p为数值型变量,值为39
: n6 U6 f& u1 O$ y: Iset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=38 }+ d8 g$ W" ]% k
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
, K, _+ N) a5 E# Uset /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?; X3 l3 t) D ^/ @ ^* j& z
set p= #取消p变量
' V3 I, r. n' Z0 q/ f7 d. pset /p p=请输入* _! x$ C: o& z0 e( ^. D/ X Y0 b
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
: x4 M8 y- d) D注意这条可以用来取代 choice 命令
9 m1 ~ s! w. M! s3 w& n注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
4 U! E! G* H. e@echo off
3 _- K( v6 b: U- \set p=aaa7 a7 J$ z. Q$ G% ?! I" l
if %p%==aaa (+ O4 `# W, q" A, }
echo %p%
- s" L) k: O9 |0 d, y5 R. |8 vset p=bbb. b* P! P7 o$ e! G1 d) `
echo %p%
# b C1 f' B6 t4 m)* i# X; g: W8 P! U! Y- z" d- B
结果将显示; U1 \0 X6 m) u" @. r6 i( F1 N
aaa
3 z$ L; g, b- ^2 F& v- @aaa
# g3 n( t3 L2 p* A9 X因为在读取 if 语句时已经将所有 %p% 替换为aaa" q! T4 b1 P- A4 v
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
& s' u+ P" f2 I& [0 e7 T可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!8 I* c& n0 P1 _% d& i* q+ H: V
@echo off
* d# R! {! T; T, I" [SETLOCAL ENABLEDELAYEDEXPANSION
% ]. y6 A; s: G4 u) n& wset p=aaa
6 h3 E9 z* Q% l/ M9 lif %p%==aaa (
- P& g. c& G& kecho %p%% z- `0 g9 F9 n! }; i
set p=bbb( E- c* F; w9 k5 ]7 ~
echo !p!( p8 R1 [" |. I" S0 p! u# I/ O0 q
). Q% ?: e& ^# L- [2 z/ { ]& O9 r
ENDLOCAL: E7 x! H9 l l7 M
结果将显示
7 a$ D" S) H/ o, ?5 laaa
+ W& H9 G1 @" Q- l9 Q3 i/ [$ b: Ebbb, v1 x0 Z) l5 }" s8 _5 C4 c, \3 Y
还有几个动态变量,运行 set 看不到
) i, `5 E5 D5 C+ k2 K5 O%CD% #代表当前目录的字符串1 v9 a6 R( E5 ^# D! ]; f" J
%DATE% #当前日期
6 R1 ]0 @; y6 ^8 E$ ]& i! v3 ]%TIME% #当前时间
/ s% d6 ^6 B+ m" g& L6 ^/ I%RANDOM% #随机整数,介于0~32767
# n7 S. ~7 g8 Z$ _+ |%ERRORLEVEL% #当前 ERRORLEVEL 值
: ]& d9 l: w- o7 X%CMDEXTVERSION% #当前命令处理器扩展名版本号
# P1 K, E/ {) V2 b( [( D- r+ \%CMDCMDLINE% #调用命令处理器的原始命令行
/ X* O0 {. U* J8 q可以用echo命令查看每个变量值,如 echo %time% k3 ^6 P9 y6 O2 r/ A8 P2 M
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到$ R2 { e$ f4 X3 z' t: Y% {) U
/ X+ D# ^, v2 h$ S
32 start
4 ], H, F: \% R# |8 K9 i3 n A批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令( U+ |( }2 {- {7 e: o( G" `6 [
2 X* q0 e4 T& ]; h& [ ]
33 call
) _( G5 {5 D, f$ w% @: r. z+ ^批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行* E. i& z+ N* N S6 r1 s$ }
有时有的应用程序用start调用出错的,也可以call调用
) K$ g" J% r8 A* Z% ]8 B, Z" B. F9 f; p+ z8 Z9 R( V1 R
34 choice (外部命令)5 l2 Z: B' R& {" b/ M( {) w
选择命令
, a7 X' l3 g; z% R& q1 a让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
0 Y9 @0 U3 B+ w$ D8 r2 ?: Fwin98里是choice.com% q8 J; U4 \, W+ Z
win2000pro里没有,可以从win98里拷过来' s, ~5 `( a' I
win2003里是choice.exe9 T7 S) m. F/ S( n [7 b, \& \% b& @
choice /N /C y /T 5 /D y>nul8 i3 y( P4 P( g* m
延时5秒
* h7 p: ? o; v: |/ D% R& v, I; K; Y z- d( v; S: R
35 assoc 和 ftype6 I8 I+ A, f( D F
文件关联' d% u, z7 t% d& i9 o U9 L
assoc 设置'文件扩展名'关联,关联到'文件类型'
0 d7 w7 V5 J+ nftype 设置'文件类型'关联,关联到'执行程序和参数'
1 i7 }9 r( C& G( Q" T当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开# P2 x/ o; D* |6 R
而是先判断.txt属于 txtfile '文件类型'
3 o; U% e3 l6 U" A- p: c再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
; o C/ {% Q7 [% m! m3 f' h, h可以在"文件夹选项"→"文件类型"里修改这2种关联
$ g( ^9 \9 H8 ?assoc #显示所有'文件扩展名'关联
. R/ J/ w4 H8 }2 B1 s! oassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
6 k* e* s/ w" I: {+ ?/ eassoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
4 U8 Q3 g( \+ X# U8 cassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
2 z' U1 e% _$ S" \: jftype #显示所有'文件类型'关联
" K. h/ y1 O) G$ ~* k( t( U4 Vftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*# }0 S, Y& [% m0 ]# y+ l1 ], Z2 R
assoc .txt=Word.Document.8, m# b* G# J" D& c/ G+ g: d5 I
设置.txt为word类型的文档,可以看到.txt文件的图标都变了
" I H% s0 \$ uassoc .txt=txtfile* e( ? o/ c2 ? m# S0 G/ T
恢复.txt的正确关联
; [2 k/ k `, f! S' }7 Z! Bftype exefile="%1" %*8 C/ \% r5 B5 v6 C3 u# y
恢复 exefile 的正确关联
# L4 h+ _8 M6 f! P B8 D) O, F如果该关联已经被破坏,可以运行 command.com ,再输入这条命令. P. b: @: }5 }/ z$ K8 O) V
. t9 V, n O: a# T
36 pushd 和 popd) f9 u. z& j5 y# ^" ^; L
切换当前目录
/ }2 ^ h; h! b+ E. u7 B@echo off
) S, R5 U9 w/ r0 x I7 yc: & cd & md mp3 #在 C: 建立 mp3 文件夹# e, U: C/ i7 y# Z! [9 j* L
md d:mp4 #在 D: 建立 mp4 文件夹2 t) R h0 @+ E7 }
cd /d d:mp4 #更改当前目录为 d:mp4
3 m& I* O+ Q: ^6 U. f* g- P& s2 v2 qpushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
, y2 r" E; [: u6 @popd #恢复当前目录为刚才保存的 d:mp48 u3 }$ @4 Q" e4 m
z+ D. T* b# Y. p$ T9 ?37 for: ^+ w: L+ K5 l* B
循环命令- I2 s) W9 h& |: j
这个比较复杂,请对照 for/? 来看
/ F: ]4 `3 N+ c5 v7 \, e( Afor %%i in (c: d: e: f do echo %%i
9 s; ]$ O3 W6 }5 H% x$ q依次调用小括号里的每个字符串,执行 do 后面的命令
( o% e; C6 r, t" i注意%%i,在批处理中 for 语句调用参数用2个%
( R3 L2 v4 A: \, ` v默认的字符串分隔符是"空格键","Tab键","回车键"7 V8 u" U6 r; \! Z" y3 }+ b
for %%i in (*.txt) do find "abc" %%i
5 w+ I& w3 \1 v对当前目录里所有的txt文件执行 find 命令
9 R: c& u2 Q: |for /r . %%i in (*.txt) do find "abc" %%i
. G6 h* p& o; s3 U/ f# P+ t- i在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行- i: S. e. q% T% ^$ A
for /r . %%i in (.) do echo %%~pni; k' K! d" w& T" ]& R
显示当前目录名和所有子目录名,包括路径,不包括盘符
) [) {8 z( @" ifor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt' @/ K1 \, y5 t S4 V4 j3 k s. c
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去$ C P S3 B1 \" N O! b& L7 ]/ A
for /l %%i in (2,1,8) do echo %%i
* n5 |( ^3 m! O; C, i生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加16 O2 v( l" n& E/ B2 | j% J
for /f %%i in ('set') do echo %%i6 ^* c. g8 V& U$ p8 }" q E
对 set 命令的输出结果循环调用,每行一个% H2 ]. U0 `% ~
for /f "eol=P" %%i in ('set') do echo %%i
+ q3 c! z+ O; Y' e/ q: M取 set 命令的输出结果,忽略以 P 开头的那几行5 ]+ R9 m8 U5 t- |6 T7 Q7 ^& }
for /f %%i in (d:mp3.txt) do echo %%i
3 X. U5 Y& l( z9 T显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
) f8 ~0 b* K6 ?6 |3 nfor /f "delims=" %%i in (d:mp3.txt) do echo %%i
w! c% D6 @) H显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称. \# {# |8 u8 ~9 z
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a0 Y! E) U1 W- R9 C3 X+ q1 q6 A1 V
对 dir 命令的结果,跳过前面5行,余下的每行取第4列8 `( H) i8 s- l4 U- g
每列之间的分隔符为默认的"空格"6 b1 c4 {1 X' f6 b
可以注意到 dir 命令输出的前5行是没有文件名的' e, C2 \3 Y, s- C
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (7 W9 E# y1 l4 c/ S5 D* O ?
echo %%a
1 H" z# F2 @& v5 y1 eecho %%b4 _3 D4 n) w" z. |5 P! e, V
echo %%c6 z& _% \( ~2 k( x' I* g, A$ M6 ^
)
9 @1 a8 { v( y. d对 date /t 的输出结果,每行取1、2、3列
; e$ E, V0 M" H第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列# `1 |5 V$ W. e* F- S! J( _: h0 a
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
" P4 ]5 G6 P9 A/ Y1 l9 q4 |其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
- X$ O3 k% Z1 ?) \for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
& `$ V$ c0 a1 H/ v+ V取第2列给 %%a ,其后的列都给 %%b
- @* d6 k: G9 I% E9 Z+ X4 ~& `
( K/ P$ [0 I+ b: o9 l, G( j38 subst (外部命令)
0 {1 H3 ?) d# R7 \# f9 x4 ~' ]映射磁盘。
0 n& D7 Y% n: d+ ` K H3 K2 k. ]subst z: serverd #这样输入z:就可以访问serverd了" C+ e5 V4 D$ `* K3 R
subst z: /d #取消该映射6 o. X/ i1 M0 y Q* G" d# h
subst #显示目前所有的映时' x) t2 C% I: o2 [9 e
. x+ p* ^" | a6 V' e! \8 c39 xcopy (外部命令)0 j8 ], C. D: d* t, F, ` F* q0 V
文件拷贝 w1 t) j, M J
xcopy d:mp3 e:mp3 /s/e/i/y0 R% l2 A$ v2 ]. |* y
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件. C, u ]% H" R
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
( F- e' y5 T: b' l; @2 T/ l; \. X: |* O' _, L' V! a3 N
常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
2 m2 ~) p3 |# J: k/ D' h ?- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:
- V8 _2 I# U# Z7 A! e7 j . p$ |: Y: ~8 J8 I8 k5 `, J( |
@echo off7 @3 ~' z: A! u& Z O9 r) n( k4 \- Y
set p=aaa
+ E" p3 Q3 z5 _6 J8 o e8 pif %p%==aaa (
& T" X. P7 u3 @. Decho %p%2 y/ g6 E2 Z8 D, I/ M
set p=bbb1 |: m5 W5 }2 {) C0 z0 g
echo %p%/ z {7 M9 n& M4 v; o4 V6 m
); r* u! ?3 q8 j
pause : K4 ?1 ~4 B [5 D2 W8 {. B9 ~; v! @
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|