|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!
# `, Y }0 ~1 P' |' m 前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效' M3 N1 M6 @$ l) b# O
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
; z. B! F3 n! i' N名为bat 目前比较常见 的批处理包含两类:
$ n* T& _( g' A& ~- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
) y6 k' G- a7 W/ X4 e% G/ p- e
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
" S( l8 |+ S5 H) U命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
9 o% Z. \9 U3 N& l4 v' _ 怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
# U* C# ]' ^ ` `2 [ 批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set
" S' d- J- [# I7 |. O( L a9 h( a8 V 批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||4 V6 G, i* O: G# ~( c+ G
常用DOS命令- 文件夹管理:0 M: p. n- g/ d; m# C
- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。
) `. ~# e+ K3 B9 p }
- 文件管理:
+ O- d$ i* N/ ]' J- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同
1 Q$ h; ?; K1 e) u7 X
- 网络命令:( B6 L, z# Y& u* u, C) V
- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表9 O- Y! D, r! C* Z( X
- 系统管理:
" h+ i% z# V! z* J- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置, }+ J! e, R) m" h: o8 o6 ~4 i+ q. Q/ i
1 c" g9 y( `' c" p
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /? # H0 T5 p) q- }8 f. J' W: P
1 a3 a! N# a0 g6 @0 v4 E9 q
Windows Batch 常用命令4 ~* m* D0 J1 f% i1 W
1 echo 和 @# O; A; s$ U# ]) P) y) ~1 U' o
回显命令
% K: R8 B3 P G ^# D% ]' ]@ #关闭单行回显; {( @2 j" }( j, w; ?# L8 D" l6 ]
echo off #从下一行开始关闭回显6 j* }0 w; F2 E; |$ [2 }
@echo off #从本行开始关闭回显。一般批处理第一行都是这个$ F9 f/ V; |0 O, b1 H9 s6 ?- }
echo on #从下一行开始打开回显
$ j8 M- r$ ?4 j; fecho #显示当前是 echo off 状态还是 echo on 状态! J t7 M& I5 c* ^" F. k O
echo. #输出一个”回车换行”,空白行
3 R9 K1 s+ |9 k$ M2 Q9 ~( F' E#(同echo, echo; echo+ echo[ echo] echo/ echo)
1 i4 L% i5 I- o9 h* R2 z) p
/ r3 G# {. b, k. j2 errorlevel
3 C6 R' W; E4 e+ C* Y3 {echo %errorlevel%
) `: @" { ?' R- [/ c: N每个命令运行结束,可以用这个命令行格式查看返回码$ @3 d, Y& h2 V5 v0 B/ Z. y* _ ?
默认值为0,一般命令执行出错会设 errorlevel 为1
+ N" c) @) D% q2 J' F" X
: t: z8 u$ a' z3 dir2 I8 P3 \0 A6 P4 ]9 D8 J
显示文件夹内容
2 K% V5 N4 n1 f8 g P; ?dir #显示当前目录中的文件和子目录
1 G9 k; S8 Z1 c O; t" I# Rdir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
+ r3 k1 n# j- M, o, }/ m+ cdir c: /a:d #显示 C 盘当前目录中的目录
8 y% g& c. V) V9 X' f, E- ddir c: /a:-d #显示 C 盘根目录中的文件" P0 p+ ~8 K; h9 h
dir c: /b/p #/b只显示文件名,/p分页显示
0 a1 U: g2 a. M' q, h1 Hdir *.exe /s #显示当前目录和子目录里所有的.exe文件; x8 [# |$ x8 Z: c+ N+ r
0 Y( f2 b1 F! ]/ {. u
4 cd
6 \0 e+ J4 t5 X切换目录, d! G& B5 }! q& S7 o0 I% t" j
cd #进入根目录2 D8 [0 g2 F e& {
cd #显示当前目录" W" U0 H1 ?" s
cd /d d:sdk #可以同时更改盘符和目录! C! f7 m8 Z& F3 s% P
) y* c4 c2 W2 m( V5 md
8 e+ F$ K5 F6 y6 P( Q0 _0 L创建目录( p2 U( d1 F, A9 O! W3 j. L/ q
md d:abc #如果 d:a 不存在,将会自动创建中级目录
/ `4 |% A2 e# P. O#如果命令扩展名被停用,则需要键入 mkdir abc
$ y6 f& f1 t% {- [/ n) w/ K7 O4 W ?4 W3 H( N4 d
6 rd
! `2 q' j* T$ ?5 A1 i删除目录
- r2 d9 F8 r; z+ O1 z0 x; F% grd abc #删除当前目录里的 abc 子目录,要求为空目录6 ]# |' _& g7 ? Q' f/ v" V* S. P
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式% N8 W/ v0 |5 ]
# E% y$ L9 G v* k+ i* d7 t
7 del
5 ]7 C9 s; o# X& |# p: T" Q b6 Z删除文件
9 z. I$ E3 y# pdel d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
" ]' q, c) J! o1 w+ k- udel /q/a/f d:temp*.*
1 o+ j0 z; b8 h4 Q* W4 y D删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录; M% U) d8 u' u( ]! O5 h+ K
del /q/a/f/s d:temp*.** e/ i1 C6 p) J4 r% e) a; H2 V
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
( |& ~* a3 e! i5 |* I( h. r6 Q- ?* C
8 ren
4 @6 t1 @8 G, P4 s6 g/ `) Y. J重命名命令
; z8 l# Z: u) Y4 I P) I7 Pren d:temp tmp #支持对文件夹的重命名
5 i$ C2 |8 b" }' g. R. s
6 H6 N/ @ g6 V& U0 W9 cls" w( i1 Y+ ^0 u
清屏/ B) I8 i) m( v5 w: k
10 type
& N7 Q' U9 w( V) @0 X; K6 x显示文件内容
/ b* @0 w0 x6 l. z3 e# o. A; ttype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
3 j6 W7 b* N( w+ a9 x8 Ytype *.txt #显示当前目录里所有.txt文件的内容% t9 [) b s2 N1 @* e2 R
% @' c7 K9 ?: N7 O3 p0 `
11 copy
2 W# A' b) T) O/ D" |拷贝文件
8 ]! ]7 Q; D- u1 V$ I) wcopy c:test.txt d:test.bak
2 l) B3 R$ N5 _; e- W. y复制 c:test.txt 文件到 d: ,并重命名为 test.bak8 O9 ~' s5 o2 `- W
copy con test.txt
% `/ t% C% Y4 J* k) v* ^从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
/ j) N7 j7 K H6 P$ Vcon代表屏幕,prn代表打印机,nul代表空设备
5 o* T& ?% \! f/ {) P# fcopy 1.txt + 2.txt 3.txt
/ f& G& d0 S, T! _合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件4 T3 ~1 A1 m9 H% ?! r
如果不指定 3.txt ,则保存到 1.txt/ Y; B$ \, s6 |* c% ~, x
copy test.txt +
& X9 p$ i& G) W复制文件到自己,实际上是修改了文件日期
- R, N& Q, t! k
$ j$ ?) A) Y/ I9 X% C12 title
% y: }& Q2 |& z7 n5 v# D1 F设置cmd窗口的标题# I* N# S; X7 ~. R8 g
title 新标题 #可以看到cmd窗口的标题栏变了
! ?7 c1 @$ Y# n5 A' }- s
! [1 r! b+ K/ @) t. A; H13 ver$ q0 B4 C0 J0 z% ~
显示系统版本+ t B+ l; R/ h
( J, L7 O) s+ J+ `7 r, p
14 label 和 vol
9 T, i% _* _0 n3 q设置卷标
8 c0 o: B; b" V) }5 evol #显示卷标& u( s1 d5 ^* `7 V, B3 w6 X, ]
label #显示卷标,同时提示输入新卷标
; h5 f; Z ?$ K4 N& y* b$ Ilabel c:system #设置C盘的卷标为 system- C" N/ o0 R: j
9 J2 F0 P4 H' m
15 pause
2 n! G" O5 C% I e+ z暂停命令
" _! y* P. A; R- W" m3 \+ ?: l
16 rem 和 ::
6 y: v4 B' ]. o' k' \注释命令
# Z. p9 D! k6 h: `2 w+ G/ w. v8 p- t注释行不执行操作; s9 ]/ l: G& O" [5 }
V2 i2 Y: M) i, |. D6 p9 Q
17 date 和 time
) T; A- ^# C; \6 h. x+ r7 h1 F) V; l日期和时间5 I' T, \4 {3 W2 ^4 `) L
date #显示当前日期,并提示输入新日期,按"回车"略过输入. F3 c0 J3 d; L( x
date/t #只显示当前日期,不提示输入新日期% S- ?9 m/ f1 ^+ }5 D. l
time #显示当前时间,并提示输入新时间,按"回车"略过输入7 p9 b& N5 w" A( W, x
time/t #只显示当前时间,不提示输入新时间* J5 l0 p4 w4 y G0 J5 a5 Y. L
0 A2 [! B+ }( S' w18 goto 和 :3 X) |5 @, e8 E7 l. O4 i' h/ c
跳转命令
$ w1 `. {+ v! z) |9 B:label #行首为:表示该行是标签行,标签行不执行操作7 M) o. }% Z* B" o
goto label #跳转到指定的标签那一行
/ u4 ^8 M" ]2 t2 z% R0 a% Z1 G4 i# Q+ V+ n" K7 S, p4 W( T5 J
19 find (外部命令)5 R. g. _) F4 j+ m2 u2 c5 v% M* G
查找命令6 z3 _; [3 H/ i- h4 u, E
find "abc" c:test.txt
& E' X9 \% I: U0 _) \% ^在 c:test.txt 文件里查找含 abc 字符串的行! D( N* V( J' f& B6 r4 U. R
如果找不到,将设 errorlevel 返回码为1* z) J8 Q2 I) h' {# Y2 L( v. u
find /i “abc” c:test.txt
4 T( P. A( N% J X; p查找含 abc 的行,忽略大小写, E/ r% ?5 Z2 |9 p8 O) J
find /c "abc" c:test.txt6 F$ ~! M- C8 W6 l/ U
显示含 abc 的行的行数
/ K5 y1 |; }- \0 e: m2 m, z: F: `. W4 V0 V5 }) ]7 l
20 more (外部命令)
# r/ T4 c. Q2 o1 v. K, j+ M5 T8 `$ b逐屏显示
5 `" x+ P$ J! ^* lmore c:test.txt #逐屏显示 c:test.txt 的文件内容
& J: Y/ ^' N! `
6 t( G9 g5 _; B8 ? ~21 tree* X. i- ]+ ?5 y0 A) U! i; m
显示目录结构
- \8 d7 w+ P! a8 D7 T' [tree d: #显示D盘的文件目录结构
- w7 {5 q# B& y" r2 F7 \5 O; t+ [, J5 U
22 &
" d1 u: R6 x0 \5 z顺序执行多条命令,而不管命令是否执行成功
. b( S/ z6 Y4 l" r9 G Z
; N h" F9 G: \# S5 P1 z23 &&
, N* j# o+ L9 ~. ~% [. b5 y1 `顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令6 Y2 }! b* F* n/ l
find "ok" c:test.txt && echo 成功
8 x5 s3 v3 U( f如果找到了"ok"字样,就显示"成功",找不到就不显示
' r8 Q- l$ M4 z1 [6 i
: s0 e0 D' J& [# _% g24 ||
. {* K2 m* z. i顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令# \, ]0 w6 l& k' z9 x7 M% N$ \! B1 Z
find "ok" c:test.txt || echo 不成功
( L3 d" [ J1 g# |如果找不到"ok"字样,就显示"不成功",找到了就不显示7 ]' P( T( j$ V0 Y6 O& z+ e
+ q% N4 e& e3 {. M- J8 I% ^' M* X! B
25 |
. A7 E" l" V1 {: a5 N3 I管道命令/ X1 I& \6 m: x4 F k6 v- T
dir *.* /s/a | find /c ".exe"% j( t0 y( \6 X7 N, h" h2 {& M# t3 U* q
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
: h6 r3 X& z9 B. D. t$ j7 e该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数- w; F. N2 B+ {% D4 r6 I+ {5 z
type c:test.txt|more
$ m2 j1 O o+ ?+ g8 [7 y; h, \# R这个和 more c:test.txt 的效果是一样的! a9 v6 [6 B/ c/ \
+ G# {+ z$ V3 b8 I- p1 \, K26 > 和 >>
) b- E$ q! ^7 O: u- c5 N0 }输出重定向命令
5 M. M/ Q: f: X# ]: C0 n' z1 m> 清除文件中原有的内容后再写入
8 V, D0 _6 D7 y: g>> 追加内容到文件末尾,而不会清除原有的内容) |$ v5 c! h6 H4 D: k, ]
主要将本来显示在屏幕上的内容输出到指定文件中
3 L( f. q6 r ~' L$ \0 P指定文件如果不存在,则自动生成该文件
- ]/ x, ~! u# c( M. ?type c:test.txt >prn7 E5 f. M* ]+ G5 U
屏幕上不显示文件内容,转向输出到打印机6 _2 u* i0 O! ?$ z6 i
echo hello world>con
$ K3 I; l# @, {$ B在屏幕上显示hello world,实际上所有输出都是默认 >con 的
$ ^; n6 i# k$ P, hcopy c:test.txt f: >nul
8 ~, q1 Q/ ` F1 n9 u* X拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
6 e0 v+ F3 U! C7 f% T, }3 {% f* ~copy c:test.txt f: >nul 2>nul# X' ^9 w: C+ k6 h+ J' o0 J% P
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
5 g6 z' V: ]: y3 [, O7 J! |% i9 kecho ^^W ^> ^W>c:test.txt
2 R$ x! ~6 O$ k- c, R生成的文件内容为 ^W > W
2 o9 t% s6 h: J! }' x8 x^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号+ `0 n" ?6 l* c. }9 n9 @$ k8 ^% C
" j' y' T- X$ E" ]0 ^! r27 <
& z" X2 X' b; _8 |, P. K从文件中获得输入信息,而不是从屏幕上
% |. y" Q! ^, G/ J" a一般用于 date time label 等需要等待输入的命令/ Y, `) k, F; F# Y+ s0 E1 e2 F
@echo off
) v% ]& \) { B+ a( ^echo 2005-05-01>temp.txt4 J+ y/ {( Z7 b0 |, e& @) |
date <temp.txt
& V& O& j* W- qdel temp.txt% n( z- V0 X6 K% X4 |# l! n9 P5 }0 C
这样就可以不等待输入直接修改当前日期
& w f9 Q; U5 b, k$ A$ D0 r2 k2 E' b( U7 H7 w
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
) ]' w) w! x% e' b& K. N命令行传递给批处理的参数
! ?! q& T. ^: `4 G; }6 u1 i%0 批处理文件本身* u9 w B& r7 _! x: ?
%1 第一个参数5 N3 Y6 a8 N: @# k: g5 {, @
%9 第九个参数7 E3 G! D7 P0 C. C, w+ E
%* 从第一个参数开始的所有参数
1 s7 ^7 P# Z( q* S批参数(%n)的替代已被增强。您可以使用以下语法:
3 L' L3 F: X* ^: I! |%~1 - 删除引号(" ), 扩充 %1
' A0 Y) L r$ ^* `3 Z%~f1 - 将 %1 扩充到一个完全合格的路径名
q4 B, H4 g. |0 p%~d1 - 仅将 %1 扩充到一个驱动器号, ]/ c& W; j! k
%~p1 - 仅将 %1 扩充到一个路径
Y- U) \5 [& }0 M%~n1 - 仅将 %1 扩充到一个文件名# f1 u* l3 b/ H' \; q
%~x1 - 仅将 %1 扩充到一个文件扩展名
; ~: b6 S+ L4 F& u( n. C%~s1 - 扩充的路径指含有短名
& c7 D* z/ ~1 D: d7 L/ L- a%~a1 - 将 %1 扩充到文件属性
/ `1 R. C+ e+ p8 l%~t1 - 将 %1 扩充到文件的日期/时间3 a4 X6 x! P. R# V2 j
%~z1 - 将 %1 扩充到文件的大小
9 R1 V" y- z1 N( c3 A0 b%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
9 V0 a" L" }- ?, ^8 C \$ y扩充到找到的第一个完全合格的名称。如果环境# ^5 M! g v; E3 U
变量名未被定义,或者没有找到文件,此组合键会
3 [; M8 I, m- Z2 l扩充到空字符串
& {3 v3 V0 l5 r4 j: \2 R' w可以组合修定符来取得多重结果:9 N' d5 P, h( m9 w/ z
%~dp1 - 只将 %1 扩展到驱动器号和路径
. c1 t: M* H4 i1 Q$ n" B) o# {%~nx1 - 只将 %1 扩展到文件名和扩展名
8 | A) Y" q" \2 w5 p+ B6 E7 M%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,5 A% M- D1 W' N% V
并扩展到找到的第一个文件的驱动器号和路径。4 ]! c7 s& g- K- c, P8 o+ V' w/ R
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。% E4 g0 t% B b0 O% X, K- |
可以参照 call/? 或 for/? 看出每个参数的含意
0 @& V5 {; `3 `% s/ z4 Iecho load "%%1" "%%2">c:test.txt9 X6 h' G$ f4 {
生成的文件内容为 load "%1" "%2"* `# A% l, P' Z! ?' w x8 r! e
批处理文件里,用这个格式把命令行参数输出到文件
# C P5 A6 F" n& V% @, o2 t' |3 S. q Z( ^6 N" D8 I b
29 if* z; y) `: |6 t* b- |( |. K h
判断命令, d# J, n2 x' j2 k! Y
if "%1"=="/a" echo 第一个参数是/a: G, H$ Y$ E2 h2 |
if /i "%1" equ "/a" echo 第一个参数是/a
+ n$ y8 ^; B+ O# B/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?& Z, Q: O; I) ?' _9 ^
if exist c:test.bat echo 存在c:test.bat文件# p$ D0 C2 x+ K1 G$ H+ B' [. q: p' N& p
if not exist c:windows (9 P {3 X- @# Y' D! w
echo 不存在c:windows文件夹7 }5 a3 J7 A/ g) M: c9 h
)1 P& g/ c# _+ V' Q2 q
if exist c:test.bat (
0 `% S1 P( K _: O) \: Xecho 存在c:test.bat% g. N' e' v: h2 r; A7 `/ e
) else (" r: c' k$ W7 ?: I) ]* {
echo 不存在c:test.bat% M0 I; d" d0 m
)
; l- u6 `7 |; H) A30 setlocal 和 endlocal2 L7 A, J* q( q/ ] X. Z5 C
设置”命令扩展名”和”延缓环境变量扩充”
6 g4 j4 P2 n2 ^% E+ hSETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"2 a3 o, a8 |. m# M; c5 ~3 e
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
( [7 f: { ~1 y6 l- z" Y* CSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
# P* Z5 }+ I, j2 x ?SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
$ Q5 J; D9 P* M4 F- MENDLOCAL #恢复到使用SETLOCAL语句以前的状态
. f/ A7 Q4 J5 _: q9 f$ V- e“命令扩展名”默认为启用 ~% w% Y6 U6 N7 o, I) G3 X9 o
“延缓环境变量扩充”默认为停用
) K0 {5 \( z+ W* F; _+ m0 j. _% q( s: Q批处理结束系统会自动恢复默认值: @" G! \, D/ F; ^. u: j) D+ b
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
; \& Y+ y( ]5 o! g6 h序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确& A4 d. {! [6 m# _$ f5 b
保程序能在其它系统上正确运行
: z: q$ w2 P, P- f- P r2 Y4 ?"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
$ h C" p0 N$ _( w* I H. F1 \* r0 S# J4 d6 W; c
31 set
+ n$ d$ p' Z. I/ W$ K3 U设置变量" x# ^, I+ K4 |0 E, @6 H2 A& j3 z
引用变量可在变量名前后加 % ,即 %变量名%( o, \" j3 M5 k! r( s8 a* \2 ^% ^
set #显示目前所有可用的变量,包括系统变量和自定义的变量2 f% [# E8 i# Y* n2 ?% A( A
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
$ H0 O$ j d7 h* h3 I2 q8 sset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1& ~' W) ^. A E; n* \
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb23 b1 c6 H* b/ R+ V/ ?0 X0 X* _
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2% }% _1 l4 O8 o) z2 q& t, Y
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2& I$ P4 w3 k! ~: [4 {/ E
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa21 p2 M7 z+ o/ o( _" F3 }
echo %p:~0,3% #显示前3个字符,即aa1 @+ T- X7 I/ b" ~3 t3 M# y7 g
echo %p:~-2% #显示最后面的2个字符,即b2/ S1 E& O- }: S! ]) _7 _* t
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b$ x; g* V. X m4 x) m H+ _
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2+ s# d I3 N7 I1 z8 B g
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2* q6 q2 K5 V' r. J3 d, P( e
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb22 a2 b& }1 V. U. b& p# J
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2) j6 `4 J- j/ k
set /a p=39 #设置p为数值型变量,值为394 t4 P* w$ {% e8 m
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3$ g8 x5 I7 f0 ?$ ?2 b
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用* c9 Q9 i6 p$ M( c0 [& J' ]/ m
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
. A0 q4 F' [) d' x7 eset p= #取消p变量! z' [: V- v: b2 r
set /p p=请输入0 O; U/ |$ f$ h6 ^( `; A
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p% |+ Y! Q0 d/ Q
注意这条可以用来取代 choice 命令3 T, i& v7 U* {8 L+ s, ~4 t; c+ W
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如 `$ P) G/ Y' E: x7 B2 C4 I- O2 J; Z
@echo off7 ], D3 P$ L4 e9 g0 g- U2 h2 Z! P5 r
set p=aaa3 j- _9 V! @9 N& q: T
if %p%==aaa (, ?8 r8 j! l2 b# K x! ~ z
echo %p%
( b1 {9 U& }* E z9 K3 Q% hset p=bbb6 ^9 d Q- j' D2 F* R) C+ h- Q. O j
echo %p%" w( e/ `9 ?! Z D: K/ O3 k
)) L- S& z: x2 C& r7 ?
结果将显示3 r+ Y" h& m1 A6 t6 e
aaa5 k$ k- ]3 R* @; Z0 c7 j" X0 X* w
aaa6 u2 h4 Z& A$ }7 X2 ^0 y
因为在读取 if 语句时已经将所有 %p% 替换为aaa: S7 q3 I. K: b! D% K( j1 h/ g O
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"8 E+ I* {$ D+ E. g' I
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!- d4 W1 k& ~: v
@echo off3 T& Z' h( p+ @6 g
SETLOCAL ENABLEDELAYEDEXPANSION5 N, U0 b# q: i1 T
set p=aaa
! g! f G, N: cif %p%==aaa (
3 Y" x# Q7 R+ I7 |' hecho %p%0 F2 L8 a& c% A+ p6 P. E' F
set p=bbb9 |9 T( Y; Y; Q
echo !p!
& S& k, {; }* d& z, H5 W)& Z; h, K5 B+ S. Z
ENDLOCAL
- @3 Z. ^4 h0 c9 N. L/ o* z, P结果将显示
# w; ~, n/ Q# x+ B+ j* [aaa; z l% i3 Z ^5 D* M. Y
bbb
/ |6 Q+ c# s/ l/ X# S6 H; |还有几个动态变量,运行 set 看不到$ X# H9 |" D7 o! z6 X5 n
%CD% #代表当前目录的字符串
9 P$ f) o! E, {/ q- q%DATE% #当前日期" p: H( G3 n, L3 J% M; l2 }# w
%TIME% #当前时间
! T8 S r0 X; Y4 O- Q9 p3 ]) M%RANDOM% #随机整数,介于0~327674 M4 \# A. T) i+ l9 B
%ERRORLEVEL% #当前 ERRORLEVEL 值
' ]6 \" |# V/ `/ J8 A) l$ |%CMDEXTVERSION% #当前命令处理器扩展名版本号
* i; ?) x& N- \7 t%CMDCMDLINE% #调用命令处理器的原始命令行
2 V# u& m* u/ z' E, Y# A c可以用echo命令查看每个变量值,如 echo %time%7 B+ m& |1 s) U8 S- g4 `- b
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到% ?# h4 H4 Z; n, W; M
" A2 V& ~* w- @& V32 start f+ l5 E+ F- s3 \. S
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
6 C/ X% _0 E: {5 F( N% e, r% F9 E& |- \! U1 F6 }3 {* ?7 S
33 call; t+ u1 l$ L8 b3 q' ]
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行4 I8 Z$ H! j+ c: z* R0 I
有时有的应用程序用start调用出错的,也可以call调用7 L# k7 F& F. F' |
3 ]* X' @6 r0 g! H: x
34 choice (外部命令)
. i/ O6 A* N, ^: i* d, P0 y# n选择命令( }/ `+ M) ]9 e% `& b! p( s; x
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
0 N$ T* S+ O3 P( Wwin98里是choice.com1 a/ B/ |3 ~, G; F. p- s( H
win2000pro里没有,可以从win98里拷过来
4 k0 |0 H9 }- u1 @/ Fwin2003里是choice.exe7 j3 l. Y! N5 }8 w* K4 j$ [* k
choice /N /C y /T 5 /D y>nul
; l7 e' P/ V+ X* W& S延时5秒4 c& Z" U& {* y
. y1 x4 ^) e- @, }% W8 ^1 Y# x1 |
35 assoc 和 ftype. P$ v; \( J; B( n2 a; p- D# m
文件关联
2 Z4 f$ ^. T* `: z: k* N. Wassoc 设置'文件扩展名'关联,关联到'文件类型'- n3 K% o! g, }1 a
ftype 设置'文件类型'关联,关联到'执行程序和参数'
6 J( H6 o8 K' b* l' |9 V当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
2 t5 F) {$ Y8 E9 s& @6 z而是先判断.txt属于 txtfile '文件类型', I" S8 ?8 J# {2 |( I1 W, x" ?2 U R
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
" g5 k6 d3 X" N6 G6 K可以在"文件夹选项"→"文件类型"里修改这2种关联 d8 S: B: O x9 j
assoc #显示所有'文件扩展名'关联
o% P+ ^+ Q6 D9 p- M+ c1 y. Uassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile" u4 b. a* H+ q2 D
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
6 V- P, T l3 e: ?3 U; Yassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
1 k5 U& `( m8 i0 Lftype #显示所有'文件类型'关联9 ]( ]4 n2 @+ ^1 [; h5 ?4 {. r
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
- [% Z+ F: Y. c$ t$ Wassoc .txt=Word.Document.84 S% e2 j& a1 Y& S
设置.txt为word类型的文档,可以看到.txt文件的图标都变了 b9 h# n, S* o' i$ j. U9 W
assoc .txt=txtfile
% i, K, l, R( A5 C& A0 h; s恢复.txt的正确关联- M! S; W& o- ] w5 y; W5 `9 A
ftype exefile="%1" %*' b8 s* [# ~- E; s0 E& n1 K+ E+ b: F( J
恢复 exefile 的正确关联0 G& m4 }8 A' \% f) @+ k) h. ]% u0 o
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令 k8 U5 X/ J- M: k$ r
! Z. w3 M+ u& J+ q) U- T
36 pushd 和 popd
5 c1 f8 n- M8 ?% g+ ?* K切换当前目录
2 P8 w' D O% L# e@echo off; R; _$ X* x% L" L
c: & cd & md mp3 #在 C: 建立 mp3 文件夹4 c2 x' b% M& ]8 E' y4 D9 e
md d:mp4 #在 D: 建立 mp4 文件夹
- Y" u x7 C7 A/ p/ O$ S/ Wcd /d d:mp4 #更改当前目录为 d:mp4
' h2 ~ p: w$ C+ Ypushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3 y( F, q4 y* V8 z1 p
popd #恢复当前目录为刚才保存的 d:mp41 V1 F2 {7 o, L( ]% A0 `
3 D4 R9 S6 _; b
37 for
% Z, M1 I* j3 K1 A; I3 p1 `$ B循环命令
" _1 f# h7 x& _: B6 ]这个比较复杂,请对照 for/? 来看
+ I) v9 [* s" C; C7 b3 \* @0 Tfor %%i in (c: d: e: f do echo %%i# a8 Q; D# Y5 b$ Y) J
依次调用小括号里的每个字符串,执行 do 后面的命令
?5 X5 I+ ~0 O注意%%i,在批处理中 for 语句调用参数用2个%
8 n5 c) s" M& q7 B8 U( y- x l+ Z- n默认的字符串分隔符是"空格键","Tab键","回车键"& {7 A0 A1 P6 I- ~/ h+ `
for %%i in (*.txt) do find "abc" %%i
7 x: S& G6 w, |, F& M对当前目录里所有的txt文件执行 find 命令
# f Y/ ]2 P* R6 l0 j2 k# Ifor /r . %%i in (*.txt) do find "abc" %%i
$ t2 T# e/ r( i5 i在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
$ W5 h- q; N Q' b( r# \/ pfor /r . %%i in (.) do echo %%~pni( E+ w3 o* I0 ^
显示当前目录名和所有子目录名,包括路径,不包括盘符! O* X6 J0 j- ~* b. \9 I
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt0 @* U. N+ G# v( P% a! y
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
/ a7 Y) x5 |! ^5 y; }. o, o) Ifor /l %%i in (2,1,8) do echo %%i
) Q$ u$ u3 i. |- n生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1! n) O- l F! w$ e; M
for /f %%i in ('set') do echo %%i
# u& h% m I$ N. L对 set 命令的输出结果循环调用,每行一个
! r! P) t0 L2 G- L: W7 ufor /f "eol=P" %%i in ('set') do echo %%i
8 n$ S {4 f4 ?* }! G9 K+ D取 set 命令的输出结果,忽略以 P 开头的那几行
+ B0 G) [) g# b1 Ifor /f %%i in (d:mp3.txt) do echo %%i" |. E" A$ m& w1 @- A2 b7 E! ?
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
* h, J) D K+ H9 [for /f "delims=" %%i in (d:mp3.txt) do echo %%i6 N& ?9 O5 B" Y' D2 O
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称% W4 i" a% y7 g* b2 ^/ R( F. Y
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
6 g j5 b7 X# E5 p! ~+ }对 dir 命令的结果,跳过前面5行,余下的每行取第4列
/ h+ R( G1 R3 h1 X$ H" V J每列之间的分隔符为默认的"空格"
: M/ A" ?# _2 F+ ^7 A/ H. t可以注意到 dir 命令输出的前5行是没有文件名的) m! `5 A$ `; A( X) v
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
) ?+ ?% e( Z' ?echo %%a1 A9 ]: i6 y8 ?7 Q, }! ] v
echo %%b
, |6 Y. r# u6 C+ q1 Z5 Zecho %%c5 i- R/ W7 U2 d7 K. b' T
)
* D ]3 h/ Z7 w1 v9 k, M/ X0 z对 date /t 的输出结果,每行取1、2、3列+ K2 \" Z! u- D+ m: U1 I
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列! e z; k8 Y6 E) x* }8 E
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"+ R! r/ R0 L$ t; p/ F
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
/ d7 c& N a% ] e A$ ?for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
$ L) Y) `' ]; [取第2列给 %%a ,其后的列都给 %%b( j! `+ L6 w; m$ @2 u( t& e
& s" i0 t7 @/ t6 S38 subst (外部命令)
2 D6 m+ k) h8 v$ H映射磁盘。, `5 L9 ~( n, T) @( Z6 L
subst z: serverd #这样输入z:就可以访问serverd了
a4 [3 f2 w+ M9 dsubst z: /d #取消该映射
2 m2 _0 Z3 L' Csubst #显示目前所有的映时
% i) U7 L8 p/ [" I# V6 D
3 L B4 U9 V6 P39 xcopy (外部命令)
T) R7 {8 |1 l8 M. e' v& y) ?文件拷贝; _* _+ V" z5 p$ m9 c9 K
xcopy d:mp3 e:mp3 /s/e/i/y% E: V0 s$ Q! W8 s% t+ Y0 S
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
6 l2 n3 M/ J' s* p加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
$ J% m" c0 y& _2 I' @/ D4 ]
# l& k1 H# @4 m% [( w3 ]5 P- U. W8 @常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
' a Y2 B7 m/ h3 u- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:
3 ^% y% a, y) \" B7 y4 Y
- w7 y. j; Z3 B4 _8 J
@echo off. J7 S S; ^; m2 d8 ]6 q2 W( `
set p=aaa9 J2 c5 e- U C1 G) w8 m5 _1 d* O
if %p%==aaa (% o1 y; W* G6 s6 a C9 W' o0 M
echo %p%
) Z! w2 t$ K- ~+ h9 k* s3 ?' R7 Qset p=bbb
6 p( u1 A0 W9 I# C- d8 Pecho %p%
$ }% G4 s- [+ ^# C1 M)
+ C% @% T5 y! j$ h7 H) k- S. |pause
; r* L7 ~- J! q S5 t |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|