|
|
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!! K) d q$ i; z0 z
前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效
3 K$ l9 w: {& K2 ^
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展! \# {. Y [( ?; N" g. X
名为bat 目前比较常见 的批处理包含两类:
6 S& d! E1 o+ i* O- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理5 F }$ J5 ^0 c& P9 a
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的8 b) A$ e3 d7 Y, D8 ~2 T3 h% `5 R A
命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件 6 M7 x# O/ D2 o- F3 e* V
怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出; h8 m; ~7 m2 u- k6 Z/ [
批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set5 y! r" w+ {8 K. L$ ^& l0 I
批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||6 T4 j/ X8 V1 |& b8 i/ K- _; w
常用DOS命令- 文件夹管理: M' v: T; T1 k- _6 T
- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。
* ~; S$ z9 C1 q( c7 B/ e
- 文件管理:
+ t6 o5 M$ o; c1 d" @! U( V- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同. ]9 Q) }- Q0 s, z1 v3 \: y
- 网络命令:
: E9 l6 N) G# K9 K# E+ ]4 T- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表: ~% f A0 m2 M4 q
- 系统管理:$ }& r* p, O7 L. a
- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置
0 d! q# d5 z2 o7 B; X8 A8 ?; X! W 9 W1 d: I3 }8 u# z
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /? 1 f: b& G" s( }2 V" B* Y
- G9 D: @4 D. ?' s" x V k0 v
Windows Batch 常用命令
, c8 P; ~! C3 k" R1 echo 和 @
1 C$ c w) m9 p: G6 q$ L- u- P回显命令' F" d# [0 s5 J1 k) m
@ #关闭单行回显
) G$ p1 i/ K; O% q8 w& O) E$ |9 H pecho off #从下一行开始关闭回显) T1 D1 m2 ^# C0 H! M+ Y$ i4 C
@echo off #从本行开始关闭回显。一般批处理第一行都是这个# X1 a8 j) W4 @, y
echo on #从下一行开始打开回显
3 U! S" H4 t+ v) j/ l" ^echo #显示当前是 echo off 状态还是 echo on 状态
/ M# g+ a8 E% Z. k$ becho. #输出一个”回车换行”,空白行
; G' |+ Q+ m# m8 |. f5 \' ` U#(同echo, echo; echo+ echo[ echo] echo/ echo)# P! o5 J7 j4 F. g! X3 T* p
8 W% j" r. T Z( L5 _; D2 errorlevel/ h. N9 c7 m+ P4 Q; F; E
echo %errorlevel%, R$ j8 I' P; o5 N7 X# G4 ~
每个命令运行结束,可以用这个命令行格式查看返回码" |/ f i" Y0 {- H$ w3 B
默认值为0,一般命令执行出错会设 errorlevel 为1% k) W" u" I! B2 |3 l6 a7 t
1 y1 _. V+ t+ L9 k3 dir- j f: f2 k9 V: A' H" L/ Q2 E
显示文件夹内容
# Y- {2 m* g; Rdir #显示当前目录中的文件和子目录5 q$ n3 Y: V7 j( f# j
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
* r8 {2 j5 d8 b+ f& H5 }dir c: /a:d #显示 C 盘当前目录中的目录
; g5 N% ~& ~( X4 N5 z$ Zdir c: /a:-d #显示 C 盘根目录中的文件6 t" h+ Q+ U% ~, ~
dir c: /b/p #/b只显示文件名,/p分页显示5 v3 U! m! r; H
dir *.exe /s #显示当前目录和子目录里所有的.exe文件
5 q& W3 q7 q& ~8 d1 Y
5 i: I2 s# P$ J4 cd2 @& d; e& F. A% P3 L& O( j
切换目录
% ?+ y. U2 j1 J. B2 o2 ncd #进入根目录
+ C% ?: |& r2 Y* {. q9 E H( Scd #显示当前目录" F' B7 e+ x7 x0 z! h- m
cd /d d:sdk #可以同时更改盘符和目录
: e( A3 d. u6 B
+ B' S6 t8 v! B% d) F( ]; b7 `" ]5 md# o/ u8 ^; q6 o' Z' Z9 |
创建目录
2 R& O0 E" w, \/ n5 G/ nmd d:abc #如果 d:a 不存在,将会自动创建中级目录
- e/ c1 n8 |9 a' q#如果命令扩展名被停用,则需要键入 mkdir abc
7 a" k, r2 O5 l/ d/ k! A% v3 T* P+ D* G3 X8 H# M( {1 p6 _. W" }2 v i
6 rd3 m$ m5 e1 O3 O# Q& @0 a( L
删除目录
! ?- p! W! K M7 ?- hrd abc #删除当前目录里的 abc 子目录,要求为空目录
/ g6 Q2 O3 c( O& |' ]% |rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式* B8 I4 p& D: a, n! z+ a7 \
3 z4 O' d8 ^/ g. [1 d7 ]# Y7 del+ t c8 P$ m& y
删除文件
/ G- i8 Q% v3 X) ^5 U9 G4 Y+ E& Hdel d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
1 [) [$ b2 @& T: idel /q/a/f d:temp*.*8 S0 R# M" M! E" J
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
5 Q. y9 |) `% P' x" r% Pdel /q/a/f/s d:temp*.*
! M7 | t" }& b: P, N删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
; C8 z0 D0 x" p9 ~4 y0 c$ f! U/ u' V1 l
8 ren3 M' g' \+ n2 |, s/ y: @
重命名命令
" @& e3 l" ^8 Z3 H. ]. Q5 f" qren d:temp tmp #支持对文件夹的重命名
0 I& R* r& x5 c1 D- d/ F# |* ]
( z, g" Q. b- K+ O6 S9 cls
8 ^$ G$ s$ U- W x r- i清屏
f7 a1 W: v* W. T' b10 type$ \. @# Q8 z) M8 [4 T P
显示文件内容
* Z2 _/ k- v6 M9 v: A2 ]type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
8 ^, F* Q' B/ l% T( D2 l! ntype *.txt #显示当前目录里所有.txt文件的内容
' ]+ \3 {. b0 \3 m
( E9 |! s6 B( G; c1 [11 copy* K- y) s/ p1 }/ `# M: V
拷贝文件
& K. F9 M+ }0 v% O/ hcopy c:test.txt d:test.bak$ j& L; s, v) h" l. M
复制 c:test.txt 文件到 d: ,并重命名为 test.bak& }! r% E" w( |' E* [; z3 e$ ]
copy con test.txt
( G( @9 u$ h4 @" W3 A$ y" ]: L3 d从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件, a0 ~+ H7 y: M0 Q. s# n
con代表屏幕,prn代表打印机,nul代表空设备" |6 i6 a7 }: ?9 S& M
copy 1.txt + 2.txt 3.txt
8 G7 a3 B7 r1 x合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件1 O7 q& O7 p5 M# z: {
如果不指定 3.txt ,则保存到 1.txt& {7 f3 ]- T3 i1 U! |1 U
copy test.txt +
[) N( c4 R0 s% q) { ~' H& G复制文件到自己,实际上是修改了文件日期
+ Q" p$ |. Q$ R- r
" p! g f2 J* v& t/ U, S* v9 X12 title: w4 H2 B4 G5 r
设置cmd窗口的标题
0 |' U% z7 t) f4 H+ Vtitle 新标题 #可以看到cmd窗口的标题栏变了
8 E- b$ S9 H' ]; z9 {6 {; D) M9 ?0 V+ u8 J/ O" y# b X
13 ver
' K& C9 g9 U! K( ]; V. G( b显示系统版本
C6 H$ Q$ K8 v6 Y J `
1 u' g; v6 h5 ~* d$ p% G( |2 |14 label 和 vol; }4 H5 X6 @* Q! x+ l6 y
设置卷标
/ w" k* V8 n# t2 a3 g* F' z& vvol #显示卷标
7 ~) G- x6 h7 v u4 v9 slabel #显示卷标,同时提示输入新卷标
! V: X& R/ Q7 l6 @- _label c:system #设置C盘的卷标为 system3 L, y! W! b2 ~: C# `+ P4 x
* Z( L/ Z$ v: G* k* ^5 W( S
15 pause/ {" Y3 R, a! q- u# k
暂停命令
1 L% ^$ n+ X$ D* A- Q
4 w2 e( L6 A- S X16 rem 和 ::
" I0 k$ J) ^4 j8 g, ?3 [注释命令+ C9 O/ M1 w! F+ l' \: n
注释行不执行操作
5 @& f- A/ Q) d% ?, Y( I
# a3 l& f I+ @0 y+ ?+ U7 x17 date 和 time
/ F: B) h* ]" k$ J# c日期和时间( S r) t, R( ~4 D5 M6 R; b
date #显示当前日期,并提示输入新日期,按"回车"略过输入! B( w5 S7 f# o( I% h
date/t #只显示当前日期,不提示输入新日期; Z' I# K4 l$ K1 j; w1 h. v* U
time #显示当前时间,并提示输入新时间,按"回车"略过输入; S4 _- S. L+ n- k/ W
time/t #只显示当前时间,不提示输入新时间2 d8 f$ Y. I4 W' P/ ]: }! h$ U
8 a M7 K% Z6 b# v# N/ B18 goto 和 :9 e3 D( S1 l% U& O) p6 a; E: O4 `
跳转命令2 p5 o8 G- P+ D
:label #行首为:表示该行是标签行,标签行不执行操作( w# M [: `0 ~" e y0 }' F
goto label #跳转到指定的标签那一行
4 R. r0 |. M# N; l8 ]1 e/ O
: V' P" c: [8 q19 find (外部命令)* I+ z" A. ~5 q4 q& I# B
查找命令! Z. J6 {' I& m. \, g" x2 L5 h* H
find "abc" c:test.txt6 i! v8 D: M4 }( Q; r1 u
在 c:test.txt 文件里查找含 abc 字符串的行. J# T3 x( @- O6 U% B
如果找不到,将设 errorlevel 返回码为1* c* _. c' l7 \! _1 B
find /i “abc” c:test.txt' j. f1 I: U/ x; C# n# J" |
查找含 abc 的行,忽略大小写
2 l* N# |# c. s V$ Z# Kfind /c "abc" c:test.txt" m. b# D; `3 e
显示含 abc 的行的行数
* p/ E" ~% z/ K7 Q- m: a8 w7 m4 F/ V" R( V
20 more (外部命令)
4 F5 Z* T: u6 F! d8 {逐屏显示
3 S) y$ ^9 S9 xmore c:test.txt #逐屏显示 c:test.txt 的文件内容
2 c5 o+ u6 Y! J( b# g! M' z
. U0 i. \. u' s9 r" g" A9 [21 tree
1 q9 D* v( m( r& m0 q% y4 F显示目录结构
* t6 z- h V7 y3 B/ D+ htree d: #显示D盘的文件目录结构% X6 F. \; ~2 N9 A
9 c$ W* Z4 i! k x! U8 m" V* N3 F
22 &$ H$ N' \/ X- E( T4 g
顺序执行多条命令,而不管命令是否执行成功4 [2 {, ~; P3 @: S
6 N% ~6 c: g* N% ^ Z
23 &&( U* U2 F) |4 k; d2 D( O p
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
6 Z1 a8 ]' F5 B) t) a* vfind "ok" c:test.txt && echo 成功 _4 ^- z6 |* S, w) O% W
如果找到了"ok"字样,就显示"成功",找不到就不显示
. {% g W8 [- c
) i2 P4 R. t6 d7 u24 ||+ I& Z4 O4 R U6 Y
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令) u; N: n1 v4 B& ^; \+ m% @
find "ok" c:test.txt || echo 不成功8 q7 |8 {9 p9 D3 B
如果找不到"ok"字样,就显示"不成功",找到了就不显示& [$ W6 k, U5 o
9 G+ Q. l0 X- }# G0 ^9 }25 |9 h& F4 |5 n% v. x* h; q
管道命令
- E% y5 X3 D7 L, Gdir *.* /s/a | find /c ".exe"; O2 u% b# B7 t+ \* ]2 N
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
$ o9 M, l) ?% d h该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数( J; g& @9 j9 s
type c:test.txt|more
7 J6 I* U' t, J3 ?6 ]这个和 more c:test.txt 的效果是一样的
. n! ?5 N0 a+ ]$ R6 x( T: s8 A7 }+ D; J; U. j* ?" r7 ^" R b$ p
26 > 和 >>+ _# G% Z! V: X1 T. F# k. j
输出重定向命令
+ i& e* @# s6 {> 清除文件中原有的内容后再写入
0 {5 ~) O2 G4 H8 o8 }>> 追加内容到文件末尾,而不会清除原有的内容# {# {: A3 C7 y2 Y7 I& a$ Z, m
主要将本来显示在屏幕上的内容输出到指定文件中
7 R$ f; X* k+ Q# a- T- e9 `# m U. D指定文件如果不存在,则自动生成该文件
# C% }8 e6 R- o! _/ _. m8 l0 C7 Ntype c:test.txt >prn2 e' m2 T6 u! F5 {$ `- |
屏幕上不显示文件内容,转向输出到打印机
, u7 }2 A( y% ~0 O5 eecho hello world>con; t5 d: ?% A3 u/ N4 i& P. o4 D1 T" f' S
在屏幕上显示hello world,实际上所有输出都是默认 >con 的0 T4 G6 L8 K2 O3 i& u. e2 Z
copy c:test.txt f: >nul
/ n/ a5 m, z3 u" Y, n2 i/ `拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息8 q1 b |+ p1 {, ]/ j
copy c:test.txt f: >nul 2>nul
* C- E* B5 ]2 r: n% a不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息; @* W; @' t; F% R; C5 F7 X8 ~
echo ^^W ^> ^W>c:test.txt8 R+ V2 \$ z- ^& w; _
生成的文件内容为 ^W > W& A- E+ I* w2 u; C3 z
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
: B& C; {1 [2 S
' W2 D, R+ k3 c* ~, c6 l8 b27 <( J6 s0 f: d) i3 _% |
从文件中获得输入信息,而不是从屏幕上
" F& W- i. {5 q) r( h一般用于 date time label 等需要等待输入的命令 N1 F' m( R0 B) C
@echo off
- W! j& {* l9 I" ?: W1 t1 [echo 2005-05-01>temp.txt
4 ?1 l: B% _1 Ydate <temp.txt9 i' i4 D' }4 E; e
del temp.txt
. O* S* ?* u" |7 A. T( \) J这样就可以不等待输入直接修改当前日期
1 y; d; b: G3 g* L
$ P' h- G9 z5 D1 M' ^28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*7 H) o. d n6 {2 T3 I1 J
命令行传递给批处理的参数
1 v+ G! i- d, J; a%0 批处理文件本身
4 f4 A/ J8 J1 X! E# O3 T%1 第一个参数; `/ q/ m& X3 W( _. k7 h) s0 o
%9 第九个参数/ `. w3 |* F+ o0 j: z( R+ e7 b
%* 从第一个参数开始的所有参数
5 m7 q( t% q& J/ G. R批参数(%n)的替代已被增强。您可以使用以下语法:' F _( J+ l1 ^/ q3 O
%~1 - 删除引号(" ), 扩充 %14 l1 Z3 _/ r5 b' I; ?* i
%~f1 - 将 %1 扩充到一个完全合格的路径名
5 O9 z; S" R7 u7 @%~d1 - 仅将 %1 扩充到一个驱动器号
( e4 }5 Q+ x. N9 M& \. n%~p1 - 仅将 %1 扩充到一个路径
1 w; @4 R/ E1 j7 ^9 a' W%~n1 - 仅将 %1 扩充到一个文件名: v2 {# J- c" H4 e- W4 z: ?2 Z6 Y N
%~x1 - 仅将 %1 扩充到一个文件扩展名- k8 q4 q3 r4 K' b: O
%~s1 - 扩充的路径指含有短名
) ?, j7 N' K% b; M* x%~a1 - 将 %1 扩充到文件属性* d) {: Q* O. h o
%~t1 - 将 %1 扩充到文件的日期/时间 d. N" W: q; f+ `( b9 B
%~z1 - 将 %1 扩充到文件的大小
9 p# m0 j- q- u4 q l* u- d+ h%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
$ w4 I: Q/ X0 F% b6 K" h扩充到找到的第一个完全合格的名称。如果环境
( |( J! C- i" z9 W变量名未被定义,或者没有找到文件,此组合键会
# j* }' N" m1 i4 n扩充到空字符串3 \8 h8 C" @/ u: Z/ c9 z9 E
可以组合修定符来取得多重结果:
4 B; d) b0 H6 A2 O! E; O# b* `%~dp1 - 只将 %1 扩展到驱动器号和路径+ C0 t7 \( p6 h& i5 c# e
%~nx1 - 只将 %1 扩展到文件名和扩展名
6 ~2 q/ C3 N# t0 e+ S+ \7 C1 V%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1," I" k1 d% u5 S8 G
并扩展到找到的第一个文件的驱动器号和路径。$ B) e; K( Y9 R$ ^( g) z
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
2 q$ T; ?# Q8 O! y) c4 p$ L0 q可以参照 call/? 或 for/? 看出每个参数的含意4 X+ e& u9 R. o
echo load "%%1" "%%2">c:test.txt
+ w0 x2 D% B" B6 F% W生成的文件内容为 load "%1" "%2"
5 V: V1 ]' x$ \1 y( }6 a* A3 F批处理文件里,用这个格式把命令行参数输出到文件2 z x$ P5 i% b. d) \2 |( [+ Z
/ }! ?8 M. p: h" F* t ]8 D- \5 r29 if
4 Z _% a9 e, S: W2 V8 E6 J判断命令) q" w" R5 f; Q6 n( j, C2 l
if "%1"=="/a" echo 第一个参数是/a( r+ A( p. W# \' d; L
if /i "%1" equ "/a" echo 第一个参数是/a) w1 n+ M6 X$ s! Y- z$ o0 r$ V
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?. O- Z! G4 f" y: x+ A( M+ P! T
if exist c:test.bat echo 存在c:test.bat文件- y9 d* C( \" q! ^
if not exist c:windows (
# ^4 z6 D/ y: ?4 H( y6 @/ u- xecho 不存在c:windows文件夹# H7 A5 B. b; E4 U$ W2 r4 @
)' X8 L) f, B; n7 j
if exist c:test.bat () ~$ G* I& _, V- O6 K
echo 存在c:test.bat; |5 U0 T* [7 k+ ?, Q% h
) else (
$ r/ x- M# c5 d1 xecho 不存在c:test.bat: C& B( i' H. X- D
)9 G& W! A" J8 B) e. n' g7 q
30 setlocal 和 endlocal. @# |+ T9 o( d3 @( a1 s
设置”命令扩展名”和”延缓环境变量扩充”# j8 ~! l" U# h: E* \5 L1 x8 F& F V9 j
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
/ J% h* k5 O, b' q7 DSETLOCAL DISABLEEXTENSIONS #停用"命令扩展名": A: }0 V" L2 a. I* `
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
* q( K" U0 E) ~3 w7 y6 T5 mSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"- V" _6 \: ?" Y6 H& g
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态
2 l. n9 M4 x$ f7 ]4 z“命令扩展名”默认为启用
. A9 V& G [, u7 N5 \“延缓环境变量扩充”默认为停用. c! U$ Q& }0 L8 e$ J
批处理结束系统会自动恢复默认值. a$ l% X- W. r
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
& T+ e4 ~, R: K2 a/ Z! s$ i- J* ^序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确- M+ d- I5 L6 v, t& V5 N: B8 O
保程序能在其它系统上正确运行3 d. H$ U+ _5 B- N5 T J& U7 w
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
! h5 A7 T1 H2 r$ ?# M/ T! l2 w1 v e8 i
31 set! m2 y. v4 H6 |7 ^0 g: q0 M
设置变量& k; I; A3 c" M
引用变量可在变量名前后加 % ,即 %变量名%
0 _5 b) B# V8 X/ V/ i# ?set #显示目前所有可用的变量,包括系统变量和自定义的变量% l5 q# W$ d9 Y! U) I, E
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用8 s. u5 [5 ^' H/ @ D1 X8 o/ ~
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1: j( _' @' x& Y; X% Q7 C* [/ O
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
. p, e3 d1 U; f/ ]( K* Xecho %p% #显示变量p代表的字符串,即aa1bb1aa2bb2' }% x) J2 f7 Z) B5 h7 u
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2; l2 I& ^& e" F
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2
& n! U" ~% z% }, w" m, u) gecho %p:~0,3% #显示前3个字符,即aa1
: ?* H, p1 r) {2 Necho %p:~-2% #显示最后面的2个字符,即b2
! W! c( y% A- ~( n( C" Jecho %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
K1 y# V5 i9 ^3 o6 W7 p" ~1 J3 Pecho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb25 c4 Y1 v# ?2 B- i3 c9 C- n$ b
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2# Q7 ], Y* [: }( `
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb27 e6 \/ d1 K% E: A) z
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb23 J( o4 O; c* \7 h0 M8 S) v
set /a p=39 #设置p为数值型变量,值为39
8 P) H0 C9 R, R8 y( T# Vset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=30 [8 r+ T& o e" j1 h c
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用* M4 j0 F- c/ u% V" {) ?
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?1 G6 Q# v8 @6 V; i9 a3 e. ?
set p= #取消p变量/ X8 L% `+ G/ V7 P @
set /p p=请输入
# N5 j7 q5 t- ^4 d a屏幕上显示”请输入”,并会将输入的字符串赋值给变量p- t7 J, T, a# ?* H d+ W9 ?+ ]
注意这条可以用来取代 choice 命令
+ w5 h- s! m2 j: o& D注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
3 u9 B6 }/ x4 h# g3 t6 N" e@echo off4 b6 J8 x6 ^3 | O) r6 z
set p=aaa' D: }7 w; n$ M- z5 R' s
if %p%==aaa ($ _* K- ^0 q4 O6 g1 ~" D
echo %p%
0 k. b( r n' iset p=bbb# ]( `" q N+ r% v! X3 c& C
echo %p%0 [+ O& _5 A. p3 T
)
8 i+ @2 k" W- K结果将显示- \. `9 i- L8 ~" {3 x* N3 J* W
aaa: a8 |7 Y7 `9 e( ^: v0 ]
aaa' A. C/ q$ w7 i0 }
因为在读取 if 语句时已经将所有 %p% 替换为aaa/ n8 |1 W; c% v/ m g7 }
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"0 }+ E6 {6 d! K2 d# t( e
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
. S2 z( D( X$ V ~@echo off
( l& d7 [( }, {0 o) USETLOCAL ENABLEDELAYEDEXPANSION. L+ q; U/ j3 f8 ]
set p=aaa/ \$ _/ m" @' w% h2 k8 e
if %p%==aaa (
2 K; @5 @! Q* B, r# ]2 [echo %p%- j8 Q, S, U% p6 n
set p=bbb& Q" c* B% U; n
echo !p!
; S' i- E9 m+ V0 J)
5 x' y& A& V: V- X) ]ENDLOCAL8 {8 E) r3 e7 ~! s, C7 X& c% j
结果将显示
3 J3 e; ~( k9 w& h, n# h9 daaa4 S+ s( T- k3 v0 e5 l% i4 {
bbb0 t4 n ~0 b9 v4 `+ h0 J
还有几个动态变量,运行 set 看不到
) A( Z2 m- Z8 q( s% a; u5 o- D%CD% #代表当前目录的字符串 v1 \: f0 ?; Y3 B. D3 e, ]# H
%DATE% #当前日期" ^1 u/ i" |: {% W* R. l( M3 L
%TIME% #当前时间
' N) n: m* q4 E4 [%RANDOM% #随机整数,介于0~32767 @3 L/ r( r* y5 q8 Q7 U
%ERRORLEVEL% #当前 ERRORLEVEL 值1 r. W1 b% d# o# n
%CMDEXTVERSION% #当前命令处理器扩展名版本号2 G4 P% N+ B- i. B/ I" ]
%CMDCMDLINE% #调用命令处理器的原始命令行# g( @) S. J" m) j, M1 l7 q
可以用echo命令查看每个变量值,如 echo %time%& _+ r9 f0 w% e! p0 m( J
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到/ E9 y4 l/ A W
) s$ _* O. S' d/ Z; A9 P
32 start5 a5 X: O. C4 r( A
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
) Q# Y2 J. i3 w$ A
) L6 x+ n( B5 ?; g33 call
9 ?0 K& E* U& A0 D2 k# o: [批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
7 m, ]0 p1 @/ }0 ?1 _0 j有时有的应用程序用start调用出错的,也可以call调用0 O5 D' ]% N, ^- y3 r
* Q& @; S! c) L2 s }' O, w# }- c) y34 choice (外部命令)! _' H, C; z# X" | ?) G( i
选择命令3 b* @8 O7 o1 K9 b. n
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……3 i) j3 A! L2 l3 z% @" c
win98里是choice.com
5 {- D6 g: L2 A$ r+ B; t0 hwin2000pro里没有,可以从win98里拷过来% m& `9 Z4 k" z7 O2 |- Q
win2003里是choice.exe
' ^% e' ^( l# E pchoice /N /C y /T 5 /D y>nul1 }# m1 n5 s$ `" B8 t7 h" k
延时5秒
9 l5 ]6 C3 u7 f5 c' t- Z, ]$ K( J; ~6 d% Q# h8 ]
35 assoc 和 ftype1 j$ y( z6 f/ ^6 ?; A5 O( i
文件关联- a7 k7 x/ T1 @9 D
assoc 设置'文件扩展名'关联,关联到'文件类型'
& Y1 G K6 G) q6 s# X) K6 i8 Oftype 设置'文件类型'关联,关联到'执行程序和参数': z4 D; m5 O( o4 g: ^8 A
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开! h* i2 t8 N; _9 [- O
而是先判断.txt属于 txtfile '文件类型'' v9 c9 e- o. h2 H9 a/ h
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
4 H) u0 J, _* F9 ?- \; C( V可以在"文件夹选项"→"文件类型"里修改这2种关联- a7 u" `; e K( L( ^0 x+ D: b
assoc #显示所有'文件扩展名'关联
. o9 {2 H3 x( e$ iassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile+ y2 q8 M6 C- A* R3 F9 G' K- ]+ G
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
+ S; C4 U3 t$ N; D1 X. Bassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
! d+ X( ~. P* p3 n0 h. |# Y" H5 Aftype #显示所有'文件类型'关联
, q5 t; d2 d( r9 Q. x6 {! dftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*8 m$ k0 l4 n# }$ b5 {+ \/ H
assoc .txt=Word.Document.8, w6 A! q) l7 s5 \! S& p
设置.txt为word类型的文档,可以看到.txt文件的图标都变了
2 @! q6 i0 ]4 \- }assoc .txt=txtfile
9 @7 G+ `, \1 g5 L y, u6 W恢复.txt的正确关联
$ ~/ W1 G5 g: fftype exefile="%1" %*
* ~* _ l$ r" s+ b4 y! [恢复 exefile 的正确关联
( ?5 {6 S% p* Q5 J% I ~如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
3 `" X+ W: [' p( @- M1 N: \* h2 o' t1 Q7 d1 B
36 pushd 和 popd
$ K' g5 w% `# |. U5 m7 ~切换当前目录
. X5 F3 W( a9 k$ z, }* s: e@echo off
9 q; b. ]* @5 @5 y, Uc: & cd & md mp3 #在 C: 建立 mp3 文件夹
! V7 E, `, N' Kmd d:mp4 #在 D: 建立 mp4 文件夹
2 v! Z: V5 A7 {) @3 Hcd /d d:mp4 #更改当前目录为 d:mp40 Y% e% _3 z/ P/ W0 u& t7 i1 y9 [
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
6 w' N3 h0 q/ p# ?( Q( Vpopd #恢复当前目录为刚才保存的 d:mp4
' k; C7 q& l* [. \
" ~" p, V5 @( O37 for$ ~7 G5 U. O2 _0 ]' f8 L3 m
循环命令
' z* o4 f ` p* M/ R这个比较复杂,请对照 for/? 来看+ H! w4 n$ p. o6 f; ]# e
for %%i in (c: d: e: f do echo %%i/ Z' S6 c! f- b) _7 L
依次调用小括号里的每个字符串,执行 do 后面的命令$ o: _+ G7 [+ B9 P& F: J" _! ]% f
注意%%i,在批处理中 for 语句调用参数用2个%
& ]* n# T5 m1 ]4 I; B: r* @) m默认的字符串分隔符是"空格键","Tab键","回车键"' R) f O4 q P
for %%i in (*.txt) do find "abc" %%i
7 s* R! M5 D' n; A/ r; z+ N5 z/ P对当前目录里所有的txt文件执行 find 命令
6 m5 v/ E4 K5 O; d, e: `$ T9 sfor /r . %%i in (*.txt) do find "abc" %%i
! F' V6 ^1 ]7 I. E0 v在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行( W0 U& @+ r9 l
for /r . %%i in (.) do echo %%~pni
9 V* G! w" N% m7 Y+ t显示当前目录名和所有子目录名,包括路径,不包括盘符, M$ P: k% x- ]! p2 x* C8 K
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt9 b1 I0 i' Q, c7 U, U) o8 g
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去4 f+ T! H$ H' g# ]) K: E- c, Y& P
for /l %%i in (2,1,8) do echo %%i
! j/ b3 B! c# z% V+ Y+ u K生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
- L. O e3 L- s$ ?4 {for /f %%i in ('set') do echo %%i
) L: O" {5 }- H对 set 命令的输出结果循环调用,每行一个6 o8 P' O7 V$ Y# L5 \
for /f "eol=P" %%i in ('set') do echo %%i+ Y. }9 t1 q; H% n& g k8 I" A9 M
取 set 命令的输出结果,忽略以 P 开头的那几行: U2 {, Z2 u e9 O) x$ M! h
for /f %%i in (d:mp3.txt) do echo %%i
! f# D+ |3 D) D# n0 ^- g显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
2 Q& J0 B3 Q; p( e! Wfor /f "delims=" %%i in (d:mp3.txt) do echo %%i
8 }6 y! i& P+ t% g显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称8 F E/ ?% S) u2 {4 T
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
8 Z3 ^6 W1 q) {4 @3 w% s对 dir 命令的结果,跳过前面5行,余下的每行取第4列0 k4 Z( ^0 r; Q+ ~+ W5 N; [' i7 k
每列之间的分隔符为默认的"空格"
" h2 I6 c/ I" O; t4 B1 X可以注意到 dir 命令输出的前5行是没有文件名的! k2 a/ t( v) D+ e& q* v
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
: r$ D# J& Y9 K4 {' _6 U/ R1 m: Vecho %%a
8 ^ _' o- ]) l5 Techo %%b
) i0 A1 a" G v& ^% K t! qecho %%c# ]2 K4 `& I- D* n1 @* Q
)# T ~5 ^8 Y. M4 l4 `
对 date /t 的输出结果,每行取1、2、3列2 K! `" \- D e+ b/ B5 D! S2 N; E
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
/ H9 Z K6 [9 A) K. k' H分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格" K/ F& d: V5 g1 i, v
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
" } U( W1 u+ g! T. ?- E: @for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
/ I$ s2 Z& d2 v6 i取第2列给 %%a ,其后的列都给 %%b9 F: Y- ` p" N! i
7 {1 ?4 z: L8 C9 ~
38 subst (外部命令)& k% o" L# X/ e2 R6 x
映射磁盘。
4 F( B. E+ B3 C, H3 E2 u6 Gsubst z: serverd #这样输入z:就可以访问serverd了0 o" F5 z7 R: g2 N' @9 ~
subst z: /d #取消该映射
" Q2 c& w' X% |8 P; [; ~4 Esubst #显示目前所有的映时* i& c2 F7 Z2 R- l
. P7 ?$ N& y# r
39 xcopy (外部命令)
8 j& I$ \9 X: R文件拷贝$ h2 q) a5 B Y4 }
xcopy d:mp3 e:mp3 /s/e/i/y5 T) H T% _& |9 r+ F2 ]. ?
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
9 R: X1 n7 d" p& o, ^2 z加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
9 }4 @& e/ q$ \3 \0 ?! q$ l/ Y/ W# [) u; ~/ F$ R; k7 Z* w
常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退- o6 _0 _9 e7 L1 b
- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:8 u) |9 D0 ]# y+ r1 L
2 L1 i" ]; z# W5 q( g+ R
@echo off
: g' h% [+ O$ |! X% |7 aset p=aaa+ T$ L3 T9 g5 T! f
if %p%==aaa (# ?% X- w( w( R. }3 a9 @4 @9 Q% J
echo %p%
* |/ z6 Y5 D2 N& C/ v+ [2 q+ qset p=bbb
0 [3 p, y6 v. S+ U% f5 gecho %p%. ^9 q0 q' i- Q2 v' I% f
)9 W% o) b& ?( Q- c" W
pause
截图:2 g4 |$ P6 \' L& |' l
2.批处理.bat 文件中输出中文乱码
/ [- I$ R1 T0 j# O! I- x- p9 [- 原因:记事本新建的文件,编码不是 utf-8
- 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
- 操作截图:
. B4 L4 ~! f6 c$ x0 r+ y' @ - 效果截图:
" e# c8 X' S$ a& |
! K) O: Y. N: T+ j0 M z
: A0 s3 y+ z9 }8 |! V* ]/ x' e ~ M & b, T U; Y6 k3 @- s
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|