|
|
发表于 2021-6-25 19:48:12
|
查看: 2321 |
回复: 0
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!
+ P; @4 c0 a2 @8 k5 n 前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效/ V( I; | v$ L! L. X b! {9 h
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展& _+ T" I+ |" X% ]- V3 c
名为bat 目前比较常见 的批处理包含两类: # }2 K/ h" x5 p
- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理) k/ K$ k, j: H9 b
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的3 z1 W" b& `1 N- |' d- w
命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
; E! b: H% U' b4 g& s2 ~ 怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
( u7 Z# y; \7 L8 a+ z& s2 ] 批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set
6 I( Y# C) [2 ^ 批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||; O( |: K5 v$ e* S- ^" K* F
常用DOS命令- 文件夹管理:0 s' H8 z( H- u; F
- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。
! n3 K/ n2 v! _# k! d
- 文件管理:9 I7 E! Z" _# l9 O
- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同
8 q; D q3 r, P. z7 U3 {
- 网络命令:
3 M2 Q- M7 N- @2 N+ R! g8 B- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表5 Q5 K! p" p. C2 c) B; A" c, Z7 l5 `
- 系统管理:( r/ }% ?5 E. F: l* r' J* K# ] o
- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置
' g8 W5 R, {9 H1 M; w+ g
: B( d9 S/ Y( h, y% g% h
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
$ g0 l3 v0 K* E
# J; ~1 J! q4 ^' k* O. \$ eWindows Batch 常用命令, ^/ Z5 } n7 ]5 ` I
1 echo 和 @
) o3 h1 f6 k: q) Z- U. f回显命令
) j0 B. B9 Q, q) g0 {4 p2 c@ #关闭单行回显
7 Q7 D: {1 ~6 F9 Z% A: G9 {7 yecho off #从下一行开始关闭回显
% L: Q4 j _5 F, x$ e@echo off #从本行开始关闭回显。一般批处理第一行都是这个) g% u: N$ k! W/ j/ L+ e9 F0 D
echo on #从下一行开始打开回显
1 H* g# }3 U3 ~4 E c( F. n# |. Wecho #显示当前是 echo off 状态还是 echo on 状态
2 @6 j( A' u, H: [; ]echo. #输出一个”回车换行”,空白行2 m8 k) a" o) s( V+ Y% E
#(同echo, echo; echo+ echo[ echo] echo/ echo)
8 N& |! z4 }) w
. u) W7 S7 ~ R( v& F2 errorlevel) n7 e* U; m, }
echo %errorlevel%
: i; L, n1 e" G; x" d' h4 {每个命令运行结束,可以用这个命令行格式查看返回码2 w9 {7 b3 P, @& i+ @; I% l
默认值为0,一般命令执行出错会设 errorlevel 为1( {/ x. L) l% Z' u- E* {# r6 j
. K' U2 o; H1 D/ S. k. E t+ l
3 dir# D7 a( c; q0 B4 Q, @
显示文件夹内容 L% F; r0 y# z; P6 l
dir #显示当前目录中的文件和子目录
' J {$ B6 I" u6 @; V, Jdir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
+ d7 X9 s; x8 h# J# N* Rdir c: /a:d #显示 C 盘当前目录中的目录/ d6 S" B. u- S/ y3 _0 o+ @
dir c: /a:-d #显示 C 盘根目录中的文件9 G) o7 j/ Q, \' W
dir c: /b/p #/b只显示文件名,/p分页显示
1 v6 H R6 E. }3 t) edir *.exe /s #显示当前目录和子目录里所有的.exe文件
6 B! J& v( p# X# C# V1 t7 C' Z5 O7 a/ W! ^4 x( W5 V* q
4 cd9 [/ c' H" ]! h7 E9 v
切换目录
: {7 r) d# N3 R B4 Bcd #进入根目录
1 b; z. _& T+ }cd #显示当前目录
4 y) S ^* A# T% F! _cd /d d:sdk #可以同时更改盘符和目录2 T$ N% y, k3 K' H5 L
6 Q, o! i# ] n' \+ Z S5 md
6 h) e5 Z7 J/ _, \$ ^, v+ }: V) U创建目录
4 i1 ]$ e) b2 {5 `md d:abc #如果 d:a 不存在,将会自动创建中级目录
" \, ]3 O4 I* F5 \7 c. u* ?#如果命令扩展名被停用,则需要键入 mkdir abc
1 O, O/ p6 e* h( ]+ X- `. Q, q$ P" j! h, L9 v. v
6 rd
& U4 p; h, U/ z- v ?& O删除目录& ?$ K' _1 S8 u. n) \+ @' N
rd abc #删除当前目录里的 abc 子目录,要求为空目录; }$ |3 }4 E7 Y" ^6 Z a9 ?
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
$ w/ W% e/ p0 f& n: @/ W% O
# U( F" K: n' u+ I* T7 del, h) B3 j8 b* Q& H4 T' ?3 W
删除文件
7 `2 S* O" f: Y$ G( [del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
; e) T* b) ^3 ]; y! Gdel /q/a/f d:temp*.*$ l9 M- u3 \/ k" t
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
]/ I: U% Q$ ydel /q/a/f/s d:temp*.*: J; ?8 `7 B R! `
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录. f( Z; i1 K0 n+ ^
+ c/ z5 L5 d3 g; }+ A1 g. U& n
8 ren
$ U, W2 C& z4 m! ]: S1 F# x0 o重命名命令! W. F$ J* L3 P- A0 k
ren d:temp tmp #支持对文件夹的重命名/ C+ i7 h; R# F! I, i$ \ @1 \3 w9 b
$ @* H# n- V8 D
9 cls
6 }/ U5 @* d1 V" A清屏6 u' H8 O0 g- N: }; ]+ N
10 type7 e1 j& d+ P% ]9 s+ }
显示文件内容
- i0 a# X4 U% N+ i& L, Ctype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码$ R1 [) l0 B) s* q
type *.txt #显示当前目录里所有.txt文件的内容3 A- k5 f6 X" V* Y' i
( h. }, }4 y) l- \4 r' F11 copy
6 B7 a/ Z( a$ q- m- R1 g: c拷贝文件2 Z0 j& d+ P9 Z* S4 b- z; ?2 }: f
copy c:test.txt d:test.bak; e' V. B. U0 R# i8 h! r6 b: E
复制 c:test.txt 文件到 d: ,并重命名为 test.bak. d5 n4 o' i+ S5 a
copy con test.txt1 K" k, F& n! g4 ?. x& J+ k
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件- l; l M6 E8 L: i% Z3 H
con代表屏幕,prn代表打印机,nul代表空设备 I6 j8 C" h; z6 l
copy 1.txt + 2.txt 3.txt4 t, }& A! O H' k( m
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件4 p, F5 _- L; g; B0 Y. {
如果不指定 3.txt ,则保存到 1.txt& n' T" t; a% K+ O
copy test.txt +
, Q$ _4 ?2 u3 ~7 `, ~5 M, S/ }复制文件到自己,实际上是修改了文件日期
7 w% A9 ?; q- |: q+ c8 n1 r% E; A m: s4 I& p3 x
12 title9 `& A; c8 U: h" b$ r/ j
设置cmd窗口的标题3 a; q1 F3 G* G: H3 J
title 新标题 #可以看到cmd窗口的标题栏变了
( }6 T+ x0 R) ?( i) @, Q
; \' x" ^" r$ X* i9 u3 s13 ver
- ^- @+ {8 X4 L显示系统版本
- K% U9 s/ m; ^3 p/ }4 a( s: D ?( F6 O! K, C' X. u. x
14 label 和 vol
% e1 M q( ^/ ^3 @设置卷标
4 y) T* x2 x2 Y0 v# p; ?vol #显示卷标
. \2 }9 W% {6 i/ rlabel #显示卷标,同时提示输入新卷标' q+ C' E- I2 C4 d8 P5 j1 Q
label c:system #设置C盘的卷标为 system
7 Q9 n3 P x6 M* E( P' n% Y; d: E. K) o6 J
15 pause" f9 y1 [; t. u1 @, \7 Y2 d7 O
暂停命令* ]# V/ u$ f, \- ^. b6 c$ D# s
2 c) r& D: B) W+ |" Y9 Q V16 rem 和 ::; }, G6 ^: e# _5 n+ j( v
注释命令
3 O% }& D! Z% t注释行不执行操作
4 L7 g7 R* q! t0 X5 U0 L2 N7 `# V3 [$ P4 y
17 date 和 time f7 U& G0 p& i; W8 ~
日期和时间
" t8 Z. B/ @, V$ \+ d1 Sdate #显示当前日期,并提示输入新日期,按"回车"略过输入
: K4 j6 @3 K R8 I2 P+ Ndate/t #只显示当前日期,不提示输入新日期9 g; h3 N2 `- W
time #显示当前时间,并提示输入新时间,按"回车"略过输入
X* |0 s$ j6 U. Stime/t #只显示当前时间,不提示输入新时间
$ p& Q6 E) d' k8 r
3 W. T+ A7 Y3 y" X3 t18 goto 和 :
6 u4 ]9 ]2 L" \跳转命令
3 e( {3 o0 F0 [3 A3 M- i: z9 J; X:label #行首为:表示该行是标签行,标签行不执行操作* A* c3 q+ ~4 X0 }. q
goto label #跳转到指定的标签那一行
R7 E; ]) N3 C% H% ?0 U9 v1 y8 ~& u: G" h
19 find (外部命令)
3 j6 @# | d: J查找命令
7 u( h( V- F& N: mfind "abc" c:test.txt
' ~ m+ q1 t( K5 r在 c:test.txt 文件里查找含 abc 字符串的行+ ^$ j* I% k2 N& P% H
如果找不到,将设 errorlevel 返回码为1
3 S# V# x2 I% F( ^* d4 q. zfind /i “abc” c:test.txt
/ W7 T, N- |8 A U; _& f! z查找含 abc 的行,忽略大小写2 R& \( w# P" x8 _
find /c "abc" c:test.txt4 D" r- d6 i8 {5 @
显示含 abc 的行的行数
* q9 ]1 m! ]& v% f) T
9 o) | x; q- C7 O p20 more (外部命令)
" o0 ?% p, I/ p9 A# c. f( m逐屏显示6 q9 T5 Z- n) Q3 w7 h
more c:test.txt #逐屏显示 c:test.txt 的文件内容0 U& J/ ~, M" p' l) P$ w" P
% }0 A: N; ]$ w( ~) P, w0 o21 tree
4 f4 L2 T+ \) ?* z显示目录结构
5 r1 ?' K3 k6 Z; {+ u4 L) Ktree d: #显示D盘的文件目录结构1 ]" f2 s, i2 M- T6 [
0 Z( v9 q7 W; t0 ]+ s0 v( u3 c
22 &) Z3 m' h+ {- K# k. m6 i& u
顺序执行多条命令,而不管命令是否执行成功
# A7 g- h+ C9 V2 [4 S* \
& t" G9 U+ E+ N* L' c1 n, H: a23 &&
7 P5 {3 m( G6 j% R3 x顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
+ m( ?+ Q) L' p. b/ p+ }find "ok" c:test.txt && echo 成功0 g a E, S6 W: Z
如果找到了"ok"字样,就显示"成功",找不到就不显示: X& q; p' f% X
/ u1 w( c- n1 c9 V6 ^0 j0 O24 ||
" c" k% V$ c7 S& s3 e, q# Q顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
; A9 _9 [' D9 t) f% m4 H( e. C) W3 x3 ofind "ok" c:test.txt || echo 不成功
2 t* ] ~" _) L! {4 A如果找不到"ok"字样,就显示"不成功",找到了就不显示* S6 n2 P* q* h, [ y
7 h2 J7 O/ ]- n4 ~1 V25 |4 m. {' k* N1 ?% d5 N4 H
管道命令
* G; w% b' i% q2 W+ R* Ydir *.* /s/a | find /c ".exe"
7 g; v2 c1 s/ y Q* U4 E管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
$ A* ?. Y7 }: }+ n! w该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
2 `/ I, u3 m' x# S" }type c:test.txt|more! b- _( ]9 v0 k' V% r* w
这个和 more c:test.txt 的效果是一样的
# Z% }0 L( }9 j" q/ K: |$ N6 e8 W- F
26 > 和 >>
! a4 f4 P+ a; C7 O4 T: m输出重定向命令
7 X# ^! Z( s+ g/ A% G> 清除文件中原有的内容后再写入
. N1 _6 N2 K. a5 m>> 追加内容到文件末尾,而不会清除原有的内容8 H! s) d- I/ U' I
主要将本来显示在屏幕上的内容输出到指定文件中
1 w* H6 F/ h" Q6 E- _5 [指定文件如果不存在,则自动生成该文件
. O/ a6 p# s9 T9 |4 _1 Wtype c:test.txt >prn! `% X: F7 l4 |
屏幕上不显示文件内容,转向输出到打印机2 C; S0 @7 h, i; v6 y, s
echo hello world>con
" `) A" r! z% m, d$ U6 F# \2 a在屏幕上显示hello world,实际上所有输出都是默认 >con 的& r( S: F# H& l/ c
copy c:test.txt f: >nul% C) o8 s$ }" _
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
+ Y/ r) D, x7 G Ucopy c:test.txt f: >nul 2>nul
& r2 L7 [( Y M不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
2 e6 H. U/ y) @! Jecho ^^W ^> ^W>c:test.txt" J0 ], h$ G5 N$ P: g
生成的文件内容为 ^W > W+ S) W2 R) W5 A/ ?; |8 e2 `7 {% o; J
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
" w8 {" f+ ]+ @3 e: p. M7 {+ S" Q" z, v) F5 g! K8 h
27 <
. W, N. Y# f+ d# i# h从文件中获得输入信息,而不是从屏幕上
M" I; Y+ A7 e4 i一般用于 date time label 等需要等待输入的命令
' E/ j2 u" D' ?@echo off6 ]; D" \4 X6 x( n0 v! u0 g; y% [
echo 2005-05-01>temp.txt
& i5 }2 S r' h; Q/ h$ I3 fdate <temp.txt! e% M0 ]# d2 i7 E: ?0 y
del temp.txt2 b, g2 t/ p* O0 K8 d9 u
这样就可以不等待输入直接修改当前日期
l/ G( b5 v# N' W6 h' s( ?5 o x# C* o( v8 C \0 c
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
1 J1 u8 O3 Y% g2 q8 N命令行传递给批处理的参数9 p0 P3 H9 R- @/ C
%0 批处理文件本身
/ ]0 Y$ G$ U6 X: C) q%1 第一个参数) ]2 E! b8 W9 z) m' D& l
%9 第九个参数1 h: v# y: N( w5 s1 o: ^
%* 从第一个参数开始的所有参数6 }" l6 j3 O8 z! z" P0 k5 i
批参数(%n)的替代已被增强。您可以使用以下语法:# h0 e! ?7 H6 b' t7 `2 M
%~1 - 删除引号(" ), 扩充 %1
" c$ u+ J, G% j4 T; s%~f1 - 将 %1 扩充到一个完全合格的路径名
& S, q, n( O3 N" [& U. ~0 a%~d1 - 仅将 %1 扩充到一个驱动器号, U: G7 w$ \% o! r; w( D) F& y( R" h
%~p1 - 仅将 %1 扩充到一个路径& P \ h: Y) Y6 T& S
%~n1 - 仅将 %1 扩充到一个文件名
% W* H. k. V' c1 P% d& [%~x1 - 仅将 %1 扩充到一个文件扩展名
. \: U( k9 ^1 r k0 f% n+ j `%~s1 - 扩充的路径指含有短名
" R6 C1 w* F( ^; n& O%~a1 - 将 %1 扩充到文件属性
. P% V! m4 n& E3 T4 o%~t1 - 将 %1 扩充到文件的日期/时间5 g/ P" T6 ]- f+ P5 M4 a
%~z1 - 将 %1 扩充到文件的大小
8 F; T8 y6 T& z! D: H%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
5 T, c' z& @5 h+ W! V扩充到找到的第一个完全合格的名称。如果环境
6 X' \; B& C$ @: }变量名未被定义,或者没有找到文件,此组合键会: P: j$ |' S/ @/ Y+ m# T9 }
扩充到空字符串
# Z. D8 S6 X9 f% x# a. }可以组合修定符来取得多重结果:( w6 Y" ~5 b0 y2 \9 `& d! |7 W
%~dp1 - 只将 %1 扩展到驱动器号和路径
' v% Q# g4 X! [: n. B4 K%~nx1 - 只将 %1 扩展到文件名和扩展名
) p K X ?% f* Z%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
# @" U& ]) s( i6 p! Y3 k8 Y并扩展到找到的第一个文件的驱动器号和路径。
2 h. Y" r; D# E%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
* {* ^. ~; o8 \; s/ z+ y& l( a! j可以参照 call/? 或 for/? 看出每个参数的含意
( ~1 j7 \3 w! ~echo load "%%1" "%%2">c:test.txt
6 {! v! n. F7 i6 e生成的文件内容为 load "%1" "%2"8 z6 o& r" W; @1 C: ~! U7 v r' G
批处理文件里,用这个格式把命令行参数输出到文件
6 G/ J. f3 ~( X2 U
2 f9 |) P$ }; ^6 E! W$ r# d6 F29 if) K! z: z+ R& V. i
判断命令
, l+ e- q9 ^1 ?2 y$ a4 cif "%1"=="/a" echo 第一个参数是/a8 w0 }+ O- X; w' f1 G+ X4 q; \
if /i "%1" equ "/a" echo 第一个参数是/a, t) }! S$ {3 o
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
+ ?2 J+ c. i; V2 B/ V5 x8 S) xif exist c:test.bat echo 存在c:test.bat文件
8 F! |$ L) i0 S0 r6 K: Z8 hif not exist c:windows (1 P: V/ A. Y( M9 n
echo 不存在c:windows文件夹
4 |' e- `5 k2 H0 F4 j)
% c2 u2 i- [2 S( Q; }0 f1 v3 G9 uif exist c:test.bat (0 D8 E2 s" { k# l' ~: _
echo 存在c:test.bat! x" ~! g$ o! K; f$ [ i7 C l
) else (2 |/ h% {; D) P) ^8 J
echo 不存在c:test.bat
! }% v5 S7 R0 a; M)
- \% Q9 N5 j: q4 ^& l30 setlocal 和 endlocal8 s. o: f6 z, I8 r1 t: b
设置”命令扩展名”和”延缓环境变量扩充”
8 [- h+ t+ G6 Y' o T4 zSETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"5 ^- k1 @6 t: K3 X, Z, @
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
* e9 s L1 }' m* w% K9 cSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充". X9 d4 h2 h; j x2 `' U0 C% Q: n
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"9 \2 y7 |- R* Z0 p$ |! G- g
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态5 C$ ]! C; J8 A4 i
“命令扩展名”默认为启用
7 X# c% [; a* c1 b“延缓环境变量扩充”默认为停用( }) F- j$ h& B) F1 \' D
批处理结束系统会自动恢复默认值. d5 n$ v1 C6 v e
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程8 e1 G" d# X, T
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
- @: K( C8 K, Q m9 f0 p保程序能在其它系统上正确运行
5 l, H8 v7 X( J"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程2 l3 \; X6 i0 t0 ~$ ~; L2 T
% {5 W8 z+ \6 D I; W8 Q31 set9 d: ^' N, K) O3 H1 ~
设置变量
0 j6 I- W1 I' h2 i; b) C5 S; K引用变量可在变量名前后加 % ,即 %变量名%0 y) J1 f" I+ z" h
set #显示目前所有可用的变量,包括系统变量和自定义的变量
" T& A) o% ~# m% c8 w; W0 ?* yecho %SystemDrive% #显示系统盘盘符。系统变量可以直接引用+ d1 |3 q( o4 [( y4 I
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1( [ ]* ]2 G0 Q1 Y; Z+ g
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2 B$ b! v4 y1 P: A {- N7 i3 w
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
, m$ R7 S8 A; |/ |! fecho %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
2 |% F9 ]2 x- Decho %p:~6,3% #显示第6个字符以后的3个字符,即aa23 n. t! N& o) o3 N+ K
echo %p:~0,3% #显示前3个字符,即aa1# c9 X- ?9 X; M* g/ I& g x
echo %p:~-2% #显示最后面的2个字符,即b2
+ j7 ^) z+ U s3 f/ aecho %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
4 z- m# ?1 _7 q, `' G+ h4 becho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2% J$ W1 Z6 u' _4 J5 H: q
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2: z, l% ?9 m. Q
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2' n8 P, X6 F3 t: O8 @0 e
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
$ t$ I) \: ]5 p- n) Vset /a p=39 #设置p为数值型变量,值为39
- t. p/ x s; e) e5 `# Rset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
5 p* U0 e% m5 i- P$ u2 Oset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
2 @5 y$ L: E) Gset /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?1 n& o0 S* ~$ s
set p= #取消p变量
( V2 h7 J0 o1 A7 l9 A0 Oset /p p=请输入/ }/ m0 W+ @' f9 m: n! T* ]3 F6 U
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p8 {+ j$ v4 _; V& o; U3 X
注意这条可以用来取代 choice 命令4 B$ P9 G: C8 B5 E
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如; A) n/ C! D" G9 G5 P) B
@echo off
0 d( O- E5 ?, b/ ?2 W- Xset p=aaa
% q) B) Y: B- i: e& L! J+ h+ nif %p%==aaa (( _* V/ K1 c) ~# O5 g9 |3 g
echo %p%* K* w5 L( ]" D) U- @0 j
set p=bbb
! A: H' S/ O o6 I" h' t1 I3 t& }echo %p%+ A% v% r) @% T/ w: l3 d
)* }6 p8 w* ^' y% Q p7 ^
结果将显示3 E+ b/ @! [* Z
aaa5 R0 J" Q1 R# Y' o
aaa
- G4 C1 @; I: C! u因为在读取 if 语句时已经将所有 %p% 替换为aaa& M/ y) y' j) }1 i) T' X
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
1 D4 Z8 U+ ]1 J; }; k可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
7 W/ S# l5 F9 h$ Y@echo off
1 i# u" ~7 H* ?, |SETLOCAL ENABLEDELAYEDEXPANSION
9 p) ~4 f. R' z' _1 d( yset p=aaa& o, j" z- o" a) ^0 B) A
if %p%==aaa (
. D' j( g/ z( n8 [+ K& hecho %p%
0 ~/ P. X) E6 k- Z% d/ Mset p=bbb- X$ q5 V# W; e3 d- B) n9 w9 j% Z* ~
echo !p!
' F: _# x5 V N, u) C. | {' h& @)
D5 T4 J% m' zENDLOCAL! x! x) H8 _, K2 f# L
结果将显示) W9 q, H5 ^# w) ~* B8 P. C
aaa
# F+ k X( V# H/ d# \bbb' @. [2 \# m. u
还有几个动态变量,运行 set 看不到
+ U" F" K0 H6 p5 W( i/ r" w%CD% #代表当前目录的字符串
6 J+ y9 a; a/ l" j2 M- S% {1 O%DATE% #当前日期
1 w, X- [% K. {/ F; m5 B%TIME% #当前时间
& w1 b% g1 C4 z+ y7 g- v. h5 Q Z%RANDOM% #随机整数,介于0~32767
* }5 F1 {2 N/ G& ?8 V%ERRORLEVEL% #当前 ERRORLEVEL 值
- \! O4 L( |) P& @; |& F%CMDEXTVERSION% #当前命令处理器扩展名版本号/ e/ s2 j2 L% I" s
%CMDCMDLINE% #调用命令处理器的原始命令行8 k; n8 ?: E. S
可以用echo命令查看每个变量值,如 echo %time%7 | x0 k4 e8 S$ T+ H: S' T0 b/ h
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
3 H* U, c9 R+ g# b; M& Z4 k6 W
3 K0 [; w: W& z* n) e- w+ q32 start- e% q T( p7 j" J" P$ t* f N
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令- y' O* h4 R! i! h* F$ J" C
! r" ]. l5 n% p4 n O33 call6 K- X- Y( c- `: L# Q
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
: o% J2 a2 Y' H, x有时有的应用程序用start调用出错的,也可以call调用/ y' r8 ~- f. x/ u9 @ c3 E' N; K
0 u# L6 f5 U% o34 choice (外部命令)
, u( U' k; @9 I9 s) e选择命令
( W9 a2 Y& i3 j$ m3 {. \让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
) q, J0 y8 p6 p0 Twin98里是choice.com$ |! `5 K; }$ {9 S+ f% `
win2000pro里没有,可以从win98里拷过来& \) A7 }+ ^0 ]& }( Y7 ?
win2003里是choice.exe3 u/ [9 H, B8 @/ D: H, g, A
choice /N /C y /T 5 /D y>nul
5 p7 `, l) v5 m+ ~5 e延时5秒2 Q& ]$ d, F) B1 o: x( D
# n& j, G/ z& W- J/ H" y/ R
35 assoc 和 ftype& T1 W( ^ e* C
文件关联6 j( R& p( ^8 w
assoc 设置'文件扩展名'关联,关联到'文件类型'
0 F2 F# X7 q) \& E6 P9 f* cftype 设置'文件类型'关联,关联到'执行程序和参数'' R. p1 v V8 M$ g% c" L$ I
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
) c! o! f5 @7 B& z, @" N, e' j% B而是先判断.txt属于 txtfile '文件类型'
2 d1 d8 f$ \; m; ], \5 f; V再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
, d; P, g+ f- [3 `1 P可以在"文件夹选项"→"文件类型"里修改这2种关联
" [% ]. U' l0 R, ]/ U; ~assoc #显示所有'文件扩展名'关联
/ ~( _/ X) I k5 A& Fassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
# x" d( o: i7 ]: ]9 {6 @assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
) N1 i. x6 N. J/ ?7 G. Sassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
9 P+ L- J+ |# I( f P9 s+ gftype #显示所有'文件类型'关联) B9 ]0 Q& |7 p
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
3 K% q+ T1 U( b, S4 u$ Xassoc .txt=Word.Document.8
( J; B$ Y, _+ B7 k' l8 J' i设置.txt为word类型的文档,可以看到.txt文件的图标都变了1 U) w# x! K5 D# S- a' O: G& V% x/ U
assoc .txt=txtfile3 @" _; ^* i. W5 |
恢复.txt的正确关联
8 f5 a! \0 e: Eftype exefile="%1" %*' w& x) X- Y) p
恢复 exefile 的正确关联: c% d) ?% O' I8 L1 p
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
* N1 @& ]2 e" `: _
3 @% ?$ {/ ^2 _2 p; n36 pushd 和 popd# v/ T1 s z3 q x& V/ W
切换当前目录
3 D. G: @2 D E$ |6 {" N- E@echo off" C3 p0 K% w* a5 G7 d; d& {& ]7 f7 t. p
c: & cd & md mp3 #在 C: 建立 mp3 文件夹
3 W; ^9 ?; P" u! o. nmd d:mp4 #在 D: 建立 mp4 文件夹9 B0 R: b. D, _7 b
cd /d d:mp4 #更改当前目录为 d:mp44 X1 y- z3 U* [4 t# d, G+ U
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp34 `3 K1 F W+ E4 q
popd #恢复当前目录为刚才保存的 d:mp4
[* [/ p) l/ _6 U" L
1 M; c% K/ `- |5 z* X37 for: P5 P* n, u' K& r% n6 T, z' G8 T
循环命令 z9 t1 b7 G' A8 y" j
这个比较复杂,请对照 for/? 来看 r! v" j) s1 [ g4 N Z$ C
for %%i in (c: d: e: f do echo %%i
+ s ?* Z6 u3 a0 d) ]依次调用小括号里的每个字符串,执行 do 后面的命令
3 Q4 U0 l3 q$ a: q( J注意%%i,在批处理中 for 语句调用参数用2个%" J" }) U, { ? v5 v! p5 w
默认的字符串分隔符是"空格键","Tab键","回车键"
6 p' s! \: p3 P; a; nfor %%i in (*.txt) do find "abc" %%i1 q0 i) x( M/ C, z
对当前目录里所有的txt文件执行 find 命令
- B% j" n' @ U( k0 ]+ f0 Q* zfor /r . %%i in (*.txt) do find "abc" %%i
_: D3 F' P& v2 G. E& X在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行 b( ]$ [ }% f( x/ B
for /r . %%i in (.) do echo %%~pni
1 _' X; W" [) r- H! e6 X; c5 n& C显示当前目录名和所有子目录名,包括路径,不包括盘符8 Z& I- U V- H1 c6 y# R
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt! l3 i0 m# Y/ r' \9 d
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去: @3 z) U% n" i) Q9 s0 C. E
for /l %%i in (2,1,8) do echo %%i
5 [. z6 Q" ?* Z w. }生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1; i0 A! A4 m. N# `* R) i* V
for /f %%i in ('set') do echo %%i8 y9 \: F/ D0 E% j# h5 i
对 set 命令的输出结果循环调用,每行一个) \' |; w" y: Q
for /f "eol=P" %%i in ('set') do echo %%i
8 c! ~) i9 G: \/ O" G9 ~& W9 J取 set 命令的输出结果,忽略以 P 开头的那几行% k5 D: l2 ]0 p( Z4 }' k$ s& R5 p. Z
for /f %%i in (d:mp3.txt) do echo %%i: h% K3 V# @ R3 j0 f+ P
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
4 ?, x+ g- U3 p ~for /f "delims=" %%i in (d:mp3.txt) do echo %%i
1 B6 B, U3 E! { Y u" Q显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
# l, h" u: U K0 ^: Q2 Bfor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
: H8 ]2 d& A P对 dir 命令的结果,跳过前面5行,余下的每行取第4列3 H U1 K$ m" s/ b; B
每列之间的分隔符为默认的"空格"
* I: N( V. E# y5 V可以注意到 dir 命令输出的前5行是没有文件名的 y- u3 v; }) g3 T) l( ^: v
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
+ G3 X/ {) `1 H6 b) Eecho %%a" f3 r( L: W9 L" E- G" k* q3 k
echo %%b0 w* R! g, ^5 ?9 |8 y9 o+ ]
echo %%c
+ b) E. C2 H5 }9 d+ i% X% `* b)* x' K h. F. x
对 date /t 的输出结果,每行取1、2、3列* }+ {6 j2 y7 [1 W
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
- d7 p' t4 b, X9 H3 K% Q1 J- C, C1 n分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"' H( g7 h" Y# `* K3 O' T6 q3 u. q
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的/ R: r3 E, Q/ S4 c
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
' O! @' a9 u Y取第2列给 %%a ,其后的列都给 %%b& E e* |( K& p# E& ~7 ^& {$ R" k1 G
; v3 r2 k+ u3 i l# _
38 subst (外部命令) `, u* [9 T& t9 x* y- a v
映射磁盘。
- P% h: G" ^. osubst z: serverd #这样输入z:就可以访问serverd了6 b. F7 H" B3 V: u. d
subst z: /d #取消该映射
5 v% v0 F5 ], r; G# n1 Wsubst #显示目前所有的映时
8 N& d6 N w' z9 p: K. g/ b+ v* z( K! r; m/ k( B4 B
39 xcopy (外部命令)4 ^" @% C, y. ?$ x- b3 f0 |
文件拷贝
; B% J: B% x% F2 ]- Excopy d:mp3 e:mp3 /s/e/i/y
4 L2 o2 D$ ?: k; u/ ^0 C. M, T复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
7 G8 l# Y+ j2 G- l加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问) P& a. c3 m/ n/ e0 ?, y$ u5 [% w
! f& e) [1 `9 r3 |- Y
常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
$ g" b' {# x Y# D( T) s- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:$ {1 ?7 C! F( `
0 S, Q8 ]7 x- J N/ o' {& ~
@echo off
6 _6 U+ ~% k$ @, Pset p=aaa% A8 p! z) j8 I7 O0 {
if %p%==aaa (3 e/ Q0 u3 B5 p, s4 c. ^4 U2 ~
echo %p%
% _( k3 n1 _( K6 ^- ?* r1 L1 e% L$ kset p=bbb4 b2 W) `" ], }4 ~, @5 m! [
echo %p%
& {6 @7 L% A" a- E)
, k8 j, ^; S1 Q1 vpause
. `. g% Z' Y" t/ m8 w# L4 w |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
|