|
|
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!; |; w9 ]( |, @4 z y; N) t
前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效: b5 k; u: a7 `4 R% W$ G6 o8 o- _
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展8 J7 c6 G9 l# d/ j6 y3 Z
名为bat 目前比较常见 的批处理包含两类: ]$ d) ~! Q) d z* j
- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
2 E( ]8 ~& X) q* z/ u7 P# J8 @
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的) ?8 \% G" T6 X- d' n
命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
! |+ E" X6 e% @+ G T: l 怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
B6 j+ K8 P2 C4 P; t! J8 ~8 \ 批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set# R% V R+ ?% X3 E0 m& W
批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||+ C) b3 i4 e7 Z, c0 J5 r
常用DOS命令- 文件夹管理:
: c% a5 j( K5 O3 O! Z8 n- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。" W- E2 N7 _0 S9 a3 S: D5 o
- 文件管理:* r x) H9 B5 n& }4 ]
- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同
& n. L1 R9 Q: s9 I) ?9 z4 t/ K3 M' Y% K
- 网络命令:3 x2 h% Y1 d: a9 e0 s) t
- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表, N5 b! p% B, r% C
- 系统管理:
* c2 B! ^5 }5 B/ W) @' @1 f- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置
/ @2 I- A' h6 ` K' p5 i
; U1 j7 z( ~& F ~& k
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /? , |: K* Z' E4 s: E3 g5 T+ I
9 T, ^- Q% ~* ?6 T
Windows Batch 常用命令
$ O3 S- Y3 G1 G5 h% G: [1 echo 和 @
& f4 |% r- v2 U8 j3 K4 C( e/ y; D4 P回显命令
! M0 l8 g2 G: E' l@ #关闭单行回显
+ W! T0 B0 W( q; `2 E1 V4 ?. o1 fecho off #从下一行开始关闭回显
; p" m! }& k2 x, ?$ C0 [, O@echo off #从本行开始关闭回显。一般批处理第一行都是这个5 T& ~, u8 V& y- U
echo on #从下一行开始打开回显+ I( G0 n/ b* `3 N
echo #显示当前是 echo off 状态还是 echo on 状态
. [' P( H6 G& b' ~% |& Q) {echo. #输出一个”回车换行”,空白行
" v0 E+ x% o3 K4 T#(同echo, echo; echo+ echo[ echo] echo/ echo)/ l6 n1 y1 T& a9 `
/ }( z. B( ]) ^2 errorlevel
. y& Y$ A* ~1 ?* A9 v9 L2 mecho %errorlevel%
. Y* g9 w7 _+ J& z# C b每个命令运行结束,可以用这个命令行格式查看返回码
; o/ |9 _& P: t# u' Z) g默认值为0,一般命令执行出错会设 errorlevel 为1
}9 A' ~$ g* A0 W; p' U0 X
3 j0 u5 \$ m% n* M7 ?" @3 dir
1 |0 t* `" x- a2 t, s" F- i显示文件夹内容/ m4 u! m1 n3 w" Z8 F V1 Z) D/ ?6 @
dir #显示当前目录中的文件和子目录
: \- V9 T; k1 K n/ gdir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件3 H; k; O; t! }; l
dir c: /a:d #显示 C 盘当前目录中的目录& S3 D/ n$ h1 T/ f
dir c: /a:-d #显示 C 盘根目录中的文件6 s/ E" g/ y% C* Z- A b
dir c: /b/p #/b只显示文件名,/p分页显示. I' o; d) J4 M. R$ i( G/ s/ R
dir *.exe /s #显示当前目录和子目录里所有的.exe文件
' C e$ C0 r1 k+ n) ?8 X8 D
! t0 o3 \5 @$ P l W3 I0 _4 cd# Q# x8 w, A4 x& ?- M
切换目录
4 a/ `/ d. \- Y F2 \2 \. W/ @cd #进入根目录
4 I8 ^6 g) I9 A( v* _cd #显示当前目录
2 X" Y2 _* w; T6 Y& [2 b9 z- qcd /d d:sdk #可以同时更改盘符和目录
, g1 p2 H4 G3 w4 d/ q- F+ H4 l3 b# [7 u7 R1 Y: b1 o
5 md# g; h! c5 a1 p* c- Y
创建目录. Z) s% {0 a0 B8 c6 }! l5 E
md d:abc #如果 d:a 不存在,将会自动创建中级目录
! Q5 o& i% w2 h$ a. F#如果命令扩展名被停用,则需要键入 mkdir abc" j2 c7 j1 B q3 l, [+ ^
- N L5 X5 e5 p6 rd
: b# B: k3 u. B, I0 y/ F删除目录
2 P/ c/ c9 |; R* yrd abc #删除当前目录里的 abc 子目录,要求为空目录
9 g/ W# h9 t9 k7 W1 b: drd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
, u( B# u9 X/ @3 t( F7 ]6 i# X$ ]0 ]$ f7 Q, Z9 E( R! |& m) c
7 del
, T; q: {. x* i1 I% }3 q7 z' ]6 p删除文件5 s% g1 R2 K1 T0 W4 @
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件' ?7 c8 F. T* D5 s m1 f
del /q/a/f d:temp*.*- O% h8 k, s$ y, g
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录" r7 [7 U3 o. o
del /q/a/f/s d:temp*.*
: l) _6 Q. |0 N1 b& Q7 n3 n删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录! m7 P. |. b5 J% H- c. a
- q6 F' o4 X! W( B; }+ U5 Y
8 ren R; K/ U" P) k2 r; T9 P7 N
重命名命令
' h0 r8 F- g3 ?; c, I* a) `$ qren d:temp tmp #支持对文件夹的重命名
+ |$ d* T6 \% N- `' _
8 G8 Q n {! g8 l7 H' o9 cls9 H' _- L5 G+ K
清屏
" B" [6 E1 y; z3 E" A0 c) R7 Z10 type
4 v E8 O# O1 m# t/ X* Z显示文件内容
2 M- c' v. U$ X- @9 J) vtype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码( l! B6 v! L! J' `
type *.txt #显示当前目录里所有.txt文件的内容" h( s! ~7 i6 e! O* V$ B
, T3 _. S) q' l+ ]8 _7 J; {3 c+ r
11 copy( v% o: p. x! q0 ^0 K. `
拷贝文件
' L/ _+ H% t) @: `* g4 E: i- }8 ]" Scopy c:test.txt d:test.bak* b1 ]# {- k6 m4 _. w
复制 c:test.txt 文件到 d: ,并重命名为 test.bak4 k1 i) @# f9 n- t
copy con test.txt
$ v5 A7 R7 Z' E6 @' u4 l) } d; X从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件, ~! s) Z* ]& W5 q7 j
con代表屏幕,prn代表打印机,nul代表空设备
6 N, q- J; k# M! z/ Qcopy 1.txt + 2.txt 3.txt
% v* p# ]: v, c0 I, h合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
6 T, b: X/ e# I* U* R' g; l7 |如果不指定 3.txt ,则保存到 1.txt
+ o# h: n4 v8 O! P3 `/ Bcopy test.txt +9 t+ B# R, Q' M! p: B
复制文件到自己,实际上是修改了文件日期
5 I+ N* l8 e/ L# D) H9 R9 }* J ~3 M5 K7 Z8 x r/ Z: i0 n$ w
12 title
. B7 J" M4 X7 U; P6 i, @设置cmd窗口的标题+ y6 z& \8 R4 P3 |1 V9 @
title 新标题 #可以看到cmd窗口的标题栏变了
( G; P& n m. u: |* @" g% E) X0 h0 X! G7 Z7 c% ^$ \" p! G
13 ver. B" ]9 I. e- N2 C/ K, l' X, v
显示系统版本( p8 O8 x1 {* w
0 j0 Q4 U9 d2 B
14 label 和 vol
* D w9 {3 @" I! ?- B设置卷标
0 K* X% t- m7 B# {( I/ r5 Q! hvol #显示卷标5 v. y/ F. a5 w! }2 W4 d. M" N' `! C
label #显示卷标,同时提示输入新卷标/ n; F' E- q, c) _
label c:system #设置C盘的卷标为 system6 Y: M2 g" ^2 M* e3 b- `; H1 E1 c
) U% b- n' Z% y, A" \15 pause
2 l" h5 x' x) F3 y! u0 Z# t暂停命令
" e4 }( f. q# ?- y
D1 c% Y' g* |5 b2 d- h8 u$ Q16 rem 和 ::; s2 r) M7 u% _2 K7 x9 x
注释命令
8 N/ v! U; H: O0 q- H- M2 c注释行不执行操作. _" y7 V. s" x( {5 }1 n4 S" ~0 R! K6 W
# ~& d0 E- k( _6 ?8 A
17 date 和 time0 n) X4 y7 g/ [
日期和时间, L4 t- E! G$ V6 j& g4 ~! |9 t$ S2 @- T0 k
date #显示当前日期,并提示输入新日期,按"回车"略过输入1 s3 D8 j2 D6 t: V2 Q/ `" f) ^
date/t #只显示当前日期,不提示输入新日期
4 B: `0 t4 |$ |+ I1 ^time #显示当前时间,并提示输入新时间,按"回车"略过输入
- n T. N$ c6 B+ Htime/t #只显示当前时间,不提示输入新时间9 Z/ i/ g9 @7 Q) n# M
+ X3 v/ B( w+ L& [3 ?( U+ h
18 goto 和 :
& l: ?; r0 @6 }. u/ K* L/ \6 f跳转命令; R5 E: G* U- t8 ]- E2 o* `
:label #行首为:表示该行是标签行,标签行不执行操作
0 @3 T- e, f2 G( }5 rgoto label #跳转到指定的标签那一行" Z& ?7 k1 u. B. P- y. j
$ k P* o1 I/ ?- `19 find (外部命令)
- o* o" I, @. B1 H; ^/ n查找命令
+ ?+ ~# u' L5 d& \; J3 qfind "abc" c:test.txt
, X) [( F& [+ w6 W% g! }在 c:test.txt 文件里查找含 abc 字符串的行
: S0 W1 z$ X! t2 C6 b+ S如果找不到,将设 errorlevel 返回码为1
) U3 t7 m, V: X% n0 @6 T1 p8 Nfind /i “abc” c:test.txt5 R2 g! M: K! A7 k& c6 u o( X
查找含 abc 的行,忽略大小写
9 h4 o7 J5 r8 b+ @# d8 F4 A" F) U) Gfind /c "abc" c:test.txt" a9 e, |* j! j& d3 j
显示含 abc 的行的行数4 ?# ^, H+ A8 l+ [: X( \1 i `
: {! C; }( F( `. ?' W6 ~* V20 more (外部命令). R8 s( b5 z- F( d' T9 }- W; B
逐屏显示
; S! C. h6 [. S7 amore c:test.txt #逐屏显示 c:test.txt 的文件内容
' m) O0 \9 o% C, q& t. Y- Z$ X3 R- ]% U
21 tree$ p8 J! M( G# L2 T2 o
显示目录结构
% S# u2 V4 J' {* N# }tree d: #显示D盘的文件目录结构
0 c; A# r* s& L" P" E. N
2 N# P9 o4 _5 b% c! l22 &
0 u) n0 F5 W# Z: u/ j顺序执行多条命令,而不管命令是否执行成功3 r I" B. j! m5 n# I6 R0 H$ c
$ u$ C4 j. e& `23 &&- O; ?* y) \4 l" `
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
4 g$ ]+ M; k8 R" r, cfind "ok" c:test.txt && echo 成功: o& h4 u5 c4 M$ X1 l9 \- S
如果找到了"ok"字样,就显示"成功",找不到就不显示
3 u" k0 i4 n# v& W X
2 z, A- T2 d( I Y. J24 ||: [5 P( `8 C, C; ~2 l6 K
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令. Q; M4 I/ ~7 {1 X2 Q1 B
find "ok" c:test.txt || echo 不成功- S; d4 k6 B* A2 _2 w: _% y
如果找不到"ok"字样,就显示"不成功",找到了就不显示
' e1 }) M6 _5 S6 _1 O3 J8 {' N* X3 Z3 D
25 |$ E8 ], O$ X5 F1 {; S& H+ _
管道命令
' ?3 A3 G+ j5 @0 n0 }dir *.* /s/a | find /c ".exe"$ Q: F0 J- B8 F, L$ v9 M
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令2 w3 D# R+ l- v
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数- k h& }* a3 }$ l; M
type c:test.txt|more
- |+ O- v) [1 V1 V这个和 more c:test.txt 的效果是一样的
; I5 w0 e' Z* s- d |- v6 W* p% e& O* `, G
26 > 和 >>
$ P( w4 @/ s4 i' p% r输出重定向命令
+ Z$ m, [; k0 e' W> 清除文件中原有的内容后再写入
: V7 v( n, u" e. r>> 追加内容到文件末尾,而不会清除原有的内容 v% v& l [6 k$ w- C
主要将本来显示在屏幕上的内容输出到指定文件中
, b# [ q- ?5 |) J9 i( {8 X# f D指定文件如果不存在,则自动生成该文件
& Y7 x# [3 l+ N* V4 U1 o6 H1 n. Ktype c:test.txt >prn4 e" V9 k5 E2 F. K ]7 [# `9 T3 ?5 _
屏幕上不显示文件内容,转向输出到打印机) Z* u( W" y; `* q
echo hello world>con9 C" a, P1 E$ ?) ?5 }2 q
在屏幕上显示hello world,实际上所有输出都是默认 >con 的5 @0 A& V, R8 U, \! x* b4 l
copy c:test.txt f: >nul7 c6 Q& V+ Q b, B7 H I/ T
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
; v7 _9 s; b/ m3 ?* j( Q* i2 jcopy c:test.txt f: >nul 2>nul
8 Y; J* B9 x/ _0 R/ Q0 D! b不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
: m$ G9 Y! e9 e, ~/ ?' s, k6 A4 I9 Wecho ^^W ^> ^W>c:test.txt% x8 K; d0 B4 q7 [! A
生成的文件内容为 ^W > W
; J0 E% n1 _3 _2 ~ P- q^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号6 Z) G+ r2 K% L7 p5 A
" T) ^! o$ E! v27 <
& n7 ] X/ [8 k5 ]3 t7 p1 ?从文件中获得输入信息,而不是从屏幕上+ h, M: G2 t* L, A! i S
一般用于 date time label 等需要等待输入的命令
. R* @0 g- R$ I, [1 p@echo off
1 j2 t- U# H T( K1 Wecho 2005-05-01>temp.txt
! h! b# ?! v4 }) ~ b# N, ?date <temp.txt. r' ^+ m3 d- w& [
del temp.txt
3 R9 ^7 Y! u+ Y& o这样就可以不等待输入直接修改当前日期3 ^9 {0 x- L3 V% }! P
4 q& E0 n2 @6 a9 G
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*" `6 o7 U* s- B- u4 m
命令行传递给批处理的参数& [8 a. M/ e3 Z3 E# n6 L
%0 批处理文件本身
Q$ I) @7 g. z$ H( N& v0 L# X%1 第一个参数/ ^: i' k# k& u' i* [& m4 d9 B
%9 第九个参数
6 \# R* V( k: _%* 从第一个参数开始的所有参数: y. |9 J a& }' q5 Q
批参数(%n)的替代已被增强。您可以使用以下语法:
$ d+ d. v- g5 h. F- s. W%~1 - 删除引号(" ), 扩充 %1
9 d; h3 n% q9 o! b, u4 K2 [3 t%~f1 - 将 %1 扩充到一个完全合格的路径名
' F' J5 Q( e4 R) x7 I%~d1 - 仅将 %1 扩充到一个驱动器号
1 [* J2 Y6 e3 d& J+ ^%~p1 - 仅将 %1 扩充到一个路径$ w. D5 @) U+ `4 Y- U- ~: _; p9 P
%~n1 - 仅将 %1 扩充到一个文件名2 @0 S) x: w; Y$ x+ I% @8 N
%~x1 - 仅将 %1 扩充到一个文件扩展名
9 O) B) k8 a* |. A%~s1 - 扩充的路径指含有短名* v" y- _# @3 {8 F
%~a1 - 将 %1 扩充到文件属性
" d( M- }: H, V% \' ~# ^%~t1 - 将 %1 扩充到文件的日期/时间- o. z* S ?' h$ o3 B6 O8 Z2 }+ M
%~z1 - 将 %1 扩充到文件的大小/ K' H1 ? o; C6 Z+ M6 [
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
+ x* D4 \% G" r7 r( {9 c3 A1 i扩充到找到的第一个完全合格的名称。如果环境5 v) b+ Y1 k9 W5 v1 h& S8 m
变量名未被定义,或者没有找到文件,此组合键会
# Q2 F" Q8 O4 V5 Y2 M* V1 Z扩充到空字符串
! [+ }: i9 x) A7 w n. q( h* T- V3 j5 Z可以组合修定符来取得多重结果:
1 U' g W# x9 t, U- t: ~; h%~dp1 - 只将 %1 扩展到驱动器号和路径% g. }( ~# c- X& _
%~nx1 - 只将 %1 扩展到文件名和扩展名
% ?( _$ x: V2 l; ?! D6 Z9 N%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
" u- C: ?/ W( h* R- D: j' d& F并扩展到找到的第一个文件的驱动器号和路径。
8 B3 i2 O% {* S# m5 _8 F$ {%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。4 r4 d6 F% s* n
可以参照 call/? 或 for/? 看出每个参数的含意
) l. H7 D; f3 D3 |- k/ v+ Kecho load "%%1" "%%2">c:test.txt6 u o; j7 _4 c* D
生成的文件内容为 load "%1" "%2"
5 L J# d, B4 D/ F, w+ V& W9 a批处理文件里,用这个格式把命令行参数输出到文件
* X4 U) s6 o3 p+ c, ^7 V, ]
( Z, V) t' d) s( w4 J29 if. `9 p2 b `3 \0 i' m* J- }, C
判断命令: ~! f+ ? U* B. w6 j
if "%1"=="/a" echo 第一个参数是/a- H w3 J9 s( a1 p3 f0 o
if /i "%1" equ "/a" echo 第一个参数是/a
- Z' V; l& U' f% D1 n. @# G5 [) J O/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
) \7 g a4 w9 Eif exist c:test.bat echo 存在c:test.bat文件- G' d' f( x# y7 A* Z
if not exist c:windows (
# {; p4 ~) m0 H* ?0 ~echo 不存在c:windows文件夹
% ` t% f8 r; z)
1 O7 u5 k8 M* Y7 x: C; G+ bif exist c:test.bat (9 o4 o- z% t( C
echo 存在c:test.bat3 j% F" K. Q l4 U- q% Y. h% f
) else (
1 W' t' S" ?# Becho 不存在c:test.bat0 K' r1 V% \+ k0 g9 V4 R
)
4 F9 V4 M7 J& Z1 p, C8 Q' u30 setlocal 和 endlocal
. K) U4 V% |! o4 `设置”命令扩展名”和”延缓环境变量扩充”
- z4 p' b X8 ^# ?9 E! ~SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"5 \; m. r& \ ^( V$ u
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
6 d, `8 e; w. `+ n b5 C6 qSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
1 c1 l G) C3 Z0 OSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
: y4 @! U: t5 M% K3 s2 lENDLOCAL #恢复到使用SETLOCAL语句以前的状态! V: X$ f& R( e `& d
“命令扩展名”默认为启用: F8 ^9 u, ?; v, J$ M5 W5 q* {
“延缓环境变量扩充”默认为停用3 h" c! l( n+ k1 j7 `- I& I
批处理结束系统会自动恢复默认值- O- M/ o q: d( Q1 `; e& G8 s' d: a
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
& s R0 F( Y7 W# F! X: j: d" ^序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
1 y' u9 m) q. C8 C8 p保程序能在其它系统上正确运行
3 U8 u$ w5 R' E8 m0 n; }"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程# u! D3 Q2 D' n& X' i7 Q. i
/ s9 _1 h, _7 o- a8 s/ B2 z! S
31 set( B& O/ W. s. x- {) R% f
设置变量
8 U( f, a+ T* K( b引用变量可在变量名前后加 % ,即 %变量名%
: u( n) H# z5 h& l* |/ Hset #显示目前所有可用的变量,包括系统变量和自定义的变量
) d4 n; F$ L1 X' S' m+ Wecho %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
7 a6 h3 i( s. W2 Aset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1% u3 c+ i- w0 q5 v$ ?
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2# s% G2 b/ U& l
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
4 j! J: t) \/ \2 r/ h: Q- Cecho %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb28 C% W% f W1 t y" n6 A2 N
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2
$ W& A% J1 n- C6 c1 F1 qecho %p:~0,3% #显示前3个字符,即aa1
9 b* Z! z6 L5 F8 Q! @$ f, ^/ Eecho %p:~-2% #显示最后面的2个字符,即b2- G4 L' c1 ~ z$ J5 I, L
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b6 Z* c1 V: \% ~) S4 t
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2- P8 O& d' w& R
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
! d* a/ V$ U* u+ eecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2( G" w6 I% C! S: G3 z$ s
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
( L+ C/ D' O. Y: Nset /a p=39 #设置p为数值型变量,值为394 F6 T2 D8 x, Y$ z" e- x* N
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3 t, Q4 k; h9 q& `7 V
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
4 I$ V8 l7 Y6 v; Yset /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?) c9 Y3 z; \/ @' P$ f
set p= #取消p变量0 T% c" r* V; l) T& d- v
set /p p=请输入1 t3 ~3 @2 M8 H8 b
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p, i" b9 Z7 I6 y$ L
注意这条可以用来取代 choice 命令
6 N; K% ~+ Z3 _/ g; w9 X注意变量在 if 和 for 的复合语句里是一次性全部替换的,如- }8 K; r4 @# W$ { [& ^
@echo off8 j d# y3 G7 ^/ r1 }9 K4 r6 f
set p=aaa6 o* T9 d: p% Z/ u& @
if %p%==aaa (( D" m3 `8 B3 b2 n
echo %p%
7 x+ \: \6 U% u* _0 ]4 Y% rset p=bbb
c3 B0 A1 H; K) Recho %p%
8 u1 y+ @: I) I. S)+ D [4 }, M& I' s q/ U! w
结果将显示
. a! Z( T- I+ w3 g; j( caaa5 p' X( c. `4 x# m
aaa* d- q1 i+ Y, n) l& G+ K
因为在读取 if 语句时已经将所有 %p% 替换为aaa- o9 A: A6 k7 N& a% V$ s* D% r$ ^
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"; m' N; p+ `5 k1 L
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!( F, c+ ~2 w5 e' ?9 K) A8 @
@echo off
& d- q, {' W6 w6 Q! WSETLOCAL ENABLEDELAYEDEXPANSION9 o' ]3 z, l) P& _
set p=aaa
2 ?6 p; F7 }% |if %p%==aaa (' e6 {. X% P- T$ o4 a& p6 n. }
echo %p%% _" ?0 [) n( m6 T& ~8 C
set p=bbb5 ?! V$ `- W. B1 W3 U
echo !p!
: X: h4 ~; ^0 w. e: u0 x)
4 ?* n1 Z# X+ I) w: t7 x( bENDLOCAL' i h5 `$ ^0 S5 Q, P$ e
结果将显示
U' X# Y2 u" g* zaaa
- i- g" n1 ~. a2 v' lbbb
0 l: E8 u0 ~7 r还有几个动态变量,运行 set 看不到
5 e( v* Z# C! W _. W: c%CD% #代表当前目录的字符串1 ]# k" ]7 W8 U: h0 r
%DATE% #当前日期
$ V( S; k/ ~) L3 u+ b) i%TIME% #当前时间
0 Z5 v( ~ d' o. r7 m- K%RANDOM% #随机整数,介于0~32767
/ U# r' Z2 x8 L9 N# ]%ERRORLEVEL% #当前 ERRORLEVEL 值! k1 w. R# n5 f3 G0 W' G, P
%CMDEXTVERSION% #当前命令处理器扩展名版本号; W6 e# t4 n0 C- t
%CMDCMDLINE% #调用命令处理器的原始命令行
( X' B6 M8 ^; {* W, h可以用echo命令查看每个变量值,如 echo %time%
9 x8 \! }, H3 e注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到( i. R9 ~9 p& X6 U0 }
* C7 v7 F) Q: z+ i0 p
32 start6 ?9 M0 L/ a& C+ {, e
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令: i2 Y# k9 ~5 y' A1 O
, _2 [: N4 S" U; W6 b9 \
33 call
; s3 [9 u# A7 i3 t7 v5 K3 I( `$ L+ ~4 x批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
% X2 o2 x+ @% ^, N有时有的应用程序用start调用出错的,也可以call调用, Z j [* Q5 d4 _
5 s6 U! ~; t8 J: s& E6 O34 choice (外部命令)5 \% ^* l5 ?9 S" w H
选择命令
6 i4 b( G7 C9 y1 K让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
, T2 p9 x# b7 v3 y1 t; lwin98里是choice.com2 e8 z1 L S2 ]6 Q0 z
win2000pro里没有,可以从win98里拷过来- a8 p2 T0 p- z. S* }% W
win2003里是choice.exe8 T) s& C3 W5 H$ N7 @5 P
choice /N /C y /T 5 /D y>nul
4 r, ~( z/ d* }延时5秒
' |( [- A3 j" C+ s9 i& F+ ^& e; M$ A- ^2 h. n; j
35 assoc 和 ftype u: l( w% q5 H" g8 O: D
文件关联3 r) d. a! ?6 F$ U4 o2 P) z; j
assoc 设置'文件扩展名'关联,关联到'文件类型'
$ |8 x9 h: H$ s7 _ftype 设置'文件类型'关联,关联到'执行程序和参数'- l! }8 P) X! ^9 K, ~" m5 B
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开5 ]) d$ I! ]1 D. L1 E
而是先判断.txt属于 txtfile '文件类型'
% D) I0 q4 X2 C& @5 r, y; ^9 W再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
2 r2 l* S! \1 M/ J可以在"文件夹选项"→"文件类型"里修改这2种关联
+ ?. L P3 y5 v" X3 j1 f1 f4 v0 Eassoc #显示所有'文件扩展名'关联4 |' Q7 C* P) }* {5 e! R/ Q
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
# b6 y6 e- w1 ^2 w0 Q- M8 Cassoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
, b0 \# j) [1 p3 l" passoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
1 W: [, `! B* S) {ftype #显示所有'文件类型'关联+ `6 t% ?3 t5 w- ^6 b
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
. V" z: g; y' a1 k5 iassoc .txt=Word.Document.8 d# C1 _ [2 G1 J' F
设置.txt为word类型的文档,可以看到.txt文件的图标都变了8 M* V, `. h6 Q( ]& ~6 f% ^! s
assoc .txt=txtfile4 ^& T" J& p7 Z# z' a
恢复.txt的正确关联% U! M! c, c5 v7 `. O3 G& ?4 b
ftype exefile="%1" %*2 }5 v/ G- Q" F) d0 b* ?2 j* z
恢复 exefile 的正确关联
Y1 G0 K* U- A- k+ s" o' m- y" A如果该关联已经被破坏,可以运行 command.com ,再输入这条命令: N; F$ F k' r9 V% \* L
% f$ Q U( \2 }- ]
36 pushd 和 popd
# V% F7 S7 |) `2 c切换当前目录
0 n: Z" b2 o( X2 e* q/ A0 X/ B@echo off3 Q+ d3 v+ j8 X6 S
c: & cd & md mp3 #在 C: 建立 mp3 文件夹
9 d( C& i/ d+ Q4 y$ ]# B# Kmd d:mp4 #在 D: 建立 mp4 文件夹
# h2 i4 }- Y! p C1 Bcd /d d:mp4 #更改当前目录为 d:mp45 G) a( d7 \* T7 z+ ?
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3/ d) k; [/ v( ^4 K7 z9 h
popd #恢复当前目录为刚才保存的 d:mp4; R6 `) n) k' z
5 }2 P8 X: [0 X# ~, P( y) s37 for+ d O% X6 e( p7 u
循环命令
+ Y" ]; q6 ~: `7 P9 y7 @5 O这个比较复杂,请对照 for/? 来看
* U& w- v2 z ~8 v4 B# [/ A; _for %%i in (c: d: e: f do echo %%i
M+ ^; r/ g. t5 b依次调用小括号里的每个字符串,执行 do 后面的命令 R2 G1 z! B6 O, N9 r' z2 L
注意%%i,在批处理中 for 语句调用参数用2个%5 E1 U9 T9 a: B* a+ m
默认的字符串分隔符是"空格键","Tab键","回车键"
+ y' d* d6 v% ~for %%i in (*.txt) do find "abc" %%i; T* q% z& | c6 P) A
对当前目录里所有的txt文件执行 find 命令1 [7 W! ~4 D. d. \5 u7 r6 X4 N
for /r . %%i in (*.txt) do find "abc" %%i, a, e, }" Z5 G
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行# J2 X9 o2 e* B. j7 a* B
for /r . %%i in (.) do echo %%~pni
. g3 K3 d1 W: u# Z1 V显示当前目录名和所有子目录名,包括路径,不包括盘符, q1 L7 D! l* Q
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt. _* y& D) ^$ W' f
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
" h6 q7 T w4 Pfor /l %%i in (2,1,8) do echo %%i
2 e: `- y; X( N) t生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
9 E& z5 z% F. b/ B& ~, yfor /f %%i in ('set') do echo %%i
* Q* D$ P, A# u+ c对 set 命令的输出结果循环调用,每行一个* `) @3 Y0 b/ ?4 {& K/ z
for /f "eol=P" %%i in ('set') do echo %%i5 L8 u" C; X% k$ t+ G
取 set 命令的输出结果,忽略以 P 开头的那几行" T2 _8 o; Y+ S$ M2 C" G, b
for /f %%i in (d:mp3.txt) do echo %%i$ l, q9 m3 M: v& r: P& \, k
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称 }2 }" L# w) ~4 W8 Q# n( H. T7 r
for /f "delims=" %%i in (d:mp3.txt) do echo %%i8 R1 i9 m7 L! [/ N" I6 D
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
0 V+ Y" U- P+ Z! }, \( P3 Ifor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
- i3 u. S& P+ a* i6 i6 [4 ?5 u对 dir 命令的结果,跳过前面5行,余下的每行取第4列! N8 j" X8 o% ^$ s
每列之间的分隔符为默认的"空格"
" B. i! f/ z2 R& e可以注意到 dir 命令输出的前5行是没有文件名的( c1 w5 \: i+ N5 f4 G$ t1 z
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (& Y3 _( U% e2 j) f0 n$ v( j$ y# ?
echo %%a2 N: e) b0 ~+ V
echo %%b
7 b7 x- ], ^/ o; P) Y7 cecho %%c
7 n# S2 A" q K i& r+ a)
% o6 X' j) w; @! g对 date /t 的输出结果,每行取1、2、3列
( F) D0 o1 p( r. Z第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列7 \7 l7 K1 c1 Z1 [! M' r
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"1 p4 [; A2 `1 A+ k7 J3 m+ P
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的9 D* d9 y- ^' A4 Y3 p$ r! y# P$ [
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b B$ E1 m: ` E, i
取第2列给 %%a ,其后的列都给 %%b6 L" h) d$ f& ^2 @: s, X+ q: u
& {9 z/ W7 f+ S( C38 subst (外部命令)
$ j9 w! B+ l; M0 e U映射磁盘。% N# _- s& d5 W! }) i* y
subst z: serverd #这样输入z:就可以访问serverd了
3 o7 F" H6 R; Z4 w; Wsubst z: /d #取消该映射$ a0 D4 k8 b3 l; N. ~& V* H9 d
subst #显示目前所有的映时
& `' J4 s$ ` w9 ]+ h! L6 }
6 ~" D5 Z7 |! ^39 xcopy (外部命令)
1 G0 b) f4 K1 k; }0 H7 ^: `9 R文件拷贝0 S, O" L' V! [) L ? v& X
xcopy d:mp3 e:mp3 /s/e/i/y8 l+ J, q: I9 u8 h
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
" b- @; @! }2 r1 A3 D加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问/ {. f/ {* w+ {1 A7 Y' Y: d' y
- I" w5 z' _+ Y! I4 I2 l% }1 S" Y
常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退* e k8 T$ E. N- d* H/ v
- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:3 s8 L+ ] m, W% a0 ?* e
^$ i9 o: U5 k; t* @
@echo off
8 Z! t$ j# ]9 q4 L& J7 P0 C. Fset p=aaa8 l G) ~1 F" E( K: B
if %p%==aaa (
/ l0 k6 U( X8 ~0 R, Mecho %p%
: h$ Q7 b% f$ |0 W9 L1 G9 X3 b- tset p=bbb
# Q" I4 r- c/ fecho %p%
' n% O) ~$ U. B0 } Q1 G)
( N; s! ~( A) @% W5 e6 |7 z* qpause
4 j3 Q! W( ^& K- d( d2 X* {) D8 ^% g |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|