|
|
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!& N: D3 p* t; C! \& x7 W
前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效$ d" h" c0 k9 m; t2 V, E
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
6 X0 @2 _6 {' z! Q: x6 s& h8 U名为bat 目前比较常见 的批处理包含两类: - J4 g9 G, @8 l" k" V$ G. D
- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
& `" f9 C4 Z7 g1 w9 F" L, o
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的( U2 ~# v' h* P( y! y6 E
命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
]' n* G. S# b+ K! M 怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出5 _! l, S( u. p7 W' p- F5 p
批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set& p& F# O% J* C# V1 j' ?% r
批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||
! ]0 g( C2 y; M 常用DOS命令- 文件夹管理:
* s: ~! v7 p0 G j# a8 n, M- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。$ J4 d+ i. |0 y
- 文件管理:+ \5 b, l4 u3 w( R1 X6 d: X
- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同
3 }* s7 v4 D+ k/ }$ S
- 网络命令:
~0 S$ h/ q9 ^) p" O- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表
0 M& R/ T1 n$ }" X
- 系统管理:: p& J, d5 A/ B* x! f1 ~/ C; ?! \, m
- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置
3 j: D) ?$ @! m/ G ^ 6 m! u! c/ f( F$ I$ @6 c
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /? ' h/ O; ?* v2 V* R; K
6 L2 Z' ~0 [" v( \Windows Batch 常用命令( h; p$ U1 P" h
1 echo 和 @( L2 [% \) `; f0 n- a9 w9 l
回显命令. N, A# x' y3 s1 A$ D# ?2 o
@ #关闭单行回显
& R, Q3 T( }9 A$ Qecho off #从下一行开始关闭回显* |0 R$ Q+ e! n4 b
@echo off #从本行开始关闭回显。一般批处理第一行都是这个% h% @% @1 o' @ \7 }) E$ c. }
echo on #从下一行开始打开回显
; o: Q& _2 V% L% y6 vecho #显示当前是 echo off 状态还是 echo on 状态
$ ~& ?/ M) P7 J- Oecho. #输出一个”回车换行”,空白行
/ \5 [0 n6 ^* {& X#(同echo, echo; echo+ echo[ echo] echo/ echo)
4 L# m( e3 b( c* `0 U) n8 Y: h
& K S* V" T5 o8 Y! r2 errorlevel
9 Q3 K" n: O1 D! y Recho %errorlevel%
! R2 A+ Q: b! v, |每个命令运行结束,可以用这个命令行格式查看返回码
. [0 t/ t; R/ J; `默认值为0,一般命令执行出错会设 errorlevel 为1! W2 @0 d3 z' K& E/ h% ~
: K* y$ S. {6 t& e
3 dir7 a6 \$ b. w1 ?2 v/ X
显示文件夹内容
" E1 [/ h! M% f& Sdir #显示当前目录中的文件和子目录
( H' P; o7 e8 l( n$ {$ V. Udir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
z* v1 R! u; i! Edir c: /a:d #显示 C 盘当前目录中的目录
0 f, e: l" Y: Y* `" W. Pdir c: /a:-d #显示 C 盘根目录中的文件, ?2 x4 g D. j
dir c: /b/p #/b只显示文件名,/p分页显示! h6 b- \3 J, B
dir *.exe /s #显示当前目录和子目录里所有的.exe文件
1 v) Y$ }% |& I! [7 v1 M
) v0 I1 e+ e, A1 |. {4 cd" s) I9 }1 x2 c: w% w/ B3 Q8 v0 B& e
切换目录% U( m6 V( w( O* y8 s, q
cd #进入根目录8 a4 R) k( F; e# J$ y8 _, d5 r
cd #显示当前目录
4 n9 ?0 b5 K, r- ]- T6 tcd /d d:sdk #可以同时更改盘符和目录
( N2 u3 P; W P5 O& W7 |1 {. N3 J; y7 W; ~
5 md
2 J% r0 ^4 f3 \- k' I) [: M0 ~创建目录
# ?( `6 ^ g- f4 Smd d:abc #如果 d:a 不存在,将会自动创建中级目录& r- ~. I o+ P
#如果命令扩展名被停用,则需要键入 mkdir abc9 s3 v, f: V- o3 @5 v$ S$ v
% M; G/ v! K2 x$ |8 f+ O. {2 X J6 rd W ~0 P; m+ a- a; r* ~5 V
删除目录
0 E5 v1 _2 S6 [+ X! u: I. d# Urd abc #删除当前目录里的 abc 子目录,要求为空目录1 \1 A/ S& J1 @! x0 W
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式9 C: B# w6 m+ u+ a+ i" D% s
5 t2 B/ M+ b7 i! q/ q! V" a/ }) i7 del
$ Y& `+ R4 ^. ~ E6 U4 j0 U删除文件
9 V$ x: _" p, E( }. I2 jdel d:test.txt #删除指定文件,不能是隐藏、系统、只读文件& Q4 S' G" d' U) t& w6 F$ N
del /q/a/f d:temp*.*0 T) _! ^: u* j2 p, e" d
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录1 h" N+ ~5 z' k7 O
del /q/a/f/s d:temp*.*3 o4 W6 [& L1 A3 \$ V8 `# c8 Q% D8 b
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录6 G; y5 E0 ?7 A2 B
, U3 a6 C3 @2 g, `, ~
8 ren
% }% g1 n1 e8 b, o2 f重命名命令
5 R% `( A# t* B) E. yren d:temp tmp #支持对文件夹的重命名
2 O2 ` J N% Q" u Q: Q n4 d
^1 S" E# B+ [9 @% F1 |7 i* i9 cls& f' D$ ^4 i+ b: g+ R# g; e& p y
清屏
+ r" ^/ [) X* I1 L10 type2 n0 ^; }5 q& P* u" `
显示文件内容 d+ u: {- F( S3 Z- y# ?5 B7 n
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
% A# r( |: l9 l( n9 y5 q+ ^type *.txt #显示当前目录里所有.txt文件的内容
( c! o2 B8 [9 v- F R% F; G1 i8 m. u4 \/ C+ O
11 copy
+ s& D8 U) X4 `% G9 ~) b* e/ m拷贝文件
a/ q0 D0 j7 `/ q' i. e }% bcopy c:test.txt d:test.bak
7 ?! B$ J, S5 U3 a复制 c:test.txt 文件到 d: ,并重命名为 test.bak
. h4 Y- ~5 j# [9 n8 n" \9 d/ w: Acopy con test.txt+ A+ N& z3 ^, K: {6 G' k7 ^
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件2 g: U* Y8 N: J
con代表屏幕,prn代表打印机,nul代表空设备8 Y% V' b( f$ b6 K$ R1 A
copy 1.txt + 2.txt 3.txt) @; Q& `6 [) @
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
4 L @( b( W4 H7 N如果不指定 3.txt ,则保存到 1.txt; ]+ }( X+ Y1 u4 k) }8 k/ Q
copy test.txt +8 R- M1 n' W, ` B' z% j
复制文件到自己,实际上是修改了文件日期
& j# v# O# C+ M$ m/ K7 J4 o! G9 W! l# U2 z! a0 o1 `( \
12 title7 z8 h& y3 T7 G: ~. f2 R9 I
设置cmd窗口的标题5 R7 i Q; m6 ]
title 新标题 #可以看到cmd窗口的标题栏变了
P# \0 u$ K- {( E3 W" |& Q5 B
6 @/ {) l+ l P9 _0 f/ Q+ O13 ver
! x3 n8 t: q0 B显示系统版本6 C; w0 j4 @; s8 E x
% j2 f1 G. ?- W0 o9 U14 label 和 vol
7 [5 N [' b8 A) d' S; A9 W设置卷标
- d1 S: g2 g5 v/ kvol #显示卷标3 I9 ?. i, q# L' Y2 |. l8 E
label #显示卷标,同时提示输入新卷标
% R7 X+ L4 m5 s6 ^ l" W* R( ^$ ?label c:system #设置C盘的卷标为 system
; A! f3 \$ [5 s, L4 Y% Z" B
# V8 t8 ^' a" `: b6 o A" j( F15 pause
& |2 Y" O2 L! c暂停命令
: r& V8 d- A6 D2 v( t- C, Y9 T' X- `# P+ I( u: h" R! u# K
16 rem 和 ::2 {2 v( T' O1 E- S+ Y9 u
注释命令
" [' i/ H+ e' [ a) O注释行不执行操作
. F+ z! B# J# o& a: j; U3 e) P+ J- }( H; V( z3 o& O% X( b
17 date 和 time( ?3 o" i% w* j2 I& u7 C: Z
日期和时间
. x0 N B1 @6 Y& x' C' Odate #显示当前日期,并提示输入新日期,按"回车"略过输入
" G5 i6 t5 Z% |% X" Odate/t #只显示当前日期,不提示输入新日期 ?# h( Q- m& M* E) @9 b! T
time #显示当前时间,并提示输入新时间,按"回车"略过输入& O) x$ B- D1 p) L( ^, B
time/t #只显示当前时间,不提示输入新时间
9 Y, H' [- M( a) K/ g" \9 e% H9 j e: l1 e
18 goto 和 :8 V/ H f; g* e+ p7 t3 F9 e, Q
跳转命令
; g) O, o1 p1 c:label #行首为:表示该行是标签行,标签行不执行操作
4 k! [# ?9 M9 w! N7 L. c6 e; Cgoto label #跳转到指定的标签那一行
) W) Q r: V# n9 r! R" W+ {% L* x4 a' J! b1 N
19 find (外部命令)3 W, V `9 a: e2 }
查找命令) g G6 a& V8 e/ ^7 Q) S) `1 F
find "abc" c:test.txt
+ L% [, X( n: E6 M% M8 X在 c:test.txt 文件里查找含 abc 字符串的行! }* x: V. D9 j2 ~# K0 \
如果找不到,将设 errorlevel 返回码为1* ~1 s! Q! D E$ n9 Z. A! _
find /i “abc” c:test.txt
3 Q, A/ U/ i6 M/ f6 @- u查找含 abc 的行,忽略大小写
4 J g# N* Z8 Y9 c' g3 R1 V3 r& jfind /c "abc" c:test.txt5 V& m, F9 P p3 ?& ^( v5 N
显示含 abc 的行的行数3 J1 i$ E6 D# E1 _# S
) n, p0 \0 `" `" c& Z
20 more (外部命令)0 P1 N; c2 L i2 S5 r
逐屏显示
& D1 r* v: w4 Lmore c:test.txt #逐屏显示 c:test.txt 的文件内容4 q0 b" G7 y, s/ h% B
/ E# |3 P3 b% O& J
21 tree. p/ A' H9 ~3 l5 B# [9 b
显示目录结构5 k7 X. N3 M" X5 O( f
tree d: #显示D盘的文件目录结构! H0 H# \+ @, }
* N4 n- x4 z% K# b22 &
( s- l [; d8 L! M: O顺序执行多条命令,而不管命令是否执行成功; ]4 [' o1 q7 A. G* r
, N. b% S3 w" x3 M! c Q1 l8 H23 &&
$ Z- Q+ K, a1 A5 P$ r顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
# a" W) |( {. s9 e! C" Afind "ok" c:test.txt && echo 成功
* W* q! P3 a8 |% J& R$ e# T如果找到了"ok"字样,就显示"成功",找不到就不显示
# Z |" H3 A: z! K7 z4 |3 p' `$ D; H
24 ||2 m2 Y3 d# N- ?
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令6 c. X: K! A* }6 S
find "ok" c:test.txt || echo 不成功' i' e) E/ U9 X7 m! O; R* V
如果找不到"ok"字样,就显示"不成功",找到了就不显示
0 _6 s9 t% f1 S! ~1 A5 C- h2 s- @, f: q
25 |0 F' }* Y# }' p# f
管道命令
* m9 s6 D6 }9 a' k O( r# ndir *.* /s/a | find /c ".exe"
+ s1 Q7 k. Y2 c2 o+ \6 `* W8 _管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令1 n! f1 [1 }/ J+ W" I7 I
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数: f( R0 a- R; c* s$ }
type c:test.txt|more
; g2 L7 E" {, J* y+ M. Q' G这个和 more c:test.txt 的效果是一样的
- R; g8 |$ x# H* v0 c% V5 V1 g( o: b/ w1 m) I0 [# F
26 > 和 >>" k8 [& V. ~* Q2 v# W0 o: f
输出重定向命令 `1 V, f5 Y( l! I' D$ ]! ^ n
> 清除文件中原有的内容后再写入
; x* v8 H% R& s/ e- J+ ]>> 追加内容到文件末尾,而不会清除原有的内容- O% q3 P7 t7 N# c2 C3 y
主要将本来显示在屏幕上的内容输出到指定文件中% ~" _: k: K: b$ [3 z; r
指定文件如果不存在,则自动生成该文件
" y) o* |% o$ t( ktype c:test.txt >prn) i9 X/ }, S9 I/ N* {
屏幕上不显示文件内容,转向输出到打印机
3 {0 ^0 |- h& B, g! b, R$ c/ aecho hello world>con
" [+ s( C3 r; d u L在屏幕上显示hello world,实际上所有输出都是默认 >con 的1 O* A8 |7 H6 H5 c3 d) a) p4 L# y
copy c:test.txt f: >nul- ]/ U' p! Q0 Z# q; K
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
# S3 P9 k0 p, _2 ~& B! xcopy c:test.txt f: >nul 2>nul1 }0 f% g* g$ H2 B* ?
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息+ B* }% U! b3 J& U8 W
echo ^^W ^> ^W>c:test.txt, `* i X% p, X w9 Q3 [
生成的文件内容为 ^W > W. I' d4 v5 b5 x E
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
$ x$ P/ z4 V6 c+ V$ N) `* Q7 {/ z- q: I" R
27 <' D# h0 T& M$ n& u
从文件中获得输入信息,而不是从屏幕上
$ u8 T& ~! p+ m一般用于 date time label 等需要等待输入的命令3 |2 `+ j$ N( }
@echo off
( {, m4 c R1 h6 Necho 2005-05-01>temp.txt
5 W5 R, I0 A: T/ r5 j/ Zdate <temp.txt& Y4 x2 v5 n- H
del temp.txt0 a2 l" g9 a4 [8 e* X
这样就可以不等待输入直接修改当前日期, e" V% U L. j! f
- X+ K2 ^, e7 `0 k2 g$ v
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
9 j R9 [: B# F8 t' c& g命令行传递给批处理的参数+ C$ M2 s) \* m2 E
%0 批处理文件本身- Y+ x! h; F2 z) A, z& \2 B1 K
%1 第一个参数
: ?6 n; d) W2 w, a; O%9 第九个参数/ _/ F) G0 V: |8 \" x% _
%* 从第一个参数开始的所有参数4 `5 ^. p! P- A
批参数(%n)的替代已被增强。您可以使用以下语法:8 Q3 o1 t$ P$ {1 H( ]
%~1 - 删除引号(" ), 扩充 %1
5 f2 g5 y9 z# M2 o3 d6 I8 {%~f1 - 将 %1 扩充到一个完全合格的路径名
8 l' A( u x$ b+ P) U%~d1 - 仅将 %1 扩充到一个驱动器号
" B' {, d0 |4 p: ~( \6 w%~p1 - 仅将 %1 扩充到一个路径: R! \. `2 z! y# F9 D
%~n1 - 仅将 %1 扩充到一个文件名9 Z# ^6 Y' w, |0 Q; s' u( E4 d ~
%~x1 - 仅将 %1 扩充到一个文件扩展名
6 y1 L6 ]' v5 J%~s1 - 扩充的路径指含有短名
- k3 l: S+ T: |! I%~a1 - 将 %1 扩充到文件属性
) G1 |; D5 j6 W) C%~t1 - 将 %1 扩充到文件的日期/时间6 _; l9 c5 E) ?; ^4 G1 M" M
%~z1 - 将 %1 扩充到文件的大小% Q) N; Y/ z) a7 j
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
; w1 ~& P* R& q3 c扩充到找到的第一个完全合格的名称。如果环境& ?4 S7 C4 n/ W& L5 R1 @
变量名未被定义,或者没有找到文件,此组合键会' W, ?9 L5 N! X( H
扩充到空字符串1 H/ z+ m0 W( e( K! b, s w) l
可以组合修定符来取得多重结果:0 l I+ \$ n" X# g1 {; U
%~dp1 - 只将 %1 扩展到驱动器号和路径
8 G+ s0 x' [( [5 C%~nx1 - 只将 %1 扩展到文件名和扩展名
( Y8 e& U% A7 L1 t5 J%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
! m2 a: p" |$ Y* j+ r4 }. J并扩展到找到的第一个文件的驱动器号和路径。" s" |. C3 p% Q) F I# Y+ m" M
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。* R, f" m6 a$ H8 a
可以参照 call/? 或 for/? 看出每个参数的含意0 P8 e! V7 h: x) S: @( E7 G, z
echo load "%%1" "%%2">c:test.txt8 l% t* F2 T6 O" m/ J; S& Q* i" x
生成的文件内容为 load "%1" "%2"
) c1 z$ h' G0 S1 b- l/ \批处理文件里,用这个格式把命令行参数输出到文件0 H }6 K9 o/ [+ H4 i8 |- {5 X
- C( k; ~7 \- K* M8 O
29 if& ~3 u6 F1 a! d1 \5 c2 F
判断命令
* ]9 l; H- g/ l& mif "%1"=="/a" echo 第一个参数是/a# d" {/ n. l/ Y# J* W
if /i "%1" equ "/a" echo 第一个参数是/a
) q; Y' h- g- l1 b7 h2 \/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?( {) S. \8 g$ N! y
if exist c:test.bat echo 存在c:test.bat文件3 J w$ d* Y5 z. W$ ?$ M( p
if not exist c:windows (4 k4 ~# x6 O- s/ {
echo 不存在c:windows文件夹
7 I, g1 K) q3 L, I6 A)& s# ~% A: B7 c, z* A
if exist c:test.bat (
7 q9 Z' Z' ], Fecho 存在c:test.bat
- E5 _. g& t; I. I7 Q0 h& m) else (: A2 o6 q5 x6 o+ C* Q6 a5 A& _
echo 不存在c:test.bat
! e" D/ }; c% I `$ C)
' K) g; k9 s5 x1 \" w0 B4 ~30 setlocal 和 endlocal2 B% U( N! y; U9 r. s! p
设置”命令扩展名”和”延缓环境变量扩充”
) I. E/ w# v! L _& n4 o' YSETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"* S9 A$ ?3 J& J$ m
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"6 R9 a ` t! e$ x \6 e' C
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
0 f+ q7 ^9 `9 t4 o# z; tSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充". B; N' K* ^) }; M! n# p$ Q
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态
9 H- B! O. t& X n) `$ n; ^9 H“命令扩展名”默认为启用4 X2 E) y3 b- z" _2 I7 J+ T* }
“延缓环境变量扩充”默认为停用2 |' f& c$ y7 X- @2 m$ |
批处理结束系统会自动恢复默认值, L# H/ U: P H
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
/ u( \: o4 e# o' O+ ^* o序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确; {1 M$ q% ]2 F
保程序能在其它系统上正确运行
9 f. G9 Z- D. z! `"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
% `4 v1 ]) K9 v; R2 M
1 v% [- l9 n$ [2 ^7 |! q$ D, O31 set
* s8 l0 e. ~( j设置变量
. a9 u6 O% k/ Q9 u引用变量可在变量名前后加 % ,即 %变量名%3 y7 ]- v* q5 q( U% }
set #显示目前所有可用的变量,包括系统变量和自定义的变量
3 a3 M$ e1 t2 \# R2 Kecho %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
3 u% g" z0 {; b/ iset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
& ?) f- h/ M7 p5 s6 kset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2; [( ^6 W) [0 ]$ v6 t$ e
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2( m4 F& r3 ? }0 s. _/ h
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2% X. R6 }% `: Q7 ]7 `6 u& t
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2
3 v; A$ B2 {' necho %p:~0,3% #显示前3个字符,即aa1
- k2 E1 n0 h8 W0 _" lecho %p:~-2% #显示最后面的2个字符,即b20 \- `5 ]( g# r2 i
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
2 h& O% {7 w' jecho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2* \: R o2 T8 g$ A3 W: J; Z
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2 m# D' c& J$ ~* o
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2; a# D( G8 l2 p% d1 s8 d
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
8 y& A9 S$ ], _) ?$ D. Lset /a p=39 #设置p为数值型变量,值为39# \6 B }, a5 C6 y" _
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3, {; ?9 R5 P0 K$ o
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
5 V# m: T, Z; w7 B. zset /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?7 L2 g( l. Y c5 l
set p= #取消p变量1 v% ]: V8 j( Q0 `- ^
set /p p=请输入
* |) w0 t3 ` \屏幕上显示”请输入”,并会将输入的字符串赋值给变量p9 H- `2 C/ |: h
注意这条可以用来取代 choice 命令
5 c! g; Q* }* f+ _: E注意变量在 if 和 for 的复合语句里是一次性全部替换的,如& Q6 T9 t8 g" N! X( {2 B( e
@echo off
9 m4 o- C/ M( o8 `! a& Qset p=aaa
% ~$ S8 d& B: v9 M1 ^if %p%==aaa (
' j* Z8 Z5 E% i M3 t! s6 Z8 Becho %p%! K8 @- v! y I" m
set p=bbb9 S( |* }' X5 @4 w
echo %p%
! a2 \9 B3 w2 I; z$ x7 K)
5 K' U M, D$ Q! O2 ]- o) t$ ^7 F5 |结果将显示# E7 A# f& x P- f( ?+ b
aaa
4 d7 T3 [ c8 R! u9 |9 Taaa
7 K6 U2 S/ I$ K; l: _因为在读取 if 语句时已经将所有 %p% 替换为aaa; w& L0 P- P5 ?4 ]& D# d; M
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"8 f" R: ^* G9 S( L& z; r
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!9 F r" j7 v g- i; I
@echo off
: E [; R! F, e7 V+ ySETLOCAL ENABLEDELAYEDEXPANSION
8 z+ O( Q9 k" n& w" N. Mset p=aaa( |# Z/ Z- c4 w
if %p%==aaa (
9 t; H7 n ]1 x2 Q( x) V7 yecho %p%) ]) l4 ^- E+ F% T9 _
set p=bbb
: S" W) M. s, }echo !p!
$ E4 c' J' g' U$ `1 z2 G6 })1 B; n% Q' s! F9 i4 w+ h, _$ v
ENDLOCAL
" C# ]7 V% n' C C t7 r8 }; h0 L T结果将显示
Q5 F* d/ W5 h' e/ P: Raaa
" |( G$ g0 N2 ?! \# l3 |bbb
( @! e7 m- x: z! a4 W$ V: Q0 l还有几个动态变量,运行 set 看不到: ^# R5 n; o1 b2 W: u
%CD% #代表当前目录的字符串
/ p* n4 [ v- | ^ g3 b, M( u%DATE% #当前日期) }! @# x4 z) `# [$ o, q5 o
%TIME% #当前时间
* [1 e1 @$ x/ ~ d2 S# `2 Y& E+ x%RANDOM% #随机整数,介于0~32767
; G4 @1 p; x" I1 [3 ^7 `%ERRORLEVEL% #当前 ERRORLEVEL 值
) X1 B- Q: \* o# Q%CMDEXTVERSION% #当前命令处理器扩展名版本号
: _# f8 F1 l z c* G7 \& t%CMDCMDLINE% #调用命令处理器的原始命令行
% Z6 z% l$ d8 G. g3 O! h: t可以用echo命令查看每个变量值,如 echo %time%
* C" `, O% U$ J) O, P; v3 [注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到+ Y/ G, i+ c9 ~! P0 d& F
' @3 N a1 e, n$ O" ^0 n1 K- D
32 start
& P( B, j& {$ b8 H& `6 X; ~批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
/ s% |( Q- S6 [
9 E1 U/ p9 F9 E33 call, @/ B& t# M& q; P: i7 w8 S* ?
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行0 b& G2 L2 C9 t- t8 r& t9 O- {
有时有的应用程序用start调用出错的,也可以call调用& }4 c" ?4 b) ?5 o
/ f$ \, B; u( z
34 choice (外部命令)$ h g( T2 X7 _( K& v% P
选择命令# c, C7 E+ Y+ q
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……/ V' h4 a7 o+ V
win98里是choice.com
( n! K, F3 R' k. }( f0 Gwin2000pro里没有,可以从win98里拷过来: T# P [9 c2 T
win2003里是choice.exe
; Y1 q* e2 }1 A8 B2 ~8 zchoice /N /C y /T 5 /D y>nul3 ^# m4 P- D; P) t+ Z
延时5秒$ x4 { J2 L# K7 c
7 d7 w+ l+ V# d" z
35 assoc 和 ftype" i1 P6 {0 @+ m. L
文件关联! q% S8 i. ~0 G1 z/ @" Z
assoc 设置'文件扩展名'关联,关联到'文件类型'& r( v2 ~! B, S
ftype 设置'文件类型'关联,关联到'执行程序和参数'
0 \7 E/ o6 @3 A/ C0 e: Z' E当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
2 ~: [ a, p" \+ y而是先判断.txt属于 txtfile '文件类型') |0 U% K# M1 i: N* ~
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1; X4 E9 U7 j M, M
可以在"文件夹选项"→"文件类型"里修改这2种关联. l; j" ^0 g1 H
assoc #显示所有'文件扩展名'关联
3 j/ r# D. u# |* O8 A) W {assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile7 M2 D% O+ G( |7 }( [4 c/ ]( v
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8; w2 e6 H2 S% w' v# ^) z1 Q0 ?+ d) J, k
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile- h) X( H, h* d5 X8 |8 o* V, \, v
ftype #显示所有'文件类型'关联
5 r% k: j+ J1 Z- X- X; Zftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*: t+ g. ]% a$ C$ J$ q: i
assoc .txt=Word.Document.8% h8 p$ |5 u- T6 d! }) E
设置.txt为word类型的文档,可以看到.txt文件的图标都变了
6 Y# F% j+ m- U) Z) T; hassoc .txt=txtfile
% w# `5 ], L+ L1 r; K恢复.txt的正确关联7 e5 p! J2 j9 ]4 T: `. s+ v
ftype exefile="%1" %*1 Y1 c6 O: M3 ~: j
恢复 exefile 的正确关联
; ^- Z/ u2 v( P) r+ @/ w% n9 d l如果该关联已经被破坏,可以运行 command.com ,再输入这条命令" ^ q, S! s! B$ Q
9 _1 b3 s( w5 s- z' |, ]36 pushd 和 popd
1 y3 q2 C' p5 ^5 Z' M切换当前目录
2 a* D- I4 G+ f( O@echo off
" ^4 x4 C* r9 P4 c) c& Y, vc: & cd & md mp3 #在 C: 建立 mp3 文件夹7 G$ C1 ~4 J/ b; I9 C
md d:mp4 #在 D: 建立 mp4 文件夹
( U% n$ H; N8 mcd /d d:mp4 #更改当前目录为 d:mp4+ Z1 k5 l. {. m$ r# f# }" r" T
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
4 C. p) Y- y* L8 `+ v1 Wpopd #恢复当前目录为刚才保存的 d:mp4
e! Q6 d$ ?+ S
3 n) S! @4 C! U5 R2 X" C- S37 for
: \- d9 i* M8 @循环命令
% ]4 _. G7 ~& T) q( H" n这个比较复杂,请对照 for/? 来看
_8 M4 B: I. @# z/ z4 ]for %%i in (c: d: e: f do echo %%i' k0 E2 V* J+ v* J
依次调用小括号里的每个字符串,执行 do 后面的命令
4 e: h& W0 M" w" }, {, W注意%%i,在批处理中 for 语句调用参数用2个%
" v) |3 v4 F7 ?9 N7 g" h, q( f默认的字符串分隔符是"空格键","Tab键","回车键". x, Q! w: _; D. |7 k: y
for %%i in (*.txt) do find "abc" %%i+ W2 t& B: \7 p4 H6 {9 F9 X. }3 f' b# j
对当前目录里所有的txt文件执行 find 命令
" O' O4 v+ m+ T# ^$ xfor /r . %%i in (*.txt) do find "abc" %%i
1 S' d- {& o" Q, X9 x% w在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
2 ?. U0 x8 W2 k0 ofor /r . %%i in (.) do echo %%~pni& p2 H( ^) N) t5 B; u5 ?* K1 W
显示当前目录名和所有子目录名,包括路径,不包括盘符5 c \- x5 o1 v1 h0 h3 `4 c% q
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt: \& t! F8 l+ e6 b2 X/ `
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
0 { b& w7 O- S# Q7 N3 hfor /l %%i in (2,1,8) do echo %%i& q+ Z& s2 K% L6 }
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
; k& R7 y$ q/ A0 _0 @for /f %%i in ('set') do echo %%i
2 K; G; `) y- s& S! ~& A+ O对 set 命令的输出结果循环调用,每行一个
& m) z0 L9 s5 wfor /f "eol=P" %%i in ('set') do echo %%i) ~8 r9 W7 O5 y) d7 N/ m# E
取 set 命令的输出结果,忽略以 P 开头的那几行
2 c: s% g m3 V4 K+ R: q& bfor /f %%i in (d:mp3.txt) do echo %%i
0 z0 Z/ C+ e8 O显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称' e1 j( z# |5 [& x
for /f "delims=" %%i in (d:mp3.txt) do echo %%i$ _* W( h# d. T
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
. J. G: E) p4 y6 v, m* Ofor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a: f# E/ k) l& F8 g# k, _$ k
对 dir 命令的结果,跳过前面5行,余下的每行取第4列8 k& @; g' b9 S5 m, A
每列之间的分隔符为默认的"空格"% I6 k" s' ?9 g/ c7 r! m
可以注意到 dir 命令输出的前5行是没有文件名的
' s. m5 R5 v( E4 D# }for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (' N9 g& a3 _! d2 d
echo %%a( \" B9 z: e7 Y; T( [, j
echo %%b
% D1 a |+ D; ]( Y4 [% j# s, ^ ]echo %%c
- n, E* G* O- S! U) x! c" `5 |6 T* o0 s
对 date /t 的输出结果,每行取1、2、3列3 ]1 ^/ {7 w- @( L( J+ t# f) s
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
7 ^) I1 g( x' _8 V分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格" ?# v' N; f! Y# i, x) D
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的% j7 s6 m7 t4 y3 o6 N- ?
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b) \1 x, J9 w# i) @2 \" H
取第2列给 %%a ,其后的列都给 %%b
3 f/ D1 _, c$ D
; Y q+ o4 b1 I" m, `38 subst (外部命令)
6 }- B% U1 ?" C9 r1 L% M映射磁盘。
: o! `1 |2 a# Q! h$ G) c: asubst z: serverd #这样输入z:就可以访问serverd了
4 I- r4 U7 p/ i8 K9 ]+ s' Z! jsubst z: /d #取消该映射
6 G. d, U2 g/ t' {: ]& e" u4 F( n0 Tsubst #显示目前所有的映时! d' X7 c: ^! L$ f- G
7 e+ A$ B2 c; e: e
39 xcopy (外部命令)0 c2 `# _$ }; E+ e
文件拷贝
, J9 }" |4 U8 S1 z' x6 g1 y+ Ixcopy d:mp3 e:mp3 /s/e/i/y2 a5 [9 i/ C, q% N, S
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件, h- b" |0 g) F9 V. Z, G! k
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
5 e8 n1 a6 t9 J: ?) c% L
8 j' I. {8 C9 a) o$ Z3 Q* Y常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- K* {8 L! {. B% Y& Y2 ~9 b- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:: j+ f- L* g) E& F
4 r3 Z, T; s8 m4 w- B( A6 g K
@echo off
$ u9 j& z" C/ j. x/ _; |8 _set p=aaa
# ^5 \1 k5 J6 h+ e) ^if %p%==aaa (
0 w+ T6 A" @! o$ J/ Qecho %p%4 k7 ]& q, K" G3 m! o
set p=bbb
& u+ A6 t2 @4 fecho %p%
: Z* v4 r- l( V0 ?)
A; R* E6 T* O3 _2 e$ gpause
3 P( G4 M' p1 {' z: ` |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|