|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!
$ P, J( f- H0 Q# N) W' H" A 前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效0 {1 _2 \- }" z2 s7 C: ?
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展5 l$ }$ K8 r/ S |8 T) t3 H
名为bat 目前比较常见 的批处理包含两类: / g! z3 N" O$ y, }6 s
- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理8 q' J$ G& O* t# b# k- Y
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的7 ~& O r$ R6 \: K& N& I Q
命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
( o4 R+ w ? x- @- @ 怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
0 A, @2 V, _( M; E6 x0 A 批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set2 c6 K9 ~, A0 R4 S
批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||8 c, k! U. X' R
常用DOS命令- 文件夹管理:6 D2 Z F, j- i+ t& e3 {
- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。
% `. ^4 t6 \1 q- G( W
- 文件管理:/ e7 G& T3 e" l# c2 B* l& Y
- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同3 r3 T; S7 B4 x M2 ?/ ]$ A
- 网络命令:
/ s3 L9 c Y* B7 Z# e+ t1 ]) d- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表
M1 q* X& o; M4 r- X9 q% J
- 系统管理:
' A* i' ]+ t* z& X& K+ i- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置
$ \2 C" M3 s# Z( E
" R, D" m, S$ B. g2 m, L
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /? 4 T6 W# {& T! [2 V4 |
! v; E1 i: K' c3 [1 _- qWindows Batch 常用命令
0 o, o7 S( J- Q; |0 u% Z* U* }% ^+ l1 echo 和 @
- i9 ~" k* A) L+ q) ]1 L回显命令. _/ Z+ h7 I& E: \8 g) O# p4 F* x9 D
@ #关闭单行回显
! |' T- c' M; ]/ w) h. N0 k% Kecho off #从下一行开始关闭回显& x" Y" J7 f' @' @ m0 }1 y
@echo off #从本行开始关闭回显。一般批处理第一行都是这个0 B7 y7 h* Z" }" \0 V- _% _7 h4 c8 N
echo on #从下一行开始打开回显0 M; f( R5 V' y& `
echo #显示当前是 echo off 状态还是 echo on 状态
( A' I3 v- s! ?echo. #输出一个”回车换行”,空白行
+ t6 ? I% K5 z# s#(同echo, echo; echo+ echo[ echo] echo/ echo), c' Y) p( R6 H [
" {% }! ^" @4 b1 c
2 errorlevel
; f; R+ r, W- Secho %errorlevel%
& C" G0 [/ M* H! b a, g( {/ T每个命令运行结束,可以用这个命令行格式查看返回码8 j z+ `2 C: L0 f2 a; D# R5 c
默认值为0,一般命令执行出错会设 errorlevel 为1
+ ~- c& U6 S4 \% z( c6 `
* p' x# |7 E. M3 dir
2 w) g. Z% V6 R显示文件夹内容
4 N: U0 _, O. \; h4 odir #显示当前目录中的文件和子目录
; _# i: i) t; p; udir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
8 ?% Q) @ N8 |# A5 l2 p9 @dir c: /a:d #显示 C 盘当前目录中的目录
2 S- C6 z" Q, i% _. pdir c: /a:-d #显示 C 盘根目录中的文件
1 |+ W4 [3 w9 z. d1 Bdir c: /b/p #/b只显示文件名,/p分页显示
' m; Y' p: N' pdir *.exe /s #显示当前目录和子目录里所有的.exe文件# ~0 S' D x2 {
- p8 |) d% y$ y) E; C) ~, G9 s2 C
4 cd
$ o2 A) z4 @- ]* K0 L3 |# o切换目录
* ?0 B# }0 K% B& n }! [4 O) f4 ~cd #进入根目录$ q' Q# X9 h9 M! C) I2 J) D! R0 n
cd #显示当前目录; l- t. l" l; B( _0 z
cd /d d:sdk #可以同时更改盘符和目录+ a' c4 a' `. D6 m1 A7 b
) T/ k7 c- i( n6 w& A5 md
3 o9 @. H! T3 e! @/ f3 g创建目录: J1 R5 t" \- L9 ~5 \7 y
md d:abc #如果 d:a 不存在,将会自动创建中级目录( R& F8 |* K; _" d" l* _
#如果命令扩展名被停用,则需要键入 mkdir abc8 e+ u* Z+ e) T; Y4 h
- z- L1 c: J% R" x0 O( O) w
6 rd
`* x! k0 o8 i5 ?# n% r删除目录
! o! I6 D+ S" o6 `rd abc #删除当前目录里的 abc 子目录,要求为空目录
! A5 [0 A% T) s& ]rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式$ @- q* _/ K% [3 q M, N7 M1 l2 O
8 r/ i J# C: t& k- I
7 del
7 a0 |" B- x: W* b, H m删除文件& ~" P1 x \5 I. W% a8 O3 B
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
+ }4 L9 {* U3 Y' z3 ^& @( Mdel /q/a/f d:temp*.*
* ^8 ?3 K2 @0 G2 B5 r删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录3 ]- p$ }2 K7 N# m, k+ M9 V
del /q/a/f/s d:temp*.*- [& n) z+ ^) x. o* C: ~* {
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
9 n+ \" \* E0 B1 |6 Y h7 r5 u' c @, T% k
8 ren
9 v( ]# R4 j" E" \) k, ~7 Y重命名命令
" E% X; l9 ], R7 H7 }ren d:temp tmp #支持对文件夹的重命名
) ^4 i- v6 F2 ]# _, Z8 ] f4 p4 I c/ W0 b4 ~; p
9 cls9 v D0 H/ U! N6 |! `) X! b. b
清屏; l7 M, W9 Z' K/ P/ G" C
10 type
" k( f7 O/ N2 f* G1 [0 X& \显示文件内容
/ q8 V! a6 W6 jtype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码: M7 w7 c% H+ f/ a4 P Y
type *.txt #显示当前目录里所有.txt文件的内容
]6 }# x$ F7 m# L# a T3 Q/ Q& a' b4 x: M9 v4 y
11 copy2 t" J! a" c n7 L, A# V
拷贝文件8 U3 y2 A% y( q3 T6 r$ h7 t; q/ V: b
copy c:test.txt d:test.bak
( ~3 P- F& w8 L& V3 q" W复制 c:test.txt 文件到 d: ,并重命名为 test.bak
' J" M- O- q$ D% b3 {copy con test.txt
4 }. _" V0 w9 h& ]从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
( s, g4 g8 ^$ p$ f( ^con代表屏幕,prn代表打印机,nul代表空设备5 `2 C1 g G; R
copy 1.txt + 2.txt 3.txt
8 H; A H5 e4 g4 p合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
/ a4 l# u3 }( }9 e1 o3 x/ v如果不指定 3.txt ,则保存到 1.txt/ D5 Z- ?: ~7 S1 |0 t% y
copy test.txt +
- w, ^7 h1 k4 x, r复制文件到自己,实际上是修改了文件日期. A4 S6 R2 [5 t& }* z: k. h: E- L: a
6 A( _( b5 u* ^% @5 r0 Y9 _9 p12 title( k! N+ d8 d' e4 i. w6 B2 F# q4 v
设置cmd窗口的标题2 s- I+ ~+ r! d4 P
title 新标题 #可以看到cmd窗口的标题栏变了% f6 |0 y7 c* ~9 }! r3 }, ?2 C$ P
; n6 v2 y8 A8 L6 R; x3 D
13 ver
" N$ u$ r0 n% w7 b& ?% N. O i显示系统版本( F& Y9 R7 t) Y; [( t# k
7 R5 m# R8 W% b+ W14 label 和 vol3 `9 ?8 @- L! m' \2 C
设置卷标
& I( g8 N" @- ?* ?; v4 j( Hvol #显示卷标! K7 i/ a4 _; N. D5 ?% w0 T1 C4 Q
label #显示卷标,同时提示输入新卷标
% b K7 M- b- Z/ n+ n& X$ |5 K' Rlabel c:system #设置C盘的卷标为 system
f; c- V6 e( F( P! i
0 G; C" r6 U6 M* `15 pause
# j0 ?% p. k+ ?! [$ {4 _9 f) k暂停命令4 v8 N8 t" n$ f3 h }3 U- e
& P! t; ]5 Q! l7 A. s/ m
16 rem 和 ::; H9 s1 s/ A; K1 }+ K
注释命令
( q) S0 h7 t* \) F; Q# |3 `) ]注释行不执行操作( I% v! v4 y! w: n1 a( ]1 V* b
( T4 x1 i- E/ _; O* M# g) M9 G ?5 u
17 date 和 time
+ {( Z! L8 _7 r日期和时间
2 R4 N6 k# p: Wdate #显示当前日期,并提示输入新日期,按"回车"略过输入
& P: p( O. @; j* Adate/t #只显示当前日期,不提示输入新日期
9 Z5 p" P& R; |+ qtime #显示当前时间,并提示输入新时间,按"回车"略过输入
. o% n/ n8 J; U8 r1 Atime/t #只显示当前时间,不提示输入新时间
, e- \% d" D! D! Y, u4 R
, ^) B& t- e% N/ F6 D3 w$ i G/ J5 h' L18 goto 和 :
4 G( F% o) l e: b2 l" ?跳转命令
3 o5 t' \9 n: A) \:label #行首为:表示该行是标签行,标签行不执行操作* G# E1 y; q8 h+ I9 B
goto label #跳转到指定的标签那一行
- P: ~6 s( H: |1 y: k" j3 \( y0 G* B8 D' q( l. q
19 find (外部命令)7 i9 w" J( _; G% q- e) C7 Y
查找命令" S% g; v$ ?7 U8 p9 s7 _4 }
find "abc" c:test.txt
; i- K$ @; ?) e- L在 c:test.txt 文件里查找含 abc 字符串的行' ?8 _- ^8 C7 c5 ?
如果找不到,将设 errorlevel 返回码为1
3 e7 j# ]6 C1 e% q6 S: |9 Vfind /i “abc” c:test.txt
6 ^( B5 v# T% A- ^" F查找含 abc 的行,忽略大小写6 F3 x& ?1 q" |8 z8 I( O& a
find /c "abc" c:test.txt
' x* u6 h: k ]! c9 X, E9 P. b显示含 abc 的行的行数
. L+ \ O8 e, `& b2 O- d- ]( ^1 G" w( ?9 ~9 g$ t8 U
20 more (外部命令)% q- v& E8 T1 y, K7 E
逐屏显示
# B: t: h4 \1 L+ \8 }more c:test.txt #逐屏显示 c:test.txt 的文件内容0 J# k! k. g4 X9 K7 ^- G
0 Y: A3 s% E H# Q3 O' n2 |% O
21 tree- ~* u+ a$ p) x9 ^* {8 \- B
显示目录结构
* o2 Y- C; {# \& C6 atree d: #显示D盘的文件目录结构
* c/ s- {/ r% W/ \
1 u' E) { d; q22 &
* C+ _/ _) E1 N9 ?3 }顺序执行多条命令,而不管命令是否执行成功7 U5 s) w6 S* {' k% ~1 t5 n
3 z Q4 ~7 C! Z" V6 }23 &&
8 Z- K2 J2 s- u顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
8 @' {/ c. [% g/ `: o }find "ok" c:test.txt && echo 成功0 n2 K; n ~/ a/ Q9 P; o3 I
如果找到了"ok"字样,就显示"成功",找不到就不显示- p1 K* ?1 j( Q. S7 @! d5 A8 V
9 i/ A2 D0 J2 a& k2 q( _( R3 b: W
24 ||
' R% r0 D" \5 C S" X顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
7 {4 S1 n8 ]. @" S6 ?5 Z) d# Dfind "ok" c:test.txt || echo 不成功
. V# |! c1 m% x$ |' |4 f( l如果找不到"ok"字样,就显示"不成功",找到了就不显示: W) ]! m R9 d1 x
' c E% ^, m6 ^+ d25 |
6 x! x* i6 l1 c- |/ G管道命令
5 }& z6 y2 \7 w# f2 Sdir *.* /s/a | find /c ".exe"- J2 y1 r7 N4 ^: c/ T8 v- V2 t
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
# K- E3 u n$ F; } A9 ?该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数 R& C) I8 O1 D3 q0 Q
type c:test.txt|more
- T3 f8 u9 n; ]$ ]# W: |( D这个和 more c:test.txt 的效果是一样的6 f2 b3 W, @ Q+ M% b6 C
7 n" E2 V( [( w4 l( S, _
26 > 和 >>
3 v3 z' D4 Z2 D# ~) e) J5 N输出重定向命令
: ?, @( U8 A* f" L i# N9 j> 清除文件中原有的内容后再写入
/ A9 p. B6 p O# Y1 H# p% C>> 追加内容到文件末尾,而不会清除原有的内容' P7 A: u- f3 | I! ]
主要将本来显示在屏幕上的内容输出到指定文件中2 e8 K, v8 Z, U/ F5 S
指定文件如果不存在,则自动生成该文件
J5 i0 U* E% d& d% w3 Ntype c:test.txt >prn3 r" E/ A3 G1 H
屏幕上不显示文件内容,转向输出到打印机
V4 e1 ~" [( ?- Eecho hello world>con' z: K9 Z8 L4 {7 Z, c; ~
在屏幕上显示hello world,实际上所有输出都是默认 >con 的& d9 C3 H) N3 g, b* Q/ B& t
copy c:test.txt f: >nul
, M$ _: j0 \& ]拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
: K: y. h8 b4 Y" }copy c:test.txt f: >nul 2>nul# c b4 k5 g% A" `2 k
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
3 g0 E" v+ |; g% F* {3 k: o* P( I& y. kecho ^^W ^> ^W>c:test.txt
6 K+ t. d3 a: g1 ~& T' y; _生成的文件内容为 ^W > W0 q5 v5 A' s$ f8 \+ @
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号% w/ x6 i& V! x3 l4 Q7 X1 P. W
d1 t1 H9 E& w. v27 <! F# A4 V+ C, u+ Z' I, |$ j
从文件中获得输入信息,而不是从屏幕上- x; L9 u0 M- j7 s
一般用于 date time label 等需要等待输入的命令
. j8 E9 W: x3 s6 B9 q@echo off
" B+ U9 K" \0 L( G2 Q5 uecho 2005-05-01>temp.txt
, @% g8 x- H- h& \4 m9 Vdate <temp.txt
9 \0 y. S4 K! Q( _2 [% i& tdel temp.txt
1 l2 r# r T k这样就可以不等待输入直接修改当前日期
' E5 D* Y& U. y' U& O6 P) I! }9 L5 ?# w3 J+ G4 k
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
$ V1 K8 i0 ^' X1 m0 O) f命令行传递给批处理的参数
5 q( m! ~) \7 A2 s%0 批处理文件本身! Q9 }+ Q: o8 H9 s# h a8 `2 D
%1 第一个参数1 x9 y. W# f* Z
%9 第九个参数2 B" F7 T$ F/ K$ h L
%* 从第一个参数开始的所有参数. e' D' I% o4 m, o
批参数(%n)的替代已被增强。您可以使用以下语法:2 V* |) i) \6 X" [7 ]
%~1 - 删除引号(" ), 扩充 %12 U/ a' P( A% g/ Q$ d
%~f1 - 将 %1 扩充到一个完全合格的路径名
7 J7 E, v+ Y9 N! i6 a! |%~d1 - 仅将 %1 扩充到一个驱动器号9 B. ]+ q5 s7 } S
%~p1 - 仅将 %1 扩充到一个路径! E7 s* u9 Q6 g
%~n1 - 仅将 %1 扩充到一个文件名1 Q9 {$ u9 V! {' P0 n% Z
%~x1 - 仅将 %1 扩充到一个文件扩展名
8 o& b) x: d0 ^# F* P%~s1 - 扩充的路径指含有短名
% I9 W! Y/ A2 Y. ^2 C+ l g%~a1 - 将 %1 扩充到文件属性- Y7 V: A1 t) p5 q. S0 n* m' T
%~t1 - 将 %1 扩充到文件的日期/时间
/ _5 H4 k3 N7 J o) p X- y%~z1 - 将 %1 扩充到文件的大小
4 L! w* t( C1 N; w) c) t, M8 j$ Z* u+ p%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
+ Y% ^ J5 i! i扩充到找到的第一个完全合格的名称。如果环境/ R$ \! }! r& R% M
变量名未被定义,或者没有找到文件,此组合键会; l8 K$ E5 n2 q
扩充到空字符串1 N% o8 X" Y; I. B5 [. Y' M- m
可以组合修定符来取得多重结果:
* T$ z1 N* H6 q0 A1 `& X( V, L%~dp1 - 只将 %1 扩展到驱动器号和路径' V) C. P- _" T; R
%~nx1 - 只将 %1 扩展到文件名和扩展名
& i/ i# Z* j* [# L: W' e9 Q. v4 _; X%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
- ]3 K, f; k5 |5 @1 B" ~, `7 C) t并扩展到找到的第一个文件的驱动器号和路径。7 O( ?4 l# s6 z2 H8 _
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。9 m8 g9 y2 l$ x! B* F- i+ x( z
可以参照 call/? 或 for/? 看出每个参数的含意4 P2 H, `0 }/ N( c3 ^: [) ]5 u
echo load "%%1" "%%2">c:test.txt# Y- j4 d/ w7 F8 e! a
生成的文件内容为 load "%1" "%2"( w) n* Z$ \" _
批处理文件里,用这个格式把命令行参数输出到文件
{" b, \1 G! N% ]3 t; G: u) f( S" m0 a+ Z! J2 ^2 L
29 if' M" r1 l/ [- b2 T0 e. ]
判断命令
, f; B; P# ] @$ nif "%1"=="/a" echo 第一个参数是/a' s) D* V4 A2 F7 H% x5 w; Y+ ~
if /i "%1" equ "/a" echo 第一个参数是/a% {' ^8 @! K" r) X0 K
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
9 K. h- c: _; H; O4 Xif exist c:test.bat echo 存在c:test.bat文件3 ?6 f- ^8 D# K1 U) [
if not exist c:windows ($ T, d% {: b' K' v) ~9 H
echo 不存在c:windows文件夹) r+ ~# ?' I/ d* z8 k
)
0 Z/ f' i/ e" H _8 N; F& Lif exist c:test.bat (
4 K5 W1 `% b" D4 l# l' cecho 存在c:test.bat3 S- _+ y) z8 C0 s H/ B7 j7 w
) else (! D6 ~8 \. \ B( }6 Y& v
echo 不存在c:test.bat& r* E' T# B; f* |' J
)
$ m) ~% @9 E d1 g/ @30 setlocal 和 endlocal
1 |! t: Q7 C* [ O' h j& ?设置”命令扩展名”和”延缓环境变量扩充”; F9 _3 Q5 `$ _. k# H, C8 j1 l
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
# s! S/ P1 G4 W0 Z! {( iSETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"' x* u6 A) |" B
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
3 e9 n& d7 ]0 M2 I+ qSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
8 \3 l/ [' V( ^# R0 RENDLOCAL #恢复到使用SETLOCAL语句以前的状态" G! e( t- U1 o6 |. h4 V* F
“命令扩展名”默认为启用
+ h) x" ]0 P% t2 A“延缓环境变量扩充”默认为停用
' c/ V# s' I f批处理结束系统会自动恢复默认值1 l5 V( L+ r7 F g7 _. `5 z
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
- Q% t6 h1 C" U+ T6 F) R" l序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
6 V3 Y$ p/ k n- @2 E8 _: {保程序能在其它系统上正确运行( K; n) p* W; z' ^% z, |3 G
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程' S$ O3 o4 p. N# e
) c( T) s- B' S/ k' }5 z
31 set
7 f; M6 R8 y" s/ X1 X设置变量+ J- K& |; ? K/ |
引用变量可在变量名前后加 % ,即 %变量名%. [; C+ r3 z2 m2 w3 r
set #显示目前所有可用的变量,包括系统变量和自定义的变量
u. o" H; H" J/ {, D! L+ Z z: techo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
H. C7 C) c( [' `0 T Q, ]1 }1 Iset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
% L$ w& l7 P) x D) u( M$ g* P0 gset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
. a# D, O* v- K1 L$ p! n2 e E/ wecho %p% #显示变量p代表的字符串,即aa1bb1aa2bb2. [' X0 l4 b3 c. w: G
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2, f8 _/ ?. B# e/ n' m2 ~, N" `1 o2 A" l
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2, }! \7 \: m! I( `/ g3 u2 }% b
echo %p:~0,3% #显示前3个字符,即aa12 b4 o" N" Q$ ]# c
echo %p:~-2% #显示最后面的2个字符,即b2
0 I. u+ u# D2 \+ U1 @! k& k. oecho %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b0 r* @- C# V! W1 ~* y2 D& Z! P
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2; m a- n, V3 C1 D+ s) g# B
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb20 ~8 t( J4 H$ S! p" G% p# j+ _
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2: |' k( g8 f# ~+ e5 x' d
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
* S( P1 N% E; ?: n$ }set /a p=39 #设置p为数值型变量,值为39
: T5 a! |9 H) |' B1 ]% x2 ^set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=37 |) G* x! s9 ?1 d, y. }. \! Q" A- R
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
4 C# P! G0 t* g; m% yset /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?. |( B( w6 a; Q1 x
set p= #取消p变量* \$ s' ?8 h* N) w. a" G/ r+ a p
set /p p=请输入
0 c$ H$ t* N# `5 a3 y* M9 s屏幕上显示”请输入”,并会将输入的字符串赋值给变量p# i0 h1 Y1 c V7 e8 ^/ X6 }
注意这条可以用来取代 choice 命令5 s8 D' A6 e6 ]- ~3 n; R
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
4 v! p$ ?- Q5 v( o2 N@echo off
5 g) E! T& l& _- Y$ I6 \set p=aaa
! D, W! X) i. o6 ^if %p%==aaa (/ j K+ ?3 Q2 o; o
echo %p%0 q2 l( Y! h0 U7 N2 _
set p=bbb2 o4 o; _& I! \6 {& P: ?: L* e
echo %p%
' P% u- R) I* x& i)
. x$ A) B& l/ h' [( G结果将显示! S0 M9 D% m9 h3 h5 N1 Y/ i0 L5 d% s
aaa9 y f: G5 Z3 f$ [8 s* m
aaa8 ^* \* F) J& d# O/ e
因为在读取 if 语句时已经将所有 %p% 替换为aaa
. q( O$ j. d" q% J2 c这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
2 b5 S" _7 l4 ^/ [; U/ ]8 {" M! j可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
! Z2 Q# C, R/ @, Z2 ^% P@echo off( I# b6 s# g! K- T, m
SETLOCAL ENABLEDELAYEDEXPANSION! F$ o( E- f2 S; T+ a w O* A
set p=aaa
" t* w( e; K; L+ G6 d, B! Zif %p%==aaa (
' {; `- V! i- ?; {- b7 {: b$ ^6 U8 L; H& Xecho %p%
2 W; ?. C# A1 G4 \, Uset p=bbb
/ L5 D$ N( S* _# S2 r+ e7 yecho !p!
& i+ R& B+ o& K; t& O)5 q1 m8 w r h1 }0 }1 Q8 s0 g, f" D
ENDLOCAL+ ?2 \' P# p. S, p) k" q
结果将显示9 C* G) J. o4 X1 j4 V6 E9 ?
aaa# q) j6 N7 i! T, t0 U8 a
bbb
9 I; A+ w$ _2 ?% W* p: h还有几个动态变量,运行 set 看不到0 g8 O0 W; ?/ _0 W
%CD% #代表当前目录的字符串4 `/ F& c& C9 V+ ^
%DATE% #当前日期. b0 v7 E) U1 n. S
%TIME% #当前时间9 q3 J. u4 b4 W( Z; q) Z; U
%RANDOM% #随机整数,介于0~32767
& j/ J8 D2 I* z/ R8 L%ERRORLEVEL% #当前 ERRORLEVEL 值
" j1 o( ]" {4 M/ s1 C%CMDEXTVERSION% #当前命令处理器扩展名版本号
5 [& P+ i( K+ U0 \4 t0 q+ [3 |%CMDCMDLINE% #调用命令处理器的原始命令行
1 Z! a* P! x) s( K) o可以用echo命令查看每个变量值,如 echo %time%9 w1 O4 [/ U2 f' {/ U/ G4 A# w
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到! J7 G0 R, G7 R! i3 C
% x' {, [: Y5 a8 q6 |32 start+ G. p ~* d+ E8 C) }1 n; S
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
! J+ K, d; D% L P: I% C5 O s) q2 t/ v/ ^( ~
33 call
, X1 C J2 X2 ^2 W批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行2 ^: M' \* a; E7 m; g3 \7 B7 ?
有时有的应用程序用start调用出错的,也可以call调用5 ~, A: ~) e; C- O P" s& i4 c* k/ ^
2 q, a v/ f' M9 G
34 choice (外部命令) l" {/ O' p+ p4 Y. r
选择命令
- R# E h4 ~2 D) @5 [( v' V% \让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……8 x3 Y! @1 c) ^# v5 U
win98里是choice.com' C4 o7 I+ V" Q8 A8 Y1 _+ P
win2000pro里没有,可以从win98里拷过来
& z& H; O* d6 ^win2003里是choice.exe
8 Q2 \, c* G* ^3 F: _choice /N /C y /T 5 /D y>nul; P; I! m* D* r6 r* o% I
延时5秒
8 G1 q$ |7 j8 e. d( o4 F: F# F( B" K& i' x4 ~- \# n6 k( g' G
35 assoc 和 ftype
: z( q! }. O( J文件关联9 [6 r0 [: e# X5 }/ H+ A3 e2 i
assoc 设置'文件扩展名'关联,关联到'文件类型'
4 ~4 ^. A( N( V/ w# [) Sftype 设置'文件类型'关联,关联到'执行程序和参数'+ [& d9 y/ l! j- \
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
% ?* |2 ^5 C$ g/ X1 q% ?而是先判断.txt属于 txtfile '文件类型'% T3 @" k0 M. O3 f/ a- o$ j
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %16 h! M) m( o* E1 u; e" r1 t3 s
可以在"文件夹选项"→"文件类型"里修改这2种关联2 X4 _- _0 P- d& j# E4 u" M
assoc #显示所有'文件扩展名'关联
' C/ }- p! R3 F d' |4 Yassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
+ A; v" ^* F& [; }2 h; J( [$ |- Tassoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8% Z1 F, Y. g+ u1 S
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile* V3 Q4 O+ S0 |
ftype #显示所有'文件类型'关联! M1 U0 t1 O2 ?* r
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*" Y8 `) b/ [6 v ^2 o- p6 s" D. u
assoc .txt=Word.Document.8
* I# y7 `( C/ ]: c& f0 K4 c, G T设置.txt为word类型的文档,可以看到.txt文件的图标都变了
0 S [6 Z J* b' P* {4 O. } s, Fassoc .txt=txtfile
* J$ { M; U$ C; m9 m& n M; s恢复.txt的正确关联
7 d$ W' J* q8 q: s* E u; pftype exefile="%1" %*
: S. ?% w4 \3 x O恢复 exefile 的正确关联
& N. _1 C w1 g% v+ r9 _7 M如果该关联已经被破坏,可以运行 command.com ,再输入这条命令4 l7 ^" D' v, Y7 G7 q
- W1 \. ]1 W8 t$ a3 U& M s
36 pushd 和 popd
* j4 ^: I: P1 W, b# W: n$ Q: S切换当前目录
7 }( R( h; \: X. y@echo off
, j9 t; Q# o$ e3 Jc: & cd & md mp3 #在 C: 建立 mp3 文件夹% U8 \$ L9 I. E. E9 p6 m; E t1 s
md d:mp4 #在 D: 建立 mp4 文件夹
! ^* h$ O1 a8 O6 f- r. g" Jcd /d d:mp4 #更改当前目录为 d:mp4
# ]" ]- @7 f6 Y F$ Npushd c:mp3 #保存当前目录,并切换当前目录为 c:mp31 R8 g |7 E( d! A
popd #恢复当前目录为刚才保存的 d:mp4* e; x' Y* e9 c
, i3 y+ v2 ]6 c! r" \+ n' k37 for
# {8 j; y5 S3 L: f4 u) [循环命令) ^6 R7 _( `3 ^& k7 z& r3 q v
这个比较复杂,请对照 for/? 来看8 v+ H+ \; `. _, C) H% v; X+ r
for %%i in (c: d: e: f do echo %%i
; |3 t. h/ I$ A- e$ D5 U: s7 ~依次调用小括号里的每个字符串,执行 do 后面的命令
* k0 M+ I2 e; \: o4 A: R* V注意%%i,在批处理中 for 语句调用参数用2个%. f1 ]6 |& e# L+ I$ i$ I) @& {
默认的字符串分隔符是"空格键","Tab键","回车键"; y0 _1 @/ C+ J( B0 k9 c) p
for %%i in (*.txt) do find "abc" %%i/ a. O+ `) D" ]0 f
对当前目录里所有的txt文件执行 find 命令8 y3 W% M- \2 C( p; k! K
for /r . %%i in (*.txt) do find "abc" %%i
3 H1 x, j4 P3 s在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行1 q- R% L! H1 Y' s" P
for /r . %%i in (.) do echo %%~pni7 s4 _; U$ m, z/ j% |
显示当前目录名和所有子目录名,包括路径,不包括盘符
6 v3 @# J) X. `' \( s$ z$ Q9 Jfor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt% |) `3 A3 G* }# d
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
$ {( K* ~8 _. Q7 m2 |6 K# Pfor /l %%i in (2,1,8) do echo %%i
& k* ^0 ~# e& U; r6 P6 F+ ]- ?8 O& v生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
, c N( Z- w5 D1 J3 Y& Ifor /f %%i in ('set') do echo %%i
8 R+ x% U6 [6 S0 t对 set 命令的输出结果循环调用,每行一个
% W/ e* b7 Z: @, i6 pfor /f "eol=P" %%i in ('set') do echo %%i
8 w' O/ c; t+ R. v取 set 命令的输出结果,忽略以 P 开头的那几行
/ l7 D1 z. S$ `5 ]! M: f! \for /f %%i in (d:mp3.txt) do echo %%i
" d' B1 M0 |/ \, \* i显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称% F$ A9 l$ R2 O, P
for /f "delims=" %%i in (d:mp3.txt) do echo %%i
4 ]& H4 G5 @5 Y- J! [7 ?: x" g显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称3 W& S0 _" F* Y) Y& ?* ^
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
+ [' Y) _1 ^0 V5 G对 dir 命令的结果,跳过前面5行,余下的每行取第4列
' R" `% s6 Y. v) \每列之间的分隔符为默认的"空格"9 n* `% i; V- y* R/ F% N
可以注意到 dir 命令输出的前5行是没有文件名的9 ?- y# B! u9 h! K
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
5 s- `1 M: ~, k6 Q" Oecho %%a
( X0 j6 T: C/ D' U7 w) j% X) R7 s5 qecho %%b! @# r0 N6 J: o: C) H
echo %%c' a& ~% `$ z$ @
)
H; s3 \# |. V5 f8 _对 date /t 的输出结果,每行取1、2、3列/ M' C7 ^) @9 m( Z- r
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列1 F- ^+ f+ U0 Q, J/ H; h
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
$ H! U, E( o5 `& m' W% z Z5 ^其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
& D! W; [6 V7 _for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b0 W2 e! n7 c. n& R* z5 z
取第2列给 %%a ,其后的列都给 %%b# e& t8 R9 [' ^3 ?7 k+ [
4 t" c+ ]7 S/ G0 \, \4 n4 h0 a38 subst (外部命令) Z. M: q. h" h" L2 |
映射磁盘。$ w7 G6 r7 L j
subst z: serverd #这样输入z:就可以访问serverd了
/ [) ~! n& |( ?; h; D' X2 Q% Qsubst z: /d #取消该映射
# i* X7 [" C( x$ [5 ]subst #显示目前所有的映时
# i4 J. F. S9 v7 G- b, y
3 f1 f1 r0 u2 a1 z, n39 xcopy (外部命令)
3 T: s8 u8 c! O% K) D文件拷贝
+ u$ h7 ]4 q3 G9 Kxcopy d:mp3 e:mp3 /s/e/i/y3 R+ \8 \9 l8 m8 q4 f9 T3 f
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
$ t- w, r8 _4 u8 c# v& y, u加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
6 |" r% r( s4 W& `6 \- `0 k' ?6 X7 z) k% [! |
常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退4 G. W. |+ k; I4 i3 K. Y' l$ x
- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:4 u X2 V0 G/ X8 `) K; C
9 l* W, q# B7 B# U+ B
@echo off! z8 Z2 F4 l. p+ ^6 V/ {2 [* [
set p=aaa
5 T' i* ^) E0 H: T) z) Lif %p%==aaa (
. G* e* o# {1 `9 Hecho %p%/ Q# B$ }8 N4 \9 x
set p=bbb( J9 S1 y! O+ d" B6 f
echo %p%9 R3 a) @% ~! {# B8 w
)) c8 q! {# v1 X% B1 `& t# ~
pause / \& O& Z" a7 L4 o
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|