|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!1 [( E9 n4 V+ m4 o, o/ r
前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效. S0 h* `* G; R: l. D6 Y
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
4 k. G ~3 Q2 T% e* f% p& d名为bat 目前比较常见 的批处理包含两类: + R; t6 F2 U- u7 H4 _4 e
- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理3 O' z7 ^0 y9 t$ P. S
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
* W; A* l$ A1 }. W" y" B命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
3 N/ T) t+ a7 q' F 怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
- s, w7 [# L" U! Z! u 批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set H3 v! g3 y# c5 ~, O
批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||
9 F% O6 p. D" _2 h 常用DOS命令- 文件夹管理:
- D$ Z; K" U$ R1 E2 H0 o- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。- ^9 o8 S) j' T+ a% n
- 文件管理:
" s" N. W# }( h7 z; N- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同. n( c9 P z V: n: |1 C$ g+ k
- 网络命令:
5 A& u2 L1 `8 @) @7 ^, {( ^- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表
* q7 m6 ]1 R" _
- 系统管理:! I; Y Z+ `8 e+ X) H' f9 u
- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置9 L8 w2 D) R/ M9 h
" |5 [& W, T" @
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /? $ ?) a9 G, Y* ?, y
6 |# v0 U* s% {# \& kWindows Batch 常用命令
4 x( A- S3 B" m1 e& ` u) J! k1 echo 和 @* ]- V* C! W; o) \
回显命令
: U. e, h& b; L# Q+ M7 n5 D0 F@ #关闭单行回显2 _) q+ o' B+ ~1 `4 Z1 C
echo off #从下一行开始关闭回显9 g; R& n$ ^4 m. \
@echo off #从本行开始关闭回显。一般批处理第一行都是这个
1 E- h* b _- {9 J3 wecho on #从下一行开始打开回显
( H8 K8 \7 u9 h0 P! {echo #显示当前是 echo off 状态还是 echo on 状态$ S! S1 }" k& m
echo. #输出一个”回车换行”,空白行* m% u |) r: v, V: V) ?: s) v) H& h8 s
#(同echo, echo; echo+ echo[ echo] echo/ echo)7 D. P2 I4 R6 ^$ y6 U9 x& T
( M+ q! f: w; `1 u: l2 errorlevel
5 U8 B# ^! H& `6 mecho %errorlevel%
# M5 ?3 ~9 N( y! x每个命令运行结束,可以用这个命令行格式查看返回码) o8 i6 W9 W% @! B6 ?6 z% q
默认值为0,一般命令执行出错会设 errorlevel 为1
# {( u* Z( m: m/ T* I8 H% E6 Y7 ^: ^ C; g' d! j0 w' e6 A
3 dir
6 j4 b; t) ^2 g/ [) b4 o8 X6 W显示文件夹内容+ G' W6 i$ Z& s8 a8 L; b
dir #显示当前目录中的文件和子目录
% P4 s, O1 g9 wdir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
) L z4 ?4 `9 h$ {* j& x( G) K9 H; Edir c: /a:d #显示 C 盘当前目录中的目录
% X. @$ _7 V$ Edir c: /a:-d #显示 C 盘根目录中的文件* v% R$ h x+ L" H% N; r
dir c: /b/p #/b只显示文件名,/p分页显示
/ t+ J7 ? [* zdir *.exe /s #显示当前目录和子目录里所有的.exe文件8 e: C) Z% R. s
( D! X, w# [, R3 B9 t4 d: j! G/ v+ |
4 cd
* O& z3 p* N! ^切换目录
8 B5 b! [5 n. F$ F" Z( n& jcd #进入根目录
9 ^. a u( v( g$ Z* Bcd #显示当前目录
, v3 G9 y* q4 b3 |cd /d d:sdk #可以同时更改盘符和目录
4 }: L1 x" K- j0 R( C
# o' P6 V, d7 P6 w; W2 O, h) G5 md6 e- F# [1 `, f) ?7 u
创建目录% A1 U0 I( U9 A. [! N
md d:abc #如果 d:a 不存在,将会自动创建中级目录; Y$ ?; r& L3 d7 h, V- k
#如果命令扩展名被停用,则需要键入 mkdir abc
4 v. R9 X9 ^% A/ P
5 ]$ [1 k9 ?. v5 p) {1 K6 rd
; q1 s- a3 M- F9 J删除目录
4 a8 f# t! C1 R* x, R& e' u! Mrd abc #删除当前目录里的 abc 子目录,要求为空目录
" \0 q* ^9 a" krd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
2 D0 V z- Q0 W Q/ _2 N( N# w
7 del
$ _5 ?, J+ }3 ~ q删除文件. ^/ c' S, [ h ~# j0 b) |
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件 E; J0 o$ `6 M2 |" A, I$ H
del /q/a/f d:temp*.*
3 `3 |1 }6 l! U# y/ \: ^4 B删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
& |' A- e7 g* z# ~5 S) b% ^9 edel /q/a/f/s d:temp*.*1 G8 J4 e7 q4 B) ?9 Q) n
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录& Y- `8 `: t# t9 J6 ?7 ^
N; p; ~: L( N+ ^4 F. g$ i! A
8 ren: \- I" i3 j, `" U
重命名命令
! n C% o$ o0 u& y" A6 u4 Eren d:temp tmp #支持对文件夹的重命名# k6 Q$ c$ ?2 j: _9 Z
& e9 I' j& @! q1 p5 O; n9 cls
- w5 Y4 c7 F I3 b" ~清屏
+ c' H. h8 C0 Z# D& S10 type
: A. P- _/ Q5 k: J% F显示文件内容
3 `5 R! }" j5 `& T! Btype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
! H# S9 W$ I, ntype *.txt #显示当前目录里所有.txt文件的内容
6 N9 ?1 ^0 g" e# n% j! d, b- K' Z/ v3 `# |
11 copy
. U( f7 H8 v5 r: [# b. t5 d& l拷贝文件0 k/ w+ }: }$ K, O
copy c:test.txt d:test.bak) {) B' ^# ~( q
复制 c:test.txt 文件到 d: ,并重命名为 test.bak
9 L# X$ T! V& }# [: b1 |copy con test.txt, R G' P. \& s: L; c6 F2 X5 r
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件) _9 d/ u! ~' F: V; o) Y' M
con代表屏幕,prn代表打印机,nul代表空设备8 t8 R$ ?7 g) Y. b
copy 1.txt + 2.txt 3.txt
- q A! D( a" d h' f) _合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件$ R# A( z6 ], y+ `. C
如果不指定 3.txt ,则保存到 1.txt
; G! J5 ~; @, h- l7 ]$ kcopy test.txt +
' K$ z4 {6 E2 N0 \7 v" w* ^复制文件到自己,实际上是修改了文件日期" y. p* d" G7 B( E" d) i
* k7 C3 B4 [: Z4 N+ R
12 title8 k; P; F3 p5 O+ I+ C
设置cmd窗口的标题0 I" _# G( ?3 h' ^
title 新标题 #可以看到cmd窗口的标题栏变了
! ?8 P( K) T+ }, I! n T8 B! q3 T$ E# {2 b
13 ver
, P$ G$ o' G7 d& F- p& U显示系统版本
( x: l+ E; ~3 M5 m' B8 _- I, [: s# ^6 M3 h* g2 U6 y
14 label 和 vol
" }2 m4 \4 a K( i* X2 K设置卷标) e7 v0 i `- l7 N
vol #显示卷标
0 c( ?) ~; G. F: k3 H; klabel #显示卷标,同时提示输入新卷标# E# u [5 |+ D* |- G8 c
label c:system #设置C盘的卷标为 system% t# {1 X7 R5 \* @# @( P. L: @
9 }, f! ^; G1 g6 L0 K15 pause
* b% M6 |/ f% V) g暂停命令& Z; p! Q: R1 |- H' N4 ~
* f R8 D8 _2 ~, {& I
16 rem 和 ::# t+ f9 [2 a$ ]0 `/ ]/ w
注释命令. `- \6 A: F! K% N4 o, f
注释行不执行操作
# c% R! w" c8 U) m. Y& J9 s5 K8 [: ]: F
17 date 和 time/ N1 Z, w/ U, |2 A- M9 ~7 O( d
日期和时间" u! O1 a1 W2 C U$ a
date #显示当前日期,并提示输入新日期,按"回车"略过输入6 h; Q8 m3 \- D1 Z; l- J" g
date/t #只显示当前日期,不提示输入新日期) T9 t' N/ p" X
time #显示当前时间,并提示输入新时间,按"回车"略过输入
, e. ^0 H! w- X/ `* ] Rtime/t #只显示当前时间,不提示输入新时间, p) _6 P; }# o
& a1 b7 p4 ~+ q+ Z1 k( B$ H18 goto 和 :
, e6 v" \* i2 o# F/ r7 E跳转命令' c+ m" s3 f/ K( }
:label #行首为:表示该行是标签行,标签行不执行操作& a, A, w/ L0 @. I6 ]8 V3 k
goto label #跳转到指定的标签那一行
, y8 h' u4 s2 O" }5 u2 r/ ?" A$ S4 b" M1 p3 C9 L; Y5 ]
19 find (外部命令)" u; d8 E6 x7 d. K3 B+ n
查找命令, Y: ?1 s% G0 Q7 u0 k" C' w9 s
find "abc" c:test.txt
3 c. l! T m+ H, }. O在 c:test.txt 文件里查找含 abc 字符串的行
# {+ V. Q s/ o0 R8 V如果找不到,将设 errorlevel 返回码为1
5 d2 `( e+ p! f; W# Z" jfind /i “abc” c:test.txt
+ \- `6 e, T9 u4 ^/ f9 g+ A4 u& {查找含 abc 的行,忽略大小写
/ ~" @. _6 P4 N8 `4 mfind /c "abc" c:test.txt* \1 a3 W7 S; Z5 [ X( t
显示含 abc 的行的行数
( `* c, z% H7 h4 t
7 X7 V2 S) U/ e. r& Y3 f20 more (外部命令)! o1 ?% e% W( D0 p( a' R$ H5 L- y
逐屏显示
7 K5 g2 u$ h- N; L( b l2 `# Tmore c:test.txt #逐屏显示 c:test.txt 的文件内容
1 b: X6 S$ F1 T, r9 J" O, |$ }- i/ i" C% ~
21 tree p3 ?( z- Z6 b O$ c9 K
显示目录结构3 u, z. z9 B* p, V* a# T- k' L3 k
tree d: #显示D盘的文件目录结构
' ~4 F0 m7 A" X6 t
7 H5 e% }$ {& _9 A7 _. c22 &# n5 L2 R& ~* O' |/ o5 s
顺序执行多条命令,而不管命令是否执行成功5 u% J1 g; |# f* i0 w
i3 G: q7 J+ }2 x
23 &&
/ T; R1 w7 P, c6 p顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
7 n4 _% _" x9 B0 t7 W" ?) Rfind "ok" c:test.txt && echo 成功
. V: Z- z* ?- a如果找到了"ok"字样,就显示"成功",找不到就不显示
5 K! k7 q) G4 S1 s8 }, ~
. `1 o: O; O% Q( S2 W7 a& w( C/ r24 ||6 f: ?! h5 d. V
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
. B% k/ u n+ m8 [. S$ bfind "ok" c:test.txt || echo 不成功2 d* f' P$ y! }
如果找不到"ok"字样,就显示"不成功",找到了就不显示
( Z4 u4 W6 r8 J
' J+ g' b' w# R; ?* X25 |
- |/ C7 @0 R4 x# a6 f: x {管道命令
- V6 N6 G6 `# f4 Z/ ^4 L8 x2 {dir *.* /s/a | find /c ".exe"4 G2 g6 K, g6 b: O4 t
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
# m* s x% L# O- X该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
, H8 @4 }* }, Y& R2 N* gtype c:test.txt|more4 f$ J( h! U9 I8 T1 Y
这个和 more c:test.txt 的效果是一样的0 {1 W4 U, C" r" W
! I# d; S! I2 d6 E2 A$ F26 > 和 >>
$ F2 C7 e! P2 x6 J: i输出重定向命令9 }) p3 c1 c( H! ^
> 清除文件中原有的内容后再写入
W- M# S0 u) l>> 追加内容到文件末尾,而不会清除原有的内容
3 R O- `$ [' W6 |6 j6 {主要将本来显示在屏幕上的内容输出到指定文件中
2 i1 ^$ E) \. i9 c指定文件如果不存在,则自动生成该文件
$ C. y& [* w& F" `& p4 T& Gtype c:test.txt >prn* P9 l0 X) V% \9 v3 C% P- B0 |
屏幕上不显示文件内容,转向输出到打印机9 v- I3 c+ ~4 L: U
echo hello world>con! b F D8 z0 A3 O5 N' P
在屏幕上显示hello world,实际上所有输出都是默认 >con 的. M0 S- w& c2 f0 |. j
copy c:test.txt f: >nul9 ?. B8 X8 Z0 k4 K/ z) }
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
' g7 F& H4 Q" S2 ?, B# Qcopy c:test.txt f: >nul 2>nul8 a) U0 X8 q& d' @9 c( i
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
5 m6 |3 e: ^* Z& U, Decho ^^W ^> ^W>c:test.txt! I2 x, E: q" N
生成的文件内容为 ^W > W' A/ |* J8 w1 R/ m/ o
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
O% w* r7 ~# c2 ?! P& [
2 ]/ `5 `. F3 q& K27 <
( l4 b- e- O- p, @8 h5 G! p从文件中获得输入信息,而不是从屏幕上
4 G% A C; y$ x. I, o" P: ~0 c一般用于 date time label 等需要等待输入的命令$ a$ V& c! o2 E" [
@echo off( `" q- E8 P% L
echo 2005-05-01>temp.txt
; w: f/ J6 a% L. _) H4 ^4 k( S3 Jdate <temp.txt4 f4 p; h; s+ D3 \* a
del temp.txt
8 l, J! [/ V3 f, c7 P& h这样就可以不等待输入直接修改当前日期; T+ G- {% W3 K6 D2 ]: _
$ M8 u( R* W* X" k7 h8 ]4 A7 N
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*! u. i* O/ B3 v9 u1 n, P. Z
命令行传递给批处理的参数) U# ]8 M- h) b- e7 x/ a+ G
%0 批处理文件本身9 P# h+ \! P- p0 O! O. g/ P* h
%1 第一个参数) `( D( h) S2 ]( S8 d3 c
%9 第九个参数
- ^) v# s0 v# {& ~; t/ ]5 a%* 从第一个参数开始的所有参数
4 R5 @* [3 X) o$ V- o, k批参数(%n)的替代已被增强。您可以使用以下语法:( k5 _* N7 b5 T! K+ \
%~1 - 删除引号(" ), 扩充 %1
% I3 ^* {1 d) V! o" ], |%~f1 - 将 %1 扩充到一个完全合格的路径名1 i- ~5 F2 F$ x0 E5 S3 p
%~d1 - 仅将 %1 扩充到一个驱动器号
) ~$ A! ?0 o: T# ~0 O%~p1 - 仅将 %1 扩充到一个路径. ?- z8 A6 \5 A: Q U
%~n1 - 仅将 %1 扩充到一个文件名
. ~4 _, ?! b0 F6 g& x%~x1 - 仅将 %1 扩充到一个文件扩展名
( `0 w! ^+ K% F2 V%~s1 - 扩充的路径指含有短名7 c+ _$ m; Z7 @& k# B( r
%~a1 - 将 %1 扩充到文件属性- X. u1 Q6 g' K* |0 X
%~t1 - 将 %1 扩充到文件的日期/时间
# t# W( x7 {# Y5 d%~z1 - 将 %1 扩充到文件的大小' l$ c2 K r9 \4 a# l
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
; l5 _( S6 Z, |5 F扩充到找到的第一个完全合格的名称。如果环境
- D, o* ?5 b$ O- ^) G" g9 a; f! W变量名未被定义,或者没有找到文件,此组合键会/ U& z; P+ r& C( i' Q# a- a6 R. G
扩充到空字符串
) f: m4 p& m3 D; I可以组合修定符来取得多重结果:
) X3 g! A1 D! r, ^) t, O6 I%~dp1 - 只将 %1 扩展到驱动器号和路径
2 w; J$ q/ F D' [; [%~nx1 - 只将 %1 扩展到文件名和扩展名
: C: j8 z9 I0 L6 d%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,; i5 H- Q1 A- F
并扩展到找到的第一个文件的驱动器号和路径。5 d: I; b+ ^2 u" T) _
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
, w+ U0 t6 b8 E- ^, E可以参照 call/? 或 for/? 看出每个参数的含意/ _' d7 h, f4 z; r- i- r
echo load "%%1" "%%2">c:test.txt
& R& B0 g. M- V7 Y, i$ F生成的文件内容为 load "%1" "%2", O" T U% ?7 c3 E+ G
批处理文件里,用这个格式把命令行参数输出到文件. L3 U' O' R$ F; b
3 Z, P% F; t9 s# u! N5 R
29 if
, K/ J. f, J# L5 T. J判断命令
+ \' P3 a. m. ]3 T+ O) A9 qif "%1"=="/a" echo 第一个参数是/a
4 T. h6 v+ U1 N! }7 ?if /i "%1" equ "/a" echo 第一个参数是/a
+ `) L1 a; q, N2 F( Q0 ^3 }% }/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
- p; f' I" W4 R% V5 W/ ~' W* N7 Aif exist c:test.bat echo 存在c:test.bat文件$ }9 ?# `7 r4 s) [7 R( u8 F
if not exist c:windows (& l% T' s* @2 a% N! y3 d( x/ x
echo 不存在c:windows文件夹- N% n8 P1 W% R% w& r
); x7 R; z0 m" Q2 o
if exist c:test.bat (
- W- o" f& J% Recho 存在c:test.bat
% S+ M1 j1 K4 Z, J& e4 I) else (
6 t# T* j7 ]& C m( M, S ~echo 不存在c:test.bat* m' E* [* \5 L. s2 g
)
* ^% L- Y l& d% }+ A$ g, D% e30 setlocal 和 endlocal
0 `" x# ~3 t9 k7 F1 _设置”命令扩展名”和”延缓环境变量扩充”
- h. V* V6 P* G9 c/ SSETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"% E* F n4 S, \% ]% Z5 ~( @
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
1 R* o( J- ~3 Y3 G$ l/ U0 P* ZSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充": q3 \0 w1 s+ x/ H* W6 V5 n: D+ |+ }
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"3 F0 L' d; L: W W- k* z
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态8 W% O# R5 _% s# z
“命令扩展名”默认为启用" Y! M( ? V/ ` f. _: q' r7 ^3 o
“延缓环境变量扩充”默认为停用
2 W! a2 z0 Z i批处理结束系统会自动恢复默认值
8 S2 |% ]$ b2 R" q: r- e' v( Z! t可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程4 p }. @- J3 ^+ |6 Y9 a {7 I
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
) a* B/ \# k: a; B T保程序能在其它系统上正确运行* [7 x( l' k) J& p7 s+ k
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
0 U9 D+ |3 Y, {6 U$ _) H# s1 E1 L( l! t: a% ^* Q0 g
31 set
( P6 V4 H9 R5 {# {3 @9 _ f设置变量# ^8 T7 k' ~/ d4 r2 A6 `; K) [
引用变量可在变量名前后加 % ,即 %变量名%
$ z. P- X. g( ]% r, \+ S! bset #显示目前所有可用的变量,包括系统变量和自定义的变量! Y; A- t, p/ ]1 h$ ~6 I" K* X
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用2 a/ }0 Z X8 \, K
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
8 t4 o1 d# y, |4 Y! E6 xset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2( Q+ F5 @2 W) O1 }6 {
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2, H+ K& h5 H% A
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
! P, G- U1 z% c" z5 techo %p:~6,3% #显示第6个字符以后的3个字符,即aa2' Q3 X5 f/ U3 y7 W( d" r" R9 j
echo %p:~0,3% #显示前3个字符,即aa15 c" o8 J. l% U7 k4 s
echo %p:~-2% #显示最后面的2个字符,即b2
# g. _# o2 }# l2 n7 D' b& Aecho %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
% L% L, F z1 T2 Z; E6 `echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2" D& i+ h7 v7 u, \3 G! z, _# |
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb29 F# z8 p d+ c4 P
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2: Y6 E4 H) W7 s& o6 `
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2, L6 S3 T6 I% T, ^% A/ C
set /a p=39 #设置p为数值型变量,值为395 N* n9 N: [$ g& v8 y. h
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3% i& }+ `5 q6 l3 R, t. Z' B" K9 ? ]7 m
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用 |" D" I/ p. q( Y1 c- t
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
1 E5 P# @3 e; L) f8 Tset p= #取消p变量
4 m; F1 _4 y- {6 ^" pset /p p=请输入9 b% f" ~2 s+ z& ^" n+ g
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p0 s* c8 n% O, V$ _
注意这条可以用来取代 choice 命令5 \. c$ C) n0 R& {
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如6 ^5 e+ ]- X+ N; u3 b1 y' t' V
@echo off
( l8 E! ~! q; U s9 rset p=aaa2 z% { ]5 c) ^" v2 |
if %p%==aaa (6 l6 r$ t3 `% ]2 d% D F9 L
echo %p%
/ t! m# j7 l/ P- f6 E# bset p=bbb
+ {" ~0 V+ l* x }( b8 v. b8 j8 iecho %p%; a- g8 L U( ^) b' w
)( @* ~: D$ F3 | g5 a* d2 _
结果将显示; c) i- `2 i8 n1 d
aaa
& X; F# @7 k4 ~( R: G; k' x7 _aaa5 f5 ~$ J J3 @: l/ J) T4 j
因为在读取 if 语句时已经将所有 %p% 替换为aaa
! n. K7 o9 B: X4 \ j! u这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
8 k. [' }/ h) L0 i可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
4 G1 L: U1 b" ^! ^5 Y@echo off
7 K" H( E# q# FSETLOCAL ENABLEDELAYEDEXPANSION
# B) C! a: b& yset p=aaa
4 }$ h6 s: n+ W6 x5 O5 {0 oif %p%==aaa (
" v: v, z. p; _! F% S) Fecho %p%. M) `5 A" h; y2 }0 U4 h* t6 R
set p=bbb% O( e# a; Z% e: h% t' D( f1 y* h
echo !p!- \- z, J, Z$ J- {
) c+ k2 ?4 T0 \" r
ENDLOCAL
& U- ]' Z9 c# Z# Z! C结果将显示/ [* x+ L% s& T$ ~4 N
aaa
) }3 R. J" A$ R* Q& P6 ] Vbbb }, s0 O5 t% s! B1 z
还有几个动态变量,运行 set 看不到
3 h5 ` f5 z7 r9 G% l; j%CD% #代表当前目录的字符串
* a/ h4 f. @1 h! Y7 P%DATE% #当前日期# d* \! o2 T/ F1 D8 h+ q1 I$ c0 ?
%TIME% #当前时间& S5 D8 f. p1 F" g
%RANDOM% #随机整数,介于0~327678 a, f$ J1 z& t/ u) V! r! P+ F2 M: I
%ERRORLEVEL% #当前 ERRORLEVEL 值; X a5 z- @% b! C) g; p. ?
%CMDEXTVERSION% #当前命令处理器扩展名版本号4 C6 o# k; b! {, _5 X5 d* j0 O
%CMDCMDLINE% #调用命令处理器的原始命令行
7 z: n$ n4 V; n# o6 N可以用echo命令查看每个变量值,如 echo %time%
( n1 @! _" n' [7 }- w8 V, V( B注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
" Y* Q& m. J8 g @" `) A8 K, {9 Y0 x% X- Y) v9 t; w4 S6 L
32 start
" ~( Q. C: l6 _3 A批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
* F0 r$ r' C# C! @% q2 L+ t9 X" B5 r3 f2 n9 s2 s2 |
33 call
; ~4 |: b8 ~* U' x; S& v" T批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
" j% J9 |/ m/ n有时有的应用程序用start调用出错的,也可以call调用
& @! H6 V& L. H# U; R& N- W. ]9 x5 m$ K6 B2 {& O7 _
34 choice (外部命令)
. W9 q( J. b0 k: }' Y: ~选择命令: h' S! x. G2 a' u; A7 t: F5 @
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……' |6 H G0 |. d/ D
win98里是choice.com, I3 Q: S; D$ a g- e# U
win2000pro里没有,可以从win98里拷过来
4 k( Y4 i" y5 K* M }2 A' vwin2003里是choice.exe8 F8 O1 L# |9 c1 s
choice /N /C y /T 5 /D y>nul
0 T t" b0 |2 k' T$ W% [; T延时5秒
8 u6 x: ~+ J( A
$ H% n; K. F/ M" T7 d0 n35 assoc 和 ftype0 @! }7 ~; H( D6 r) b) c2 a2 z
文件关联2 Y6 n' r7 P8 c$ N c
assoc 设置'文件扩展名'关联,关联到'文件类型'
0 z9 ~( S9 \0 s1 R! D2 ]: s+ e8 J; bftype 设置'文件类型'关联,关联到'执行程序和参数'
) M+ ^) m8 a2 x+ _当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开; a# G4 z: c: i9 A S
而是先判断.txt属于 txtfile '文件类型') p* Y" G6 f$ l; {
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1/ X* |3 d3 j9 r& X& @8 Q
可以在"文件夹选项"→"文件类型"里修改这2种关联
; `6 x3 p+ x1 j# Lassoc #显示所有'文件扩展名'关联" c/ R' r. i: N }# [6 D/ J
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile F! D. W5 B* C' B
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
9 k2 n. Y7 E4 q; j O; S) c6 k; yassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
& F+ q; X; o8 T+ pftype #显示所有'文件类型'关联$ A% d7 O8 E" m( v
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
; H6 C8 Q5 \6 C2 i5 Aassoc .txt=Word.Document.83 S6 @+ x7 n8 R1 c% M# m5 g3 j
设置.txt为word类型的文档,可以看到.txt文件的图标都变了- b7 Q U Q* G, M# P
assoc .txt=txtfile1 F& @7 O# f! R. a7 O1 E
恢复.txt的正确关联' F; S" x# p4 n5 |+ u3 X: n
ftype exefile="%1" %*% `" t" V0 @ g& @" Z1 q h- _
恢复 exefile 的正确关联
0 w4 g, \$ y* y8 k' e! P C, |如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
( G: ]' Y; P* q3 }
) s* j( Q' n8 p36 pushd 和 popd: I9 }, b) H6 S& y0 S: `
切换当前目录
# c4 I7 `7 Q3 h! b# Z" U3 ]) g@echo off) @8 Z) S( r ?4 k# o+ ^5 L
c: & cd & md mp3 #在 C: 建立 mp3 文件夹
1 H2 a( C: J9 smd d:mp4 #在 D: 建立 mp4 文件夹$ c0 r! |4 y, f. c
cd /d d:mp4 #更改当前目录为 d:mp42 K' n3 @) y8 H
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
) q [9 e9 m( m$ F0 q* Ipopd #恢复当前目录为刚才保存的 d:mp48 }5 |1 H v. J/ p+ c
; P" o2 H6 k" @) u5 N4 m
37 for. J8 ]/ c% W+ }8 O7 X0 q9 V- X4 ?
循环命令2 E! S( ]* x% W. i
这个比较复杂,请对照 for/? 来看1 s8 R) j+ X2 D1 H. {/ Z- p. X! ]9 [
for %%i in (c: d: e: f do echo %%i2 [3 J+ }3 T G" ~. H& n5 \ Y3 U0 B1 _
依次调用小括号里的每个字符串,执行 do 后面的命令
* Q3 P. {. K3 w2 f1 ], y0 ]$ Z/ A注意%%i,在批处理中 for 语句调用参数用2个%
/ ^' ^& t' R; k, E默认的字符串分隔符是"空格键","Tab键","回车键"4 X3 a0 |' d3 r' q
for %%i in (*.txt) do find "abc" %%i: D2 {' d$ c# x' E& r- d, q; q
对当前目录里所有的txt文件执行 find 命令! D" p3 X: V3 s
for /r . %%i in (*.txt) do find "abc" %%i7 N- t A }' B* ^8 m0 e& `. ]
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行6 u- n3 a* \3 O3 S
for /r . %%i in (.) do echo %%~pni
: W. j Y' r9 `! l9 |& w9 d显示当前目录名和所有子目录名,包括路径,不包括盘符
8 l0 Y3 d; L# s8 afor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt: g& t# f2 ]" |( c( E
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
$ s) G% k" F1 |- r, x5 }, Q" o5 E& p" V( H. vfor /l %%i in (2,1,8) do echo %%i- `' h0 ` S5 \; A
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
y& f% X% J# ofor /f %%i in ('set') do echo %%i* s6 e# s* B2 a% K
对 set 命令的输出结果循环调用,每行一个, U% p1 ]. ~8 s
for /f "eol=P" %%i in ('set') do echo %%i4 [) f( b$ M7 `4 B1 q5 k
取 set 命令的输出结果,忽略以 P 开头的那几行
# C! f6 Z/ j6 Q1 Q/ j* jfor /f %%i in (d:mp3.txt) do echo %%i
9 i0 z) ]+ ?3 r g9 }2 N显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称7 C- f* o1 B5 K2 K6 n/ T
for /f "delims=" %%i in (d:mp3.txt) do echo %%i$ W, i, i1 Q [" M
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
# i' V% M6 E+ u+ G( F( U) \for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a! |8 L/ x" m1 w9 ? ~6 Z
对 dir 命令的结果,跳过前面5行,余下的每行取第4列
1 }3 G' m8 V+ d6 x2 Q* r每列之间的分隔符为默认的"空格"9 `# O" ]" g% b8 m' H: o
可以注意到 dir 命令输出的前5行是没有文件名的
$ B) `: @! U, [9 P6 pfor /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (6 B# P4 L2 s8 f; O) G& Y
echo %%a$ f2 v- a1 P6 Z, c
echo %%b+ K+ C7 x2 A& z+ T5 {5 Q0 y
echo %%c. L; K) l2 n/ v D5 b- i9 T
)6 ?/ l& G, T" q: @
对 date /t 的输出结果,每行取1、2、3列
- N( F6 }7 [, D: \第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
0 h# Q. L# O6 |2 b) {' ]6 |分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
( }5 \3 y7 j' M X h8 l其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
: L. m3 D" f# O, Tfor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b0 p+ i5 B. f0 s, _3 E
取第2列给 %%a ,其后的列都给 %%b4 x+ C" [, d6 S3 l8 O# t k1 \
4 U$ m" T. ^' ~38 subst (外部命令)9 q; Y b. X' S6 E+ D( D9 j
映射磁盘。- ]3 A1 k/ N+ z6 d
subst z: serverd #这样输入z:就可以访问serverd了, j/ ^2 u+ u9 H8 S# T. R% G( l
subst z: /d #取消该映射: r. X. n( D+ ?1 z; x; C* N+ Y
subst #显示目前所有的映时
2 s# b/ Q/ n2 R* M, H. \3 ?' S! A `9 u: h# U, y
39 xcopy (外部命令)1 s+ K* `7 C2 v5 S
文件拷贝
$ C* A* {9 `4 q$ p/ Jxcopy d:mp3 e:mp3 /s/e/i/y
* g# K! ^0 k7 ?) I( C复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件( O- ]8 h' t+ V5 ]2 M5 ^
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
' h" `. W* _: O b5 z+ g y, o) g5 ?1 x6 V
常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退" C- A! q0 s* K7 E7 K
- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:- f. c; I5 h+ b/ t, H9 P5 q! ?: `/ @
* o0 L, k+ L- S
@echo off
' |: h" ?2 g2 {1 `0 S" U3 Kset p=aaa
# o% L0 W$ g# q* {5 wif %p%==aaa () Q' G8 S: y& q- E! x* l5 }0 {
echo %p%
5 Z2 ?8 m- p1 xset p=bbb0 {3 ^7 ]( D4 v- e v" D
echo %p%
: I, t6 H- x7 K! J |4 z; o)* T0 ?; Q6 W- [' [5 b" w
pause
?" `" c: L. b* Q |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|