|
|
发表于 2021-6-25 19:48:12
|
查看: 2403 |
回复: 0
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!5 }& j6 {, u8 s0 K7 h" P
前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效
8 C6 n& ^4 F$ n+ E
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展9 e, u/ Q8 T/ E) f& x% O* O
名为bat 目前比较常见 的批处理包含两类:
. |3 t! W6 n/ O6 G1 F8 ~% n- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理* V: z+ c& N+ l1 q6 y
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
: F. }+ ?" c6 ?' q1 s0 q命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件 % X+ l* S4 o& h2 L. u
怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出- T$ @" k% y- N0 \' U
批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set
& I0 U, ?! }* o! a/ K2 W6 w b$ C 批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||8 s. ]8 L* K9 B9 N& \
常用DOS命令- 文件夹管理:
0 O7 a% ]0 |, X; q; c- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。# J7 l( s% h+ f2 n" V' b- f4 t% x
- 文件管理:: g0 n' U. C& d$ F
- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同) a9 q; V1 C, c, U7 |2 s3 O% c
- 网络命令:
4 C: [! c! H% f1 ? C- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表) h/ L, }0 V! Z; M
- 系统管理:
7 C; { @, x! R& |- `0 Z- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置
* e1 l& u1 t% D2 S 4 \/ s; K" L$ C
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /? 6 c1 B$ ^$ p2 F* | G; t
( T' g0 s. X. o3 S1 ?7 UWindows Batch 常用命令
- O S1 Z+ u! ?" }. K0 ]( F1 echo 和 @
8 e5 i# }5 O6 J: H- V回显命令# Q2 r! Y4 O; G2 N7 S& V
@ #关闭单行回显- H" X7 ]- [6 i6 ]
echo off #从下一行开始关闭回显- @0 R; r9 \3 D3 D$ `
@echo off #从本行开始关闭回显。一般批处理第一行都是这个
) ^9 ^" w( \1 kecho on #从下一行开始打开回显4 h# [7 i6 M4 S6 w7 y% B! W
echo #显示当前是 echo off 状态还是 echo on 状态/ R6 b7 O! ~: O! [
echo. #输出一个”回车换行”,空白行
$ ~" i7 B& z: L#(同echo, echo; echo+ echo[ echo] echo/ echo)$ p* X, z8 u7 y7 w2 O3 p2 u* M0 e
7 y; h( d! Q8 o. N* O# O4 d7 G2 errorlevel
# k5 h) @' n$ Y1 m- M" m( J( xecho %errorlevel%
% j6 B8 R( G3 H' ~) T3 U每个命令运行结束,可以用这个命令行格式查看返回码1 ]& L4 `+ \% ]6 q; o+ s$ |) e5 v
默认值为0,一般命令执行出错会设 errorlevel 为1: O- f4 t( l1 q; j0 a0 c" w6 Y2 _) e
5 M6 ]9 Y$ P" N+ i( [# u( ~( k' n3 dir" K6 o% X; V6 a2 D. I3 ]
显示文件夹内容
) H% r" K( C5 ?1 N7 C3 Vdir #显示当前目录中的文件和子目录
0 @: l a& O( N! j9 W. [1 Gdir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
. y! \6 E6 G; { T6 l; w; odir c: /a:d #显示 C 盘当前目录中的目录
{9 s0 ^) @4 G6 B3 S$ pdir c: /a:-d #显示 C 盘根目录中的文件
5 ~. x& Y7 O+ gdir c: /b/p #/b只显示文件名,/p分页显示3 L# c. x. w2 F
dir *.exe /s #显示当前目录和子目录里所有的.exe文件' I$ {% V( }# U: e& \, g: [3 Z) v
, q) X% T4 S. ]9 J3 m) @9 I2 M: j
4 cd; i- x X$ D* J0 X; F7 ^+ X4 K* _
切换目录
5 o7 E, d, G; Lcd #进入根目录3 y/ E4 W. j" t9 K4 c$ q
cd #显示当前目录% J& l `* J3 Z. u7 G5 z
cd /d d:sdk #可以同时更改盘符和目录
* N: L) `. D- Z! g6 b
]* I: E) Q1 |1 E7 J6 t5 md0 Q {1 v ^6 A- x
创建目录
( l* {* [' g( Qmd d:abc #如果 d:a 不存在,将会自动创建中级目录
: m, i1 N4 d- U% L: }" O#如果命令扩展名被停用,则需要键入 mkdir abc
3 n- X* M6 Y5 D" f1 ?* X. |0 Y0 J
+ I, H. F9 k% R8 `4 R9 B- L+ ]6 rd
# g; |, u1 {6 o$ K$ R7 F删除目录; V ^$ Z* \+ ^/ ]/ Y
rd abc #删除当前目录里的 abc 子目录,要求为空目录7 M5 F) y+ d9 R0 `4 v- ~4 p
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式* h8 |( y) l X) I* y8 Q
. U/ t: H) N3 @# M) }. a# K7 del1 `7 O/ R" E# S. x
删除文件% Y8 S, K+ A# f+ v; Z- y3 n' Y
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件' p# Q: b3 Y3 D8 r7 }: q1 r+ V" X
del /q/a/f d:temp*.** X8 a5 Z. c2 g+ g
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录: L/ q5 o7 H, B
del /q/a/f/s d:temp*.*3 {8 a3 B" `6 I; Z6 }/ q9 m
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录" G3 R: d5 [$ u3 l
8 S# ]) W3 D5 ?2 |# S8 ren& z6 Q `. f' V! [/ a
重命名命令 b" l! V& {' e
ren d:temp tmp #支持对文件夹的重命名
6 x. y6 A9 C- _! E9 v4 g& i& E! n0 U
0 K+ U; E" H" O1 ]% {6 g! p" f7 ~% _9 cls9 c/ N( C" X8 v- x- [
清屏
' m. I4 ?% c3 u( A" |1 r10 type2 E: ]8 v. [( P- N
显示文件内容
J" c- X+ H$ q! X+ X" rtype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码0 V. @9 u. E8 J2 A% k7 D
type *.txt #显示当前目录里所有.txt文件的内容
I; D; D; ^- a/ s7 s( q& C% r9 T* |0 _. M0 E" E8 W- Y0 q
11 copy
6 W7 | Y& |# @6 Q- G2 T2 W8 i9 _拷贝文件" `$ Q% m* r$ Y0 B" n
copy c:test.txt d:test.bak
& V4 g v L: F: S) [! p) R复制 c:test.txt 文件到 d: ,并重命名为 test.bak
* A, k$ [8 ^3 X- ]; J; Ccopy con test.txt
' Q- s" v( I9 @! V从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件9 i0 y: a1 j/ \% q: v7 o$ `
con代表屏幕,prn代表打印机,nul代表空设备
. z1 F; j& `: e5 J: O6 B6 Ucopy 1.txt + 2.txt 3.txt: V2 z9 I3 r$ l6 d! z+ o
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件* @* @% n& ~9 y9 ^4 f
如果不指定 3.txt ,则保存到 1.txt
' {4 s) l6 w" J* Ncopy test.txt +& [5 T# T8 u `; N7 {# W( n; g$ i
复制文件到自己,实际上是修改了文件日期$ l" N3 h( K3 a, A( L9 ~
/ T6 Z9 \/ d. u' i5 P
12 title' ?- l" Q' t4 A+ O. L
设置cmd窗口的标题6 I) J, j4 E, k
title 新标题 #可以看到cmd窗口的标题栏变了6 h1 N; m$ T n! O @: e( j& ?7 _
3 Y }. _5 u* y. [! q, v* a
13 ver
+ Y" W3 D* Z |/ l0 }显示系统版本* V" [) Z. V* ?7 C9 b
5 W2 x' P0 s% ?' y, v14 label 和 vol1 }1 ?0 B' q4 Q. ^
设置卷标
9 f J' _2 L7 R lvol #显示卷标
$ w# q( Z @" V8 |+ Tlabel #显示卷标,同时提示输入新卷标
" a1 T" X) C' u i: t$ S: tlabel c:system #设置C盘的卷标为 system
0 T: W" Q! h1 V8 V+ A% f1 V/ M8 }, R) |$ L3 C* b
15 pause
5 a9 N \! A. b& S& f: s9 z暂停命令
# C! r, V; ?. t3 f$ s" z; b7 y1 l2 H8 K) U. p
16 rem 和 ::
+ f0 N8 |# z5 i6 n- E注释命令
& L6 `9 |8 ~ c4 ~' l4 u* N注释行不执行操作
! G' b7 G) _2 O7 W# l. C8 k0 e7 M/ {! j, d# e y, A. x% m- O
17 date 和 time: k. V; A% ~% I! l" y+ z) ^* V: Q T
日期和时间
& k9 v) _- f- bdate #显示当前日期,并提示输入新日期,按"回车"略过输入: V4 \! Z+ S9 }+ B; N
date/t #只显示当前日期,不提示输入新日期
8 @/ I% w/ _; N4 E4 _; dtime #显示当前时间,并提示输入新时间,按"回车"略过输入
9 d& W% ]9 Y1 x. A: z8 ]time/t #只显示当前时间,不提示输入新时间& F) g2 k2 B( Q* c' {# @6 Y7 |' a
) ^) M0 l. E/ w$ x1 B/ N1 i18 goto 和 :
5 }( b) x; j0 M4 O% m跳转命令% P; g' M) h+ i9 d
:label #行首为:表示该行是标签行,标签行不执行操作
5 M( z) ~2 Z& Y* }8 i4 ]; A4 J) R3 Ygoto label #跳转到指定的标签那一行
6 I E" l1 |$ _! [4 n! @
0 l' V6 {- J# r. V- Y) m19 find (外部命令)
# q# }: \0 l# C7 L查找命令9 n3 R( u+ l0 ]% r
find "abc" c:test.txt
0 e8 a: u# U. ^" q& Q在 c:test.txt 文件里查找含 abc 字符串的行( r* B4 M4 @; S$ C6 C
如果找不到,将设 errorlevel 返回码为1
3 ~0 l$ L7 w. b' k7 N. B( D2 I4 Jfind /i “abc” c:test.txt
+ h8 G( i# { T& v ]查找含 abc 的行,忽略大小写
- a7 h; Z0 ?3 ^5 K0 Yfind /c "abc" c:test.txt
2 S2 J6 B% F& [+ [' G u5 t显示含 abc 的行的行数
3 y* z2 r3 b; L. D$ s; F$ W$ T; o% ?/ A6 R8 }3 m( Q$ `" n
20 more (外部命令)
6 Y/ I! V1 r. v8 b! \逐屏显示
( z: n3 e8 _4 X% n/ l: T% w: F6 umore c:test.txt #逐屏显示 c:test.txt 的文件内容* d# G _* _: C, Y/ c
6 @) c3 @" \8 Q: B' A
21 tree- q, m4 d5 ~1 u8 M( R! u
显示目录结构
5 `' C. U0 @% N. [tree d: #显示D盘的文件目录结构
3 F6 g. a% a" Q8 `. S" _5 \5 g0 O4 D, v) T/ ~! C
22 &6 X$ L& ^% V- ^& T
顺序执行多条命令,而不管命令是否执行成功
, s3 ^- `4 j) v( w, d& _8 I5 e q8 P# K0 K7 d
23 &&4 Z# B- m1 }$ p# A( |& c& r
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
3 X5 k. i p ^1 o+ k8 T( c8 Ufind "ok" c:test.txt && echo 成功
2 w; g* O- k# h- c X/ p如果找到了"ok"字样,就显示"成功",找不到就不显示+ o0 Q- R% x* q1 i
' w* S- G5 P9 ]1 G: }% f$ @
24 || d( N$ \8 E u) f
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令- ^. K% N# L, l
find "ok" c:test.txt || echo 不成功( G+ V9 u' ]7 \1 ]& \* v- Z
如果找不到"ok"字样,就显示"不成功",找到了就不显示
0 {7 K/ I: D: p
2 r3 Y/ U& f$ Z& |8 k1 r% H25 |4 n2 i$ Z }) S% m
管道命令 O* g5 t4 A3 C# i( c4 J
dir *.* /s/a | find /c ".exe"
8 o* M: g1 W9 b/ _! D管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
. W' b. p( ]0 z, g, Z2 C该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数0 m( j! S# z4 ^/ M: Y
type c:test.txt|more" T& w) u; f4 ] `! Q
这个和 more c:test.txt 的效果是一样的
/ w" U) r# s/ a+ B# x {- N, `: N3 K: \8 P
26 > 和 >>
* U6 z: A6 p; y" q+ Y* X( s输出重定向命令5 m) Q2 W5 b% |/ F$ u! p; ^
> 清除文件中原有的内容后再写入
: G4 h4 t5 r* |, R; O>> 追加内容到文件末尾,而不会清除原有的内容
" _* `: }% k% v& b* Z主要将本来显示在屏幕上的内容输出到指定文件中9 T J: H' ]8 c2 L `4 p
指定文件如果不存在,则自动生成该文件) I& ~5 c; [! P+ q" G- p5 Z
type c:test.txt >prn) k6 ^9 d* U5 x7 I2 ?$ \& u
屏幕上不显示文件内容,转向输出到打印机7 L+ x8 d5 D x; w/ C0 Q9 A9 D4 o* W
echo hello world>con
7 Q5 R0 P4 @5 K+ ~3 U9 J* p在屏幕上显示hello world,实际上所有输出都是默认 >con 的
# C8 G* C$ V# D9 {# t O. j$ ncopy c:test.txt f: >nul' ^. t; \% U/ Y. V
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
: F8 [4 Q- K4 ncopy c:test.txt f: >nul 2>nul
( m/ w$ Z" S" R! L+ X. @2 O- T不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息- d/ A q/ j8 C9 A; D
echo ^^W ^> ^W>c:test.txt1 o+ Z* h% q6 M. p W7 E
生成的文件内容为 ^W > W
( x/ d0 V3 F7 v, P^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号' d5 @ y: C+ e- {/ H: D
0 o3 L9 M5 v/ h
27 <
( v# c/ l. N) W3 D, V从文件中获得输入信息,而不是从屏幕上' k! D/ }7 W$ ?8 g; v7 D" _8 }6 l
一般用于 date time label 等需要等待输入的命令
6 [5 r8 S; N+ H- {: D@echo off) }) e0 L3 E0 k1 b5 p2 e
echo 2005-05-01>temp.txt! j3 V ^* a7 W& [6 o
date <temp.txt- Q9 l5 X! c% r f ^6 K
del temp.txt
d5 ]6 Y) z: g: W5 T" v& B: w这样就可以不等待输入直接修改当前日期1 [6 H: P* r" S
5 W/ f' R' x, ^) c/ t B: ?
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*1 |- u0 _3 J1 M' R: X9 H8 Z* B
命令行传递给批处理的参数
$ E. U) s* f: D6 S8 |4 f6 v8 P%0 批处理文件本身2 r% |5 }0 p0 M& H- ~
%1 第一个参数
' y" g& d8 ^$ r%9 第九个参数
% ]) M! D! B( K% ?+ E- o. I4 _" P%* 从第一个参数开始的所有参数5 l! u* G/ p5 B. [- \
批参数(%n)的替代已被增强。您可以使用以下语法:
- F5 P% K; }% M1 i) f%~1 - 删除引号(" ), 扩充 %15 h0 {+ z5 L7 ^9 y& H
%~f1 - 将 %1 扩充到一个完全合格的路径名6 q0 M" b1 J: g
%~d1 - 仅将 %1 扩充到一个驱动器号
3 w$ L2 b2 V1 }% v' D$ `8 X" F%~p1 - 仅将 %1 扩充到一个路径$ F5 ]7 A+ \* r3 ]
%~n1 - 仅将 %1 扩充到一个文件名
+ {1 x8 y$ V6 e6 W! h%~x1 - 仅将 %1 扩充到一个文件扩展名
1 D+ j5 d2 s- ?0 q%~s1 - 扩充的路径指含有短名
* w; x3 d7 K- h! q%~a1 - 将 %1 扩充到文件属性3 f; w/ H" q7 H( F9 C8 G. A% d3 ^# r
%~t1 - 将 %1 扩充到文件的日期/时间9 G7 }) J8 W- ?+ o5 A4 v+ u! Y
%~z1 - 将 %1 扩充到文件的大小# x% O7 G, `# I: B# K1 U& H
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
' w( C% q# f9 c, |扩充到找到的第一个完全合格的名称。如果环境
, Z q* d" g2 z7 }" e2 F变量名未被定义,或者没有找到文件,此组合键会' n. E: _1 X$ w- G" {. z$ X
扩充到空字符串" g7 `6 I( u9 O' N: m' T
可以组合修定符来取得多重结果:
0 S( r a: }8 m/ Y8 S0 T" D%~dp1 - 只将 %1 扩展到驱动器号和路径
: L- d" I" @6 T9 {! r* h, s%~nx1 - 只将 %1 扩展到文件名和扩展名
$ F ^; j0 _' `3 G( X# R0 ]1 t/ @7 D- W%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1," m( q5 z& X& s6 t# D y. @
并扩展到找到的第一个文件的驱动器号和路径。
b( R) R! D' {) i _$ ^%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
1 j* w& U! n- {可以参照 call/? 或 for/? 看出每个参数的含意
" M& I2 j% A9 B5 C7 H4 [echo load "%%1" "%%2">c:test.txt
% Q1 j9 B/ c* o2 P生成的文件内容为 load "%1" "%2"+ x: l" n2 I: h5 [' D- I% Z
批处理文件里,用这个格式把命令行参数输出到文件9 @" e/ Z& B1 U0 V6 x8 f
9 U6 p9 v" Y# _- G! P: _3 @" [29 if1 N3 V# N1 M% u5 ?
判断命令3 E1 o* l! G* y: b7 r$ U! b
if "%1"=="/a" echo 第一个参数是/a* V* w- `0 H0 Z: `
if /i "%1" equ "/a" echo 第一个参数是/a
* S4 x5 c8 a }: H" B/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?( V S) t( A% c' o; F, C
if exist c:test.bat echo 存在c:test.bat文件% s5 K% n7 s: ]6 E
if not exist c:windows (9 n* U G# p2 Y; P1 s0 M
echo 不存在c:windows文件夹
/ z4 m7 Z* n: X& [6 f)
) F. i- R1 l3 b9 v) ~) Vif exist c:test.bat (# {3 c# L0 u9 a
echo 存在c:test.bat- N$ J1 w$ l: _7 R1 B8 k8 ], r5 J/ R
) else (" M H. w$ Z( l; F; y
echo 不存在c:test.bat
0 g+ a9 d6 I. F8 R2 j), U/ L0 x: j7 S* V$ a @) B
30 setlocal 和 endlocal
* H% m; p5 Z5 U W) [设置”命令扩展名”和”延缓环境变量扩充”4 g) f9 B. [. }9 j4 ~
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
( [ n/ Y# Q6 u, sSETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"5 e# g+ p$ v7 j0 w# U
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"0 }( m/ j2 z2 U7 _" h$ ?# Q9 J) Y3 g, y3 P
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"* C( H7 F, c- h9 f# p9 e
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态& l6 d7 h4 f m$ D3 U/ ], Y0 W
“命令扩展名”默认为启用+ S; g' l: x% f- J5 N
“延缓环境变量扩充”默认为停用- P5 ?$ k+ u4 _" c4 z" Q
批处理结束系统会自动恢复默认值
7 h" K. R& {6 X. j7 h& d3 y可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
& Q4 P9 l8 E! i* t0 X序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
; ?. M9 m$ t( h& y保程序能在其它系统上正确运行; T: x+ p6 N! q+ a
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程% m+ N7 n! t% p) _7 @+ |
2 `& k" U* Z2 i: \0 q31 set
0 X3 f7 g8 h& |; R. W8 \设置变量3 x2 u* a' Z* b. `: H: `
引用变量可在变量名前后加 % ,即 %变量名%% d" n% B0 D# h( | i. z7 A
set #显示目前所有可用的变量,包括系统变量和自定义的变量* p/ w& ^$ i. _4 L
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
1 ~' v9 M& B, w0 v8 y4 v/ `0 J9 W5 `set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=19 }2 w) m" [5 A6 q# l0 ` l
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
" U- P/ t, Z7 Mecho %p% #显示变量p代表的字符串,即aa1bb1aa2bb23 M# h% ]: _* i+ ]: P
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb20 p# M% f6 R9 _. {" a
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2
1 d& D0 g( ?2 b- `- J( r) q' |echo %p:~0,3% #显示前3个字符,即aa12 s* M: J0 N; ]
echo %p:~-2% #显示最后面的2个字符,即b2% F: w, V( K# J" `3 {; o0 S
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
1 e. z# B- x' vecho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb25 |2 A2 p' O) L
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
" f2 m' r. _0 {5 E ~" \7 U' Hecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
4 x4 [, Y% T; j7 A! G: I) Y N6 r( e! aset p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb27 `1 x: A1 F8 I- V
set /a p=39 #设置p为数值型变量,值为39
3 h( a5 H# ]5 t, [7 N) ?5 X5 }set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
% H5 X ^ \) t% ]set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用% e7 C2 p3 Z, d# [, B
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?; [' |+ R9 u3 ]
set p= #取消p变量* U6 e7 L1 j! N/ M$ Q* {
set /p p=请输入
! y7 p5 a2 C7 ]4 B6 Q屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
3 B# ]) [0 |& k& r6 _3 j注意这条可以用来取代 choice 命令
3 G, Q$ G2 }* |, h$ N注意变量在 if 和 for 的复合语句里是一次性全部替换的,如: f2 p y7 [, D8 {( F
@echo off U# ~7 i+ x0 A, S: q
set p=aaa
' b* d; p- y* e H$ Cif %p%==aaa (
/ u4 t# n. |7 j1 oecho %p%8 H! [. c7 V* c# j/ D9 ~. g, N
set p=bbb+ k5 Y- b% V" c3 X
echo %p%' {6 I/ d) G. I+ M3 T! b4 P
)
8 C/ M% o. Q* @: X+ p+ {+ S* A结果将显示
# p" N% o7 h8 R" `aaa
) [. k) {. r. S: a x( xaaa _2 h+ }1 Z; s
因为在读取 if 语句时已经将所有 %p% 替换为aaa
6 r$ t$ }3 m: S1 O这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充": U5 r1 N3 `2 z( ]- [
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!) }! ~ s: |2 v% A
@echo off" M( i5 g V+ X; O9 ? d; V
SETLOCAL ENABLEDELAYEDEXPANSION
1 |" d+ w& I( J" x- Kset p=aaa
- l: O$ |0 q- Aif %p%==aaa (1 z- e( y- @' W% d* E( G2 c
echo %p%
* P* W8 ~* U& y' _3 P4 lset p=bbb
- A) o4 D) V1 g$ L2 Yecho !p!
5 m9 ^+ _6 m: |* h)$ y( e D) c2 T" ^
ENDLOCAL
1 C0 E# w. N+ f1 P结果将显示- [% v) S7 I+ q8 u0 L
aaa
! P. O) b; d! a! G# z2 w8 W2 `, gbbb3 j0 C: o$ k* |6 J% c/ x
还有几个动态变量,运行 set 看不到
! N" x6 ^1 i! U1 e. J* D%CD% #代表当前目录的字符串: e6 W- C$ U, _8 W5 z& F0 r
%DATE% #当前日期+ p/ f. n: O4 s6 r: ^, }6 A5 g
%TIME% #当前时间
5 E9 H3 F1 q: R. H' H# S8 H1 P%RANDOM% #随机整数,介于0~32767
. J: n, c. V. z$ t* q* N0 d%ERRORLEVEL% #当前 ERRORLEVEL 值# S3 m( {6 ~) r2 @, [
%CMDEXTVERSION% #当前命令处理器扩展名版本号. x f8 [0 p5 f" F$ K
%CMDCMDLINE% #调用命令处理器的原始命令行8 a/ @9 }4 x: ?9 a3 [
可以用echo命令查看每个变量值,如 echo %time%
, l1 ^% T5 @5 P" P( y- N0 R% E注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
. {4 g0 g! q( s8 O" k( W. w
- V4 q# v' U$ ^5 p32 start
5 E( r |0 i2 \! J+ W4 {/ }& W批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
; ]) v; W) H/ ?* J/ G* Y) w, U
3 O0 u- R, R1 T8 ?- S* e1 q% E+ ]33 call+ A% o: a2 U9 P* _) m4 \! K+ z
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
9 A; B: y9 v5 u$ w有时有的应用程序用start调用出错的,也可以call调用
! {" e. {: d1 ~6 a- P( p" x: U+ w' M0 ?6 F! X5 y
34 choice (外部命令)
c6 s; n! d$ f) L1 s6 K7 Y选择命令
1 G: n+ u' q1 ^1 _4 a4 M4 ?让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……% Z6 d5 G) P7 F
win98里是choice.com4 b0 g7 a5 E6 K/ s. L
win2000pro里没有,可以从win98里拷过来
0 X7 X, i! I3 G. L' Owin2003里是choice.exe8 w f0 H. B* ]$ D# P, ^* K
choice /N /C y /T 5 /D y>nul
5 |, m/ @0 Y9 k( W延时5秒
) `3 G8 V7 N8 m* s+ i5 B
0 }7 S% E/ q' ^. }. @1 r+ [35 assoc 和 ftype: e3 x5 m$ [: j9 e( U; Z
文件关联
' t6 J5 y+ Y6 {% ~4 u* Y( {1 oassoc 设置'文件扩展名'关联,关联到'文件类型'
5 R- E1 ~& z2 u& C+ k1 A6 c1 O5 D$ |ftype 设置'文件类型'关联,关联到'执行程序和参数'5 c2 V1 Y2 b( K* \8 N
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
; G' q) u3 `6 [* [2 d而是先判断.txt属于 txtfile '文件类型'
0 U/ R# U8 a, M% T2 Z2 o再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
& k3 O E- P7 Q) Q8 I! i可以在"文件夹选项"→"文件类型"里修改这2种关联
* G+ ~6 g8 T5 {8 ~4 ]& G7 Vassoc #显示所有'文件扩展名'关联* u* ]$ h& z( ?! q% `1 Q8 ~6 k' ^( p% L
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile- I; d/ S/ B- K' i8 }2 K# D: t
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8/ K9 ?9 t, \7 S! B6 M( g
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile6 n- P. {' c. Z
ftype #显示所有'文件类型'关联
& |3 ~; [1 x+ |( L9 t; wftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*: I4 q% j( ^) I8 C4 q& A, Z
assoc .txt=Word.Document.86 Y( D$ {! y! f$ n, L# P
设置.txt为word类型的文档,可以看到.txt文件的图标都变了
' J5 ^8 O" `& b: Y; Uassoc .txt=txtfile/ ?1 O# ^, u9 |5 |3 A, q# h+ c& M; P
恢复.txt的正确关联# w. |. q$ D6 `- g
ftype exefile="%1" %*
; J5 R; Q4 D6 l4 x* H恢复 exefile 的正确关联- [$ ^+ h0 P1 [% K% d) N0 b
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
" \. o7 J5 z0 _) Y& [ R+ { S: I' W* b5 g
36 pushd 和 popd
$ A9 W* Y5 W8 V: t" ^切换当前目录
: u' q/ z9 @7 F# P7 O@echo off
9 R& r* G, ?, vc: & cd & md mp3 #在 C: 建立 mp3 文件夹
d% D! f0 l9 l5 ?4 \9 g1 h' Hmd d:mp4 #在 D: 建立 mp4 文件夹) J0 z% b; G* T' U' }
cd /d d:mp4 #更改当前目录为 d:mp4
- ]# {0 \! O( t. `pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3, ]7 x% Z1 G* _! X: X. u: U
popd #恢复当前目录为刚才保存的 d:mp4* |1 {- l- {# \6 Q
3 s, h$ z3 U; A+ _3 |
37 for
' ?5 r, c! C6 ?9 J4 U( p% ^循环命令
, _1 B# D; B1 t; w8 h1 D这个比较复杂,请对照 for/? 来看1 @% P( J8 R* L* A) r+ Q
for %%i in (c: d: e: f do echo %%i
7 S: S$ }# w% K: H) _. t4 d依次调用小括号里的每个字符串,执行 do 后面的命令3 r& B, I1 D6 [( N
注意%%i,在批处理中 for 语句调用参数用2个%3 x. g! v! V5 T: A9 g# w- _
默认的字符串分隔符是"空格键","Tab键","回车键"
2 G4 Q6 ~) a6 n8 T/ g& D8 |for %%i in (*.txt) do find "abc" %%i7 d3 ?8 U4 { J3 `
对当前目录里所有的txt文件执行 find 命令; }" V2 o; |% H3 u0 ?
for /r . %%i in (*.txt) do find "abc" %%i
. }% B4 i& |- W' `在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行$ |; ~0 I6 c, L7 |
for /r . %%i in (.) do echo %%~pni
0 F; x, ]# S/ I9 c5 t显示当前目录名和所有子目录名,包括路径,不包括盘符
/ `6 K; R0 R5 ^for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt/ `' {4 [+ X$ v4 ^" A
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去, d, V6 V3 q( E. J/ L
for /l %%i in (2,1,8) do echo %%i" J- Q6 x0 @7 ~8 Q4 H ~' Q) w
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1! ~1 g: o! }+ g; z! I
for /f %%i in ('set') do echo %%i
6 W2 K Y' b7 x' R4 ?5 o对 set 命令的输出结果循环调用,每行一个. G/ q4 g1 [& ^5 j3 F
for /f "eol=P" %%i in ('set') do echo %%i
7 `) D/ u" x/ `/ S+ ?取 set 命令的输出结果,忽略以 P 开头的那几行
; ]$ ]$ S: w- u! _6 }for /f %%i in (d:mp3.txt) do echo %%i- s' J: T- y- p8 ^, u: ?% v
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
- ~! o1 w! C7 O, f* W* Dfor /f "delims=" %%i in (d:mp3.txt) do echo %%i- c2 |/ ^# s, A! z. {* E
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
& o. Z0 ^5 c9 r* G; V) a# O* sfor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a; Y/ F- w) c) k: N! M
对 dir 命令的结果,跳过前面5行,余下的每行取第4列7 G B, M: w2 C. r$ m5 }0 D
每列之间的分隔符为默认的"空格". @8 s* V1 F2 y1 K+ E5 S3 l4 p
可以注意到 dir 命令输出的前5行是没有文件名的+ Q' A& Y8 a& G* U# J6 X$ T) f
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
: V) I! f% x7 B, w \+ m4 Secho %%a- B% I# F) n$ f. l! R7 z3 f
echo %%b- n, g: t, h- u/ D
echo %%c: l G, z9 d) Y/ A
)
: ]! P; b" S6 R对 date /t 的输出结果,每行取1、2、3列
( T# p* G7 s8 X- I第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列( z0 Q$ P& q" G& u5 U) F$ p
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
2 G9 j" G0 l4 x6 G: \8 V6 P其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的9 z- h9 j! G) O; g
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b$ m6 O& b; p* e& B4 R* b
取第2列给 %%a ,其后的列都给 %%b% O7 Y! r+ y4 Z3 d2 H- l) a+ Q
8 m' c! K, y" h& l1 g/ i, ?( O- [9 u
38 subst (外部命令)
8 n5 \9 I3 q$ C! q映射磁盘。
: z; `6 ^7 I6 _: |' l+ zsubst z: serverd #这样输入z:就可以访问serverd了) F' j1 L8 Y' r/ b+ z
subst z: /d #取消该映射
) ^7 x9 D( \- F. V. Qsubst #显示目前所有的映时5 g# w# j: o5 l& U
9 r$ ^' Z: B, K* z Q# o
39 xcopy (外部命令)
6 y' p$ ]; Y% L* Q$ m3 P- Q$ j$ l文件拷贝
( g2 ]# u+ o& c" Yxcopy d:mp3 e:mp3 /s/e/i/y/ \3 l6 q) ~0 E4 m
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
0 q( N, C9 _7 \加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问9 w4 l* w7 j% M2 P) l8 S
1 K( [* O: I4 ?7 @% Z$ ~
常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退( m1 R9 f; K0 \5 L. V7 d
- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:
V7 m w& K1 t* g0 m+ \
4 E& q$ s5 _) q9 I
@echo off
; u+ F' I' Y7 O, X' zset p=aaa
) W# [. v( s; `' @1 F* C1 Cif %p%==aaa (
+ W' @( s7 ^: i5 `0 N U, [echo %p%
$ m0 I6 o5 }1 ?, v3 V( dset p=bbb4 d; S/ m4 ]2 d4 ]$ l7 c2 u
echo %p%
% C; L( {# O8 p; G8 h9 k1 i Z)
$ r- D6 P. d6 [# {pause
1 y D, ]4 F: c1 { |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
|