|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!
0 h& k% m3 l5 A. @& X/ N 前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效" N1 y* G& }" J z+ ?; G8 G1 E( h
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
) V: V6 R7 E& j9 g' ?5 K& m0 i名为bat 目前比较常见 的批处理包含两类:
' |, Y7 u' ?- [( }( t- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
* v+ I' S/ o& m5 o( R4 u
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
7 t* `- ~6 Y& ~5 J& S命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
+ F3 C& |: ~2 K$ |1 V 怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出 m2 f1 J4 `! H) D' s
批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set
+ {% B% Q% P/ a 批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||
3 X2 a v6 d( p% [ 常用DOS命令- 文件夹管理:5 ]8 f( ^8 S7 R6 X2 n& H
- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。
. P y8 Q( t2 E0 ]$ f, _6 d
- 文件管理:8 \# M- z! {$ [% K8 m1 O; F- q3 A
- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同# m. c5 J9 n b
- 网络命令:8 L. ]- E; w4 C1 J: `
- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表
# r# Z: t# f: J0 W* j+ Z
- 系统管理:
/ _ T9 T! A( m0 u: F. A. P3 I1 J- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置9 X. X& ?$ E( M& E! e$ s! w3 T
. q" A+ I% p. @$ K
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
8 c7 B! U% w8 B; f$ ~: G2 n! ~
3 r$ G0 X7 S4 PWindows Batch 常用命令5 ]+ M, f" l5 U! r7 u2 z8 I0 A8 P& }
1 echo 和 @
# f9 F# @4 A( y8 M回显命令
: N* c. Z3 \& j* y@ #关闭单行回显% D' b; u# M- V0 u
echo off #从下一行开始关闭回显
/ N7 a" J( D5 b# B' V@echo off #从本行开始关闭回显。一般批处理第一行都是这个
9 P8 A/ v4 r$ |6 I) @: xecho on #从下一行开始打开回显
! @5 ?, w5 z2 t' w9 |6 F6 _* B; Oecho #显示当前是 echo off 状态还是 echo on 状态
' v: b6 ^3 }# A$ mecho. #输出一个”回车换行”,空白行) i0 _: Q) l* Y+ q4 L
#(同echo, echo; echo+ echo[ echo] echo/ echo)7 p6 K r! _' ?' s
9 @# e9 N# @" e2 errorlevel M5 k: `$ ?4 r7 O% Y
echo %errorlevel%
( w" I$ Z) K. i! W6 C每个命令运行结束,可以用这个命令行格式查看返回码
; E) @4 P& \1 Z4 w. S5 u( ~3 z默认值为0,一般命令执行出错会设 errorlevel 为1
& ^% t# B5 x; r" i/ _4 A
- {& D( I/ n5 W( @8 w0 g3 dir ~2 P6 R! L/ s9 i1 X
显示文件夹内容' i2 k3 I% r9 S
dir #显示当前目录中的文件和子目录, l* L& ~4 ^0 }) N V
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
6 F: W7 s' K2 K3 H+ \" Ydir c: /a:d #显示 C 盘当前目录中的目录( Y6 X$ {- N& w) h) S+ h: \
dir c: /a:-d #显示 C 盘根目录中的文件
% i4 I3 R9 M4 a" z& P6 Fdir c: /b/p #/b只显示文件名,/p分页显示
V7 h% e) Y% |. m0 a; R0 Qdir *.exe /s #显示当前目录和子目录里所有的.exe文件3 j3 T! X3 o$ p( f. d
; a+ l% t2 K( S* Q; T6 t
4 cd
" I5 h! |: s# z0 z5 c切换目录
$ b8 e3 X. C3 A- }cd #进入根目录
5 P" Q+ u% x5 g0 l$ P6 w2 e @; X4 kcd #显示当前目录
- a& h' e4 \' h$ Gcd /d d:sdk #可以同时更改盘符和目录
7 \ Y1 M/ a, E) j! B. i8 R8 i4 Z/ E) D
5 md" }: O$ Z! N; G3 m% m$ H; A) v
创建目录6 r0 v$ Q1 V5 s- Y& V
md d:abc #如果 d:a 不存在,将会自动创建中级目录
1 H" ]- ]. w4 W, Z7 n/ |#如果命令扩展名被停用,则需要键入 mkdir abc6 f% S& K/ M$ r9 L, Z1 p T
! F, n" u: s6 {$ W
6 rd
' l6 y0 y; k# @) B删除目录
% w% E, Y" t' [5 `/ L% E/ o* Lrd abc #删除当前目录里的 abc 子目录,要求为空目录 v* a; m) J% W, t" @* g
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式5 H% j2 }8 C0 A
' J9 m( b) y6 r, J7 o% Z( Y! ]3 A7 del# H+ M$ Y% [3 P8 U n7 r
删除文件; b! [1 j8 ?; `, a
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
% N4 S- ^2 \, n# B0 m1 V) qdel /q/a/f d:temp*.*
1 @2 X! \) A* T% N& a: c, s删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
+ h6 T- ?" H. U3 C n# w* |del /q/a/f/s d:temp*.*5 L6 e* I0 s! N5 A" X$ J8 ~7 U
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录1 B! G' X: u' b; ^& p+ j- A
/ V/ l# ^2 i# H8 ren
/ u: z z% [0 T. V, Z4 ^! k, r" O重命名命令
, \* o8 a* s( Pren d:temp tmp #支持对文件夹的重命名. t6 v( d$ T% d9 X6 x8 B" I
2 z ?' N: M6 G+ s0 k
9 cls6 h# D2 {% |9 L/ F. J
清屏
, q- p4 \ f h+ A$ i! ]10 type
8 M& S2 u5 K e. r显示文件内容1 q9 U. d( ~* b; L8 M0 C
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码4 b" U" ^) n4 i4 v9 i
type *.txt #显示当前目录里所有.txt文件的内容
; D* M3 V( ^1 W& ~( _. E# ]
+ ], a4 t3 \6 T' x: |9 s [6 v11 copy
( K& `' A% E$ {) H) s拷贝文件! r+ N& ]; m. D7 K0 \5 s) O6 ]7 x, q
copy c:test.txt d:test.bak- \' Y- B7 ], {! t! S
复制 c:test.txt 文件到 d: ,并重命名为 test.bak
+ ~( C- S, x( K/ j: ^; Lcopy con test.txt8 K) i8 f0 ^" R5 a
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件7 d- D5 F0 F( ?/ W8 h& V1 c3 i, h+ s0 B
con代表屏幕,prn代表打印机,nul代表空设备4 D: w4 n$ @; @! |
copy 1.txt + 2.txt 3.txt
1 V- y9 E$ f! H/ g6 r3 P9 a# v# x' i合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
7 w' A- s8 B: f& U5 s6 Q. Z如果不指定 3.txt ,则保存到 1.txt
4 C* e" [/ H E, a5 i, @# G# c2 Ecopy test.txt +
4 ]" Q6 ]; D% {& N' A复制文件到自己,实际上是修改了文件日期# ]9 v" \1 g- H, A
9 n, I# y6 _2 C% A7 J& T
12 title* _- P$ E N5 T
设置cmd窗口的标题" a. j) l3 K* a
title 新标题 #可以看到cmd窗口的标题栏变了
, E# l/ G0 ]: |! Y! k9 m
+ G$ _: ~1 A0 ^" N; P# o13 ver
4 ]" b+ A; x" b; D. j3 m, x显示系统版本, s! K/ ~6 Q! U. F- i, ~ l
1 g. i: r2 u* B' W& M
14 label 和 vol
4 X8 U* |8 G8 J9 X2 @9 Y设置卷标
& n: N+ A& z2 k7 d" F& y# Ovol #显示卷标
. M( y3 i# P5 L$ [/ S* R9 H- U& hlabel #显示卷标,同时提示输入新卷标
% `! p) `0 ^" Alabel c:system #设置C盘的卷标为 system/ _& W/ e; p: f, D: m
5 ~4 _) R, U' y' W. {, O15 pause$ N! f1 P( T4 {7 O5 M; i0 z4 N
暂停命令
& ~# B; ~# w4 M2 Y$ V1 S- }1 N0 r" d) K. b: y7 K
16 rem 和 ::. t2 U3 g" ?' t( H F. `$ k7 L3 t
注释命令$ S, w0 a2 ]! k: T2 t
注释行不执行操作" G: c; j6 v! C% G8 a" w1 h: t
4 H$ Q& u0 U5 I# U) Z: T* g! Z
17 date 和 time: O& v* J# A" K: H# S$ v3 f3 `
日期和时间" W) B2 I( H# C& H$ P
date #显示当前日期,并提示输入新日期,按"回车"略过输入
+ H" v" x! w! n; f4 k9 a- e* I+ Xdate/t #只显示当前日期,不提示输入新日期
2 @# d3 L8 V- J/ _, f& [" R: f( htime #显示当前时间,并提示输入新时间,按"回车"略过输入
3 }" A4 Q* C; D- ftime/t #只显示当前时间,不提示输入新时间4 T; f _, ^. R4 h3 `9 v/ m- i$ ~
4 B1 I+ t) p5 d. [ ?, ^
18 goto 和 :$ [8 M& L [4 i4 l! O0 C4 p
跳转命令
% R% }; Q& J, z4 ?:label #行首为:表示该行是标签行,标签行不执行操作7 O7 D' |2 n3 q. ?3 w0 Q2 y2 P
goto label #跳转到指定的标签那一行
: S& e& j' a( M7 [1 S% S
# N+ Z* c2 C- \5 |; x, U19 find (外部命令)
h' b# H- _7 W. ?% U查找命令0 |# t, o: k) T% Q3 {
find "abc" c:test.txt
1 l; A5 k; Q+ C. C; l# O在 c:test.txt 文件里查找含 abc 字符串的行, {* D9 N! L7 ^# t2 |$ G
如果找不到,将设 errorlevel 返回码为1
: J0 J: J4 k, g0 n' Efind /i “abc” c:test.txt
+ N; H) q O, E7 O查找含 abc 的行,忽略大小写
* L+ w* F& f1 ?( Y5 vfind /c "abc" c:test.txt! _. O' | H1 Y
显示含 abc 的行的行数& C: Y! \0 b$ K$ A Z7 [4 \* T
$ `9 D, b% Z( e5 Y3 t% z7 K' R20 more (外部命令)
; a/ W9 N @' z5 p' z, y" g7 T逐屏显示& Y- S! \- n& N
more c:test.txt #逐屏显示 c:test.txt 的文件内容1 |: k: Q8 K9 o2 |
" ]1 A# j8 Z% t; Q
21 tree+ L* w: ]1 y b- A
显示目录结构
" D! \3 ~8 W$ C( {6 Ttree d: #显示D盘的文件目录结构
9 y S/ T6 U9 O! E/ u, Q$ _# d# I! O
22 &
- a& U4 _6 F# O. l" x9 C( F顺序执行多条命令,而不管命令是否执行成功- G" ?9 E7 T- Y5 m( q- W! u* ~" a5 y
( ]1 S3 g3 f8 J7 x- z
23 &&
, g! ]- h8 I3 h. L( v Z顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
" T7 e" E2 N" `5 ^) T" I/ Ifind "ok" c:test.txt && echo 成功1 I% s- g: D% W, ^- b8 r
如果找到了"ok"字样,就显示"成功",找不到就不显示
! Q4 p$ t. x8 _
; W6 L* U9 v( G3 [! }9 d( Z5 H3 O24 ||& d8 p4 ~9 X: z. Z$ J0 v6 b
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令# i6 O1 \! T4 Q
find "ok" c:test.txt || echo 不成功6 j+ f* `( s( X8 ~: ]
如果找不到"ok"字样,就显示"不成功",找到了就不显示
4 d" H6 J- N/ G4 |5 R! U7 h; u9 @( r2 \8 Y5 i4 E' E! ]( H
25 |
% w) N" U: a7 x8 e4 F" ]1 J管道命令
4 l' I6 q* H1 ?2 d+ U. vdir *.* /s/a | find /c ".exe"
( L9 M2 X) [6 L* \管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
- |. @* O4 y; p( Z0 {: q* t该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
7 K0 r- a! |/ t7 t, @8 Y9 Vtype c:test.txt|more
- p1 \0 h/ w+ ?$ r0 d3 @: w5 G这个和 more c:test.txt 的效果是一样的/ I7 X' t- [2 H3 p* E/ c
" j% E4 U8 s- D
26 > 和 >>
, t7 R& p( l$ Q- S! i, W输出重定向命令
, R& d7 z Z- P, `$ ~> 清除文件中原有的内容后再写入
$ E1 q1 k0 H1 n. D/ A9 j>> 追加内容到文件末尾,而不会清除原有的内容
4 J& O$ f6 [7 X$ y# y* b2 y主要将本来显示在屏幕上的内容输出到指定文件中3 j/ P* t; C# L1 B4 b1 j
指定文件如果不存在,则自动生成该文件
7 @3 [# N/ l1 h! L& n1 B0 `* otype c:test.txt >prn
6 [. a* H3 j9 p" f0 J j& U屏幕上不显示文件内容,转向输出到打印机
, b- g; X! c3 ~0 Q B+ \" Iecho hello world>con1 C- M: `! X" U0 F( M) H) Q* B
在屏幕上显示hello world,实际上所有输出都是默认 >con 的
* S+ r3 i6 I: Z1 g' lcopy c:test.txt f: >nul9 _% Q0 d9 j4 E; q, T
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
, m: T- v ~/ h" w) Rcopy c:test.txt f: >nul 2>nul
; V4 A7 {( n# B! r& o ~不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
9 v0 I7 q. j1 z9 r: jecho ^^W ^> ^W>c:test.txt6 f- M! _6 V. f2 o1 {
生成的文件内容为 ^W > W
* T ]" _- O8 _( \+ C, g^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
$ ~2 u& u; Y. c' W& L6 }3 r3 ]. k, P9 ~# w9 W. n) h
27 <. ]/ s% e9 j8 Z3 s8 [% p T
从文件中获得输入信息,而不是从屏幕上
3 b1 N! ?9 _1 F: f" j9 `! M一般用于 date time label 等需要等待输入的命令! k ` Z9 |7 W5 Y/ [ h- r
@echo off9 k& N7 [: c: Q, d, w
echo 2005-05-01>temp.txt
! ]" v* I( g/ l8 G& Adate <temp.txt6 s% V" S6 b9 \" T0 N5 M
del temp.txt
4 ~6 l: v2 g# p( v1 }这样就可以不等待输入直接修改当前日期7 y8 n7 ?: Y. g6 M" b
7 P9 e( N' A& _6 F C1 b1 o/ w28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*$ F* A* k! L4 e% l* \
命令行传递给批处理的参数; Y% ]+ W% \% ^# f' n
%0 批处理文件本身
0 y3 r8 ~: Z$ E$ E%1 第一个参数
9 {! k" m. p7 L* {3 j- G* m%9 第九个参数9 Z) _5 G2 J- C; _' d1 }
%* 从第一个参数开始的所有参数
4 |! P R+ g1 @4 z/ @. L批参数(%n)的替代已被增强。您可以使用以下语法:5 b9 \' H0 z. I! J% E( J9 Q
%~1 - 删除引号(" ), 扩充 %1) R0 z: n7 Y0 ^* J! ]
%~f1 - 将 %1 扩充到一个完全合格的路径名
# c$ u+ D& o, [% P u%~d1 - 仅将 %1 扩充到一个驱动器号
% L6 ], n2 C0 o4 u%~p1 - 仅将 %1 扩充到一个路径, s$ l8 L; K! _, [
%~n1 - 仅将 %1 扩充到一个文件名
# u5 w9 w3 E. F5 e; F%~x1 - 仅将 %1 扩充到一个文件扩展名
( L* V! v* \3 r%~s1 - 扩充的路径指含有短名
! V, }( K% _9 k+ f. ^& ~6 _%~a1 - 将 %1 扩充到文件属性
- y' h5 e8 I) b" R( I8 O- {7 h%~t1 - 将 %1 扩充到文件的日期/时间+ `1 h0 P* a O) m' @) q3 |" j
%~z1 - 将 %1 扩充到文件的大小
: F" m, G# k+ K! t4 Y%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1: ~" \0 C& Q6 C
扩充到找到的第一个完全合格的名称。如果环境- K: U0 s5 d/ s$ ^% \
变量名未被定义,或者没有找到文件,此组合键会. ~6 X6 @0 D# m: w( ?* W W" g/ @, U
扩充到空字符串, x5 u4 `8 [1 s" K
可以组合修定符来取得多重结果:
9 f% F. |9 X$ K% V! \%~dp1 - 只将 %1 扩展到驱动器号和路径
0 h- W" v- B5 J%~nx1 - 只将 %1 扩展到文件名和扩展名" y0 ^* L! `% C j
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
3 L; X0 K* {. Y, A0 u1 V0 X6 v6 n并扩展到找到的第一个文件的驱动器号和路径。
$ j7 A. v n+ _) p2 I%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。8 W) s) v) F% d/ i( b4 `; x
可以参照 call/? 或 for/? 看出每个参数的含意" W- j, z: r4 L0 I4 |
echo load "%%1" "%%2">c:test.txt( Z" V9 v- f1 D( E$ c W- c7 I) a3 s
生成的文件内容为 load "%1" "%2"% a/ C. K* Z* @$ {! r! O3 X% ]6 K
批处理文件里,用这个格式把命令行参数输出到文件
' [/ k; ^& T8 o* h, t6 Q" z9 R
. o, }: q1 m8 Z# v, M. n29 if- J0 O2 D |. g
判断命令
4 g- X% h7 n( @$ K8 u) H4 ^; nif "%1"=="/a" echo 第一个参数是/a* u( f; Q( B& y# M+ ?" m
if /i "%1" equ "/a" echo 第一个参数是/a. C3 M! ^( \: ~0 P: o( y7 d5 r- \% V8 {
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
& [) y1 w& {4 [8 M9 C6 a( zif exist c:test.bat echo 存在c:test.bat文件
- g+ c& z; W" [/ W% \if not exist c:windows (7 S+ c' g* _! c+ x" p& [
echo 不存在c:windows文件夹% P* F6 g x8 a; U' z2 P
)
' F/ e W* w% \$ nif exist c:test.bat (* Q. m4 P2 @% _; u" `) u D `
echo 存在c:test.bat9 g& b' a: _, p
) else (2 q% R# i, {+ G) ?( p8 f
echo 不存在c:test.bat: o" G# F# e& ^6 i. ?# S+ [" z
)( W" D4 s1 J& v' j5 l; X
30 setlocal 和 endlocal! I, Z' A4 b- m2 c( u
设置”命令扩展名”和”延缓环境变量扩充”
, |# N; s) Q8 _0 p0 K! [SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"( Z, J- P) Q" K/ i3 b3 R: ]
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"# S! O) ]4 V: Z/ p# X
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"7 z* f% k- A) |+ C7 p
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
# u" i' Y' s% x Y7 h4 Z4 V7 e [9 pENDLOCAL #恢复到使用SETLOCAL语句以前的状态/ q, _ d! n5 O4 q- D6 v
“命令扩展名”默认为启用- @4 d L, q( Q$ _# _0 x" k2 O
“延缓环境变量扩充”默认为停用6 b) C0 y+ J- C7 C4 [
批处理结束系统会自动恢复默认值
- {# I) p$ m# @8 e. E, l; [% H; x+ H可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程8 ]- [1 w/ Y9 D" L6 T; K. Y
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确' A# { u) I! D* _, @
保程序能在其它系统上正确运行/ f/ @/ P2 x" E9 L, d
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程& }# V4 L, R2 o( `* D& H. S
) z! c- ^, I# A% ?5 ^1 c& |31 set. f- a) m, C! X) t
设置变量
9 l$ F0 n* ?1 u6 o% {$ v# @+ J引用变量可在变量名前后加 % ,即 %变量名%8 [8 O; Q# r8 d. u; N" u
set #显示目前所有可用的变量,包括系统变量和自定义的变量0 ~, Y! H) b& C' I0 r+ }9 `, l) M
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
3 X0 l) z( N# l: t' m7 yset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=11 s% T. _5 `' n( g
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb27 |+ o4 A( \* y! k) P, i0 A
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2& G' ]5 `& R8 y! w( [% W
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2; B3 M" s7 p+ m0 Y1 D. E
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2
. R) m7 ~4 ^# }+ W' [7 Zecho %p:~0,3% #显示前3个字符,即aa1
; ?4 Z/ O) |) Wecho %p:~-2% #显示最后面的2个字符,即b2
M f8 ]9 ?6 v5 `echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
+ A$ G$ k" X4 ^* A8 @echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2 [0 o6 `3 p/ G( M, }9 b- C
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
$ ^' G$ V& v( F2 i9 p8 U9 a8 A- Decho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2" Q% i. b3 b# O) ~: p
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2/ J0 e3 P7 q* U+ l) V( k, p
set /a p=39 #设置p为数值型变量,值为39
: Q8 V8 v Z) d: x$ |% F! _set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3. L) [# x6 V# }) A' y |
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用- S+ }' P2 j! _0 `* T! |
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
% ^3 g% J ?3 ~# z$ R7 Zset p= #取消p变量
0 P* y. j5 y/ aset /p p=请输入
. G( I' D/ Y: p/ x* l4 v屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
: x: I+ R1 T# U% A注意这条可以用来取代 choice 命令 T% C; O X8 v- }, }7 w
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
" f' [1 _ m5 h0 }" e2 U, [@echo off
- G& \3 @& O' N, }2 pset p=aaa2 w5 F' {. Z: [( D0 A9 L, ^2 \
if %p%==aaa (
+ `! Y- j0 Y o( Eecho %p%1 c$ x6 O3 q# ^1 F, l: {7 u
set p=bbb3 i1 H: C7 B. F# r( z
echo %p%2 B* m1 D8 O+ f m. v
)
" Y6 t8 u0 ~0 y0 |结果将显示$ f# w$ X+ f" q4 Z3 k% r: T
aaa
; Z8 @7 |' o* W T% faaa' t( D! n9 ~( X: O
因为在读取 if 语句时已经将所有 %p% 替换为aaa( C: k9 F% m( S% K' L+ B: e5 r& t
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"0 ?; I( g9 q R2 [- J& o3 O, [
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!9 Y" R+ c% x6 X9 Y
@echo off
' T) d4 E, f: D8 a9 X# w- j. @, O) ~0 BSETLOCAL ENABLEDELAYEDEXPANSION' [' {3 A2 |/ G( f( w
set p=aaa
; Z# C! e0 Y& B' sif %p%==aaa () n& r( [" l% g$ N. q
echo %p%
7 I. U# X! \; n' S! @ o& R* s( g) Pset p=bbb U1 I; ]+ q, {* C3 v
echo !p!
! d- s, w# w1 \1 A)* M! J; l: ~; q, r
ENDLOCAL
6 A/ ~$ z* ?3 q. e3 o结果将显示+ T" E1 c* \* k5 x; C- v
aaa' u+ l# u0 ~& l: ]2 {0 Z
bbb1 W4 D$ b* W; @! f( H. |- \) s
还有几个动态变量,运行 set 看不到' C% n) E& Q1 \# e
%CD% #代表当前目录的字符串
. M& o; B; J! I7 T {' L) G+ Q; x# u%DATE% #当前日期+ V- w, g7 I! F( D& Z4 X0 u
%TIME% #当前时间
( c( P( b$ ` W8 X& A%RANDOM% #随机整数,介于0~32767' G+ A2 V8 l4 e' `% Q1 x" {
%ERRORLEVEL% #当前 ERRORLEVEL 值 H- M3 H4 G5 l1 S- {
%CMDEXTVERSION% #当前命令处理器扩展名版本号
: D/ K/ }6 _& M( w$ B%CMDCMDLINE% #调用命令处理器的原始命令行
2 N" h) |: s& \. ^可以用echo命令查看每个变量值,如 echo %time%$ i. l" |0 ~1 A* m% \6 v3 B; U
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到3 @- M6 ^0 H) w9 K' l# y! a
' c/ \3 Q+ [9 Z: U6 z32 start. J+ l9 ^! R9 t6 H4 O
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令" e5 \( N7 F# \( n* z5 W3 W! g
8 `4 U$ R) G) T, G33 call# L( |/ O* v) X" A5 e! Y1 q; L' H
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行& S O$ ~) Q r9 M0 S: ^
有时有的应用程序用start调用出错的,也可以call调用
1 R: t' W! L2 r, R6 l5 \7 X- l7 y
! q6 P" V e _8 p8 N. U4 S34 choice (外部命令)
. F1 V6 P) J- a! i& c6 y0 P+ _选择命令8 D8 T3 j6 o& t/ g/ ]6 j
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……5 D6 m5 e. d1 l5 t, g- A9 L7 x, Q
win98里是choice.com. a w+ a: U7 {9 k6 M. @
win2000pro里没有,可以从win98里拷过来
]7 n. C+ P6 H- s# C2 q; u6 hwin2003里是choice.exe1 n& ^9 w! e' l( A2 p
choice /N /C y /T 5 /D y>nul0 s$ h& T' T2 Q
延时5秒
7 z+ Y- N0 W& [9 y$ J9 C _" ^* r
! I9 z- i1 n, _5 u35 assoc 和 ftype
8 r- u9 |* c) [; o2 Z4 A文件关联
# U9 @* ?* ^0 O+ p1 [assoc 设置'文件扩展名'关联,关联到'文件类型'
7 d ~# e) N+ r# ]) Jftype 设置'文件类型'关联,关联到'执行程序和参数'$ ^5 K! c3 n7 e: V/ o0 B6 P
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
$ }- O9 Q0 {0 y0 E而是先判断.txt属于 txtfile '文件类型'+ D# W/ L1 p1 C1 Y7 T# t
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
+ d+ S4 h% i9 l% y9 x可以在"文件夹选项"→"文件类型"里修改这2种关联$ h& e! |9 s6 T' i# E1 v; X) R
assoc #显示所有'文件扩展名'关联! g4 L; F% ~6 X& g2 N
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
) H5 z4 C/ A. n' b( U6 Cassoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.83 @1 h5 D+ n4 g9 Q
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
, e! V' F8 B$ P0 c; a4 n# Iftype #显示所有'文件类型'关联
! p! f! I. r, nftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
) c! A2 Y0 a A9 Y- v* sassoc .txt=Word.Document.84 d) u2 w; [6 e4 Y# m9 B
设置.txt为word类型的文档,可以看到.txt文件的图标都变了
2 K8 b8 d C. K0 Lassoc .txt=txtfile' M0 j* F# R, |# i/ E; B- n
恢复.txt的正确关联
$ ?! h0 M! m" G8 A- a* S- Qftype exefile="%1" %*
; G1 u: |9 ^% X# p. {- B8 N恢复 exefile 的正确关联1 F" ?8 ]$ T5 o- v% L
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
8 K0 d& Y( d! f) A" y5 g2 @. D7 e6 @! S8 ~, f4 P; p
36 pushd 和 popd
! N9 k0 ?! x1 S; \切换当前目录
% R$ J6 c* G8 M* ^@echo off) `8 c5 |# T9 [' e5 r6 n- Y
c: & cd & md mp3 #在 C: 建立 mp3 文件夹0 }3 ^5 U/ ?! _: e$ o6 B
md d:mp4 #在 D: 建立 mp4 文件夹( r+ Y3 F: {- X7 M) { ~) r
cd /d d:mp4 #更改当前目录为 d:mp4
. h, _7 K! y7 E/ m7 z; m, \9 lpushd c:mp3 #保存当前目录,并切换当前目录为 c:mp31 o# w: ?( T$ p4 Y' C/ p
popd #恢复当前目录为刚才保存的 d:mp48 ^0 Q0 n L8 z
: ~% {1 e4 R" G) V4 ~. ^$ J
37 for
. A3 r2 S* c/ |' s; g循环命令
- B6 X2 I8 v! L1 l3 R这个比较复杂,请对照 for/? 来看" H& W) L/ M" u! D
for %%i in (c: d: e: f do echo %%i3 s+ |! f' V: ?8 s- R! ^
依次调用小括号里的每个字符串,执行 do 后面的命令
E! r( W1 x/ X+ o2 Q; P注意%%i,在批处理中 for 语句调用参数用2个%
" h) U+ N, J+ F3 U+ M8 Z: D默认的字符串分隔符是"空格键","Tab键","回车键"+ @8 M1 J7 M- L0 Q
for %%i in (*.txt) do find "abc" %%i
4 y* F B+ {) m6 Z. j- b对当前目录里所有的txt文件执行 find 命令7 |5 B3 i# }! o
for /r . %%i in (*.txt) do find "abc" %%i
5 l: r' d; t1 L. I! E+ y在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行! W5 b4 b# t6 s7 F% N% m
for /r . %%i in (.) do echo %%~pni
8 x# {3 d; R6 B# I5 W. z" X显示当前目录名和所有子目录名,包括路径,不包括盘符
+ l, ~( t* n2 o- I9 v6 [6 xfor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
7 X. G/ C9 k9 `) ~' X+ T把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
0 Q$ w2 u( a' G1 G8 jfor /l %%i in (2,1,8) do echo %%i: ~ m( U+ y/ N3 ?' b
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
( S& k3 s+ u& N2 ufor /f %%i in ('set') do echo %%i& J1 K5 R" T) s9 d! n5 @
对 set 命令的输出结果循环调用,每行一个
0 [; u6 }4 i4 ^, @8 ~3 ufor /f "eol=P" %%i in ('set') do echo %%i9 Z3 K8 H+ b5 }* U7 h
取 set 命令的输出结果,忽略以 P 开头的那几行( z* W* l L8 |2 t) x
for /f %%i in (d:mp3.txt) do echo %%i
, N+ Y& Q% f( g% \4 S @6 @- w" `6 l显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称2 v m5 A0 o$ C, J, ~# a% k( Y
for /f "delims=" %%i in (d:mp3.txt) do echo %%i! D7 `( l, U* ?' T7 Z; r, V
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
3 e. K6 \6 o& h Afor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a/ T$ m6 l# q1 b$ d( n
对 dir 命令的结果,跳过前面5行,余下的每行取第4列
. f4 d% Z0 h ^& B, j每列之间的分隔符为默认的"空格"$ C) j j) j! @9 j
可以注意到 dir 命令输出的前5行是没有文件名的2 H4 @4 N% P: V+ m+ W
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do () [* E& n& \* Y9 h/ J/ C; Q
echo %%a) ], z/ I) d8 I' _( ^ y N
echo %%b [$ _- z7 H8 k4 |4 `* Q( m
echo %%c
2 T( f) |0 ?: Q# O; Q; L1 X8 b! t). W- D! U6 A0 Z5 |* z
对 date /t 的输出结果,每行取1、2、3列3 P* x1 A1 K7 y/ Q5 ~
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列& {: D5 D/ E/ \2 F
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"3 T6 n0 i( K7 e+ g
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的" G, l* Z/ W/ }* {
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
# d* @, f' l( v! R' v' I1 L4 S9 L: v: W取第2列给 %%a ,其后的列都给 %%b
' N; p+ e$ ]4 }5 G% q
1 |% R- J5 C: O5 w38 subst (外部命令)7 {& b1 t7 B9 ?2 B
映射磁盘。8 O: ]% }2 i1 J& ?6 \
subst z: serverd #这样输入z:就可以访问serverd了; W( F/ G8 u/ L8 K7 Q; n: j2 D
subst z: /d #取消该映射
: {5 n R1 O# _$ y) ssubst #显示目前所有的映时: \1 `2 V# g, F- D
$ K M0 v7 ^) Z3 S, @. C39 xcopy (外部命令)' q0 T, h7 j/ S, y9 p
文件拷贝4 H+ I" G0 p( }
xcopy d:mp3 e:mp3 /s/e/i/y4 y, U/ z- }+ [- k/ ?
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件" |( R2 z7 ?+ b2 Z" m% N( R$ Q2 }
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问) k. [+ T$ Q" Y$ H$ t+ i
+ }% h) Z- [8 c% ^; [; B* M3 ?/ Y1 F
常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
* Q: [% u# w- E" L" h s8 M- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:
1 Z7 W* z3 T5 ? 8 B+ y, p& ?0 V& ]
@echo off
o8 q o4 K& S" |; a F/ b) v4 Cset p=aaa
4 m: @% a4 y: J# `/ B/ wif %p%==aaa (
; r: r$ _' |" k0 Gecho %p%
& W6 V! D( E3 x) dset p=bbb
; M6 s5 z- Z8 Zecho %p%
: a4 n6 r1 L4 s)( d6 i1 k- E2 J- @
pause , a" m; N. b$ q, Y$ Y1 k6 R0 k( I
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|