|
|
发表于 2021-6-25 19:48:12
|
查看: 2282 |
回复: 0
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!, X5 X6 Q/ J8 {) E# f7 [! l6 |6 O* j
前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效
# V. y9 V9 L$ T5 d3 c( Q
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
2 Y4 V! z& T) R/ L: T名为bat 目前比较常见 的批处理包含两类: / H0 H2 A& q$ r% \# ^' h
- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理5 s) s& u" i( p/ {4 i5 D
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的1 ^. ~0 [; F. e- f: A
命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件 ; w1 h0 H0 Z8 D& T( L! ?# b( G
怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
2 v8 u2 t8 y* S2 T0 o 批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set
5 u& ^# S1 B5 t/ k2 h 批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||1 ?; L5 [+ ~3 ^/ Z4 X' @! z: e" P
常用DOS命令- 文件夹管理:" ]: Q) \; r7 r; n3 }
- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。
) E$ e- s' f; @ v
- 文件管理:& s, G4 ?9 R) @ a# X7 p
- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同
4 t8 e: I8 `. F- J9 L) z: r
- 网络命令:
$ C4 I: R5 N! ~# \- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表- M, L9 m _/ g$ R, ^! X1 V9 @+ S
- 系统管理:
' b q; A, I8 w- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置9 R, J& x* j O' c6 {: Z
8 o, ]( |5 A( C3 o+ M8 c3 n4 E4 ?
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
8 Q; ]$ A$ S; _( P- w# w, K' a; S; w
Windows Batch 常用命令
- T7 k# `7 p/ X1 S9 g$ k1 T6 s' S1 echo 和 @! y$ b q' [4 l9 f5 M
回显命令4 B) w7 R; d p4 ?' m1 r0 w
@ #关闭单行回显
0 ~% @$ B+ r: |9 O. Becho off #从下一行开始关闭回显- V, ?% \( A1 e( m6 y/ ~
@echo off #从本行开始关闭回显。一般批处理第一行都是这个8 a0 a/ Z0 ^2 `7 z/ Q
echo on #从下一行开始打开回显; r6 M* L4 ^& }6 \
echo #显示当前是 echo off 状态还是 echo on 状态
! K+ d3 P' d( `4 p9 x( Techo. #输出一个”回车换行”,空白行
# }, f# o6 X$ V) j6 r2 n4 O. w z+ `#(同echo, echo; echo+ echo[ echo] echo/ echo)
1 u) e# t/ r: L4 L" ]1 ^
! t8 a# s/ z( f6 L! J0 m1 B- u2 errorlevel
, @. J( F1 q6 I, y& _; Necho %errorlevel%$ w3 J9 [9 q, o9 Q: y. z
每个命令运行结束,可以用这个命令行格式查看返回码
; q$ X0 W' y- X! E& e) F" t默认值为0,一般命令执行出错会设 errorlevel 为1- \) n0 J. v7 ^3 `0 V1 p4 h+ R
. p$ l3 B% K" Q) Z1 }8 [7 ~
3 dir
, H/ I6 l# v, M3 R显示文件夹内容& P X/ P( `" h: z* ^
dir #显示当前目录中的文件和子目录
! V2 d& [6 l" E& Z0 i2 }dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
9 O4 p# ]( ]* |2 R" rdir c: /a:d #显示 C 盘当前目录中的目录
7 Z+ o3 {" ~ C: ydir c: /a:-d #显示 C 盘根目录中的文件
9 \5 \+ ? b* mdir c: /b/p #/b只显示文件名,/p分页显示: [; T P" U' g& T. H: x% {5 g
dir *.exe /s #显示当前目录和子目录里所有的.exe文件6 e) t4 X7 I1 f7 P
. J) }8 n2 S* J# H; S/ ?. t4 cd `& { b; o% \2 d3 k+ E; U, g
切换目录' D, y4 |: R v: F% T: \9 @; m
cd #进入根目录
7 _% N9 f2 y8 d3 gcd #显示当前目录! F+ j7 M# ^% {6 ]" W3 e- m' N
cd /d d:sdk #可以同时更改盘符和目录
- X$ {, T+ u9 e6 o/ N U" ^# A+ r# ?
6 Q d( r0 }5 B5 f; t- V5 md6 Y w- K0 w, y5 T
创建目录
2 r! X+ a$ X2 Dmd d:abc #如果 d:a 不存在,将会自动创建中级目录
5 _$ G( ~$ y& b+ c4 b' r# e#如果命令扩展名被停用,则需要键入 mkdir abc
/ d5 H" ~) ~: U. \ `$ }, |% _5 ~5 O" l6 E+ r* R
6 rd2 M$ q4 o) c/ {0 d: B
删除目录
. U. q, C( |! ~, l9 k* `* d; Ird abc #删除当前目录里的 abc 子目录,要求为空目录% ~4 j7 |4 F7 ?' w8 f8 u. Y
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式- _! ]" D2 l4 r+ O; D3 E
" Y( g d' W) [- ?. w
7 del' A' K3 ~( Z p8 M0 H
删除文件# d e* T: P3 C/ Y8 j5 |
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
, ?$ m6 o' f# ?del /q/a/f d:temp*.*
) D+ a1 c' q2 q! d6 d8 R6 {8 |: u删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
' ~3 k% }- V' Hdel /q/a/f/s d:temp*.*
; K. q& L) F6 l* L' I删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
6 b O' b3 C/ ~, W& U8 S
- U2 U; @- b. w$ F, o, E8 ren
0 H+ W+ T; ^" M) x) S5 _9 t. T重命名命令: D* X6 V" e; p
ren d:temp tmp #支持对文件夹的重命名/ ?% {4 r& I- |6 P
5 k8 u, v0 n% ~( }8 H9 cls
7 |. ?( k4 O) m$ O清屏0 D. H4 f$ R2 H/ S- T& Z
10 type
7 D& T1 n) {2 v& j显示文件内容0 \. |9 g. G- u' X, C( t& d
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码9 Q1 _/ ]5 C4 H+ o
type *.txt #显示当前目录里所有.txt文件的内容& n3 U$ J2 \: d! @7 F* k
0 c' n7 @1 y$ |3 A2 \11 copy8 k. f1 Y, t1 }, e; E- v
拷贝文件
7 \6 @7 x5 U* g0 Wcopy c:test.txt d:test.bak% v+ Z. V" z( N5 W* U
复制 c:test.txt 文件到 d: ,并重命名为 test.bak6 N b+ d! M% t% u; u& F6 l) W! c
copy con test.txt7 @( w- H2 e4 \& D+ t" I! I" V2 {
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件& v b M8 ?* F6 E
con代表屏幕,prn代表打印机,nul代表空设备
' I+ D& X! ?8 k( [" ecopy 1.txt + 2.txt 3.txt3 f: B/ _6 w4 R8 V4 k
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件+ h" K1 T J9 v# ]! T
如果不指定 3.txt ,则保存到 1.txt- p$ l* x3 J9 f& M
copy test.txt +- _) q( H3 S' v
复制文件到自己,实际上是修改了文件日期; Z1 @7 p6 _3 G% L
- ^" [- Z1 b6 T* k& `$ ~
12 title3 ~9 I0 M7 D+ H0 C/ W9 T+ z! k
设置cmd窗口的标题
6 I8 ~: B5 ?6 O$ Mtitle 新标题 #可以看到cmd窗口的标题栏变了
: L) h! g3 Y' g" F& g. p( J
6 S: v8 k f. Y) b& `13 ver
* d6 v1 l0 U, a显示系统版本) o+ C" I# e7 Q
; Y. ^1 C" [( S. h( @4 `
14 label 和 vol
5 ]6 `) |0 {- u8 ?设置卷标' @+ m- j L; V; n9 P
vol #显示卷标2 F/ ~7 q2 k8 y- O
label #显示卷标,同时提示输入新卷标
& `8 g) ]9 @: ^1 V/ G( R4 o- zlabel c:system #设置C盘的卷标为 system9 @# A# l' t7 @+ y% r- }
% i5 H: U; d& F% N* r15 pause% Y8 A4 M: ?& v! N, d, Z
暂停命令
( i* y$ V: _' ], Z7 ?
! \1 r% e% `* \6 A1 A6 r16 rem 和 ::
" f+ e: M# d, m( b& c注释命令) L# E& \; B3 b& g. ] O
注释行不执行操作
: X) \* e0 Z. \2 S( a4 j0 P
/ T/ z$ C0 s9 }8 w17 date 和 time
, T6 |' b6 w: [9 Q日期和时间) z1 J& l# _1 j; i, |
date #显示当前日期,并提示输入新日期,按"回车"略过输入
' W1 K( F( I* ^* j6 Xdate/t #只显示当前日期,不提示输入新日期
& z! t5 X% t! Atime #显示当前时间,并提示输入新时间,按"回车"略过输入3 _7 ~: N' ^- H0 v; @- ]5 T
time/t #只显示当前时间,不提示输入新时间, K6 H* D/ M1 h0 h
7 a7 d2 B F% g& I18 goto 和 :! {% T( u/ E, b
跳转命令+ y) Z8 Y& U3 K1 e9 r& A
:label #行首为:表示该行是标签行,标签行不执行操作8 w# y- k" ^7 L3 s1 [1 D ?/ d' t
goto label #跳转到指定的标签那一行
$ n |5 Z! y8 W0 r3 S8 i$ L- p
: ?$ z9 l/ `; n* U19 find (外部命令)
0 I$ O6 z/ T' |) I查找命令/ H/ T! b3 Q+ g; o, y1 |
find "abc" c:test.txt C0 K2 N% p- \. b2 q
在 c:test.txt 文件里查找含 abc 字符串的行$ K, Q8 V# _+ D6 Y3 d" S. n q) u
如果找不到,将设 errorlevel 返回码为1
& {3 K3 Z( E, gfind /i “abc” c:test.txt- i2 L" v" N# R' T V) x5 p5 N
查找含 abc 的行,忽略大小写8 Z) V' T/ ^- Y
find /c "abc" c:test.txt- k1 t6 @; e$ S' Q8 C0 }7 K0 C, M4 s0 C
显示含 abc 的行的行数6 H& b4 s- r9 Q' V5 g( r9 s
; A {' K- V% [8 k$ X, C( s
20 more (外部命令)) t9 a* t6 k1 W' c7 m
逐屏显示
n5 o( o2 p7 x/ }* r* Nmore c:test.txt #逐屏显示 c:test.txt 的文件内容/ I/ U# o: o- d$ `0 m+ `( N# ~5 F
% k% o% f/ _; h# V5 k8 ~8 v' V
21 tree, X" z5 f2 r1 |
显示目录结构
, R# m; I u8 ^; Xtree d: #显示D盘的文件目录结构
/ d# G0 o4 c8 V6 n: z Q# Z) i2 r
22 &
2 t' K; `5 i( v* V4 c: e顺序执行多条命令,而不管命令是否执行成功$ k6 Q& R( z# |$ q* E7 l
* t5 M' f- V/ `! w! X23 &&
+ c @+ }0 O7 Y6 l4 Y$ v顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令, u- e$ W3 `, |2 I0 E- I [' v
find "ok" c:test.txt && echo 成功$ _2 T! ^" y8 K7 e1 ]
如果找到了"ok"字样,就显示"成功",找不到就不显示- C5 u# o0 J& Q5 A @. D. }! N' {# l
2 D* W& O( u, ]4 g; k, A
24 ||
( t; t8 p; S; o* x5 d( E, S" `顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令+ e6 i: K* g; w
find "ok" c:test.txt || echo 不成功
~, |/ K* ]; ~ w1 Y. _如果找不到"ok"字样,就显示"不成功",找到了就不显示
6 f: _# J5 x8 D7 O) M/ v1 ]: l0 q( x$ a. t1 _- I- [4 [! t
25 |5 J0 ~) @, l3 ?0 x
管道命令
$ Q: d0 @7 `, [4 G. t$ m* Ldir *.* /s/a | find /c ".exe"
8 A7 ~* P" I" W+ J3 i6 o管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令% U$ A0 O/ a& Y/ p
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数$ z, q9 ^9 a5 ?# Z! q5 O. _! U- \
type c:test.txt|more# z4 K0 d/ n/ G B# M, M& d. y
这个和 more c:test.txt 的效果是一样的
|% U% g5 m/ C }1 | t6 Z' T! G9 z" T+ Z0 G t5 U7 v% e
26 > 和 >>
! E, O7 j Y. U/ U输出重定向命令; k; t, Y5 C: w. N h& T
> 清除文件中原有的内容后再写入6 W/ @2 A. v! C. l, p
>> 追加内容到文件末尾,而不会清除原有的内容
" |4 B# o1 l5 Z- S0 p主要将本来显示在屏幕上的内容输出到指定文件中' E! g* j$ H* M: a
指定文件如果不存在,则自动生成该文件
+ X4 J7 E0 [: n; F* Vtype c:test.txt >prn! v" G! V$ c* }
屏幕上不显示文件内容,转向输出到打印机. m# V4 {/ n- e f7 H2 b9 V
echo hello world>con
# M6 e2 x5 W# { X( C: N- d* l在屏幕上显示hello world,实际上所有输出都是默认 >con 的
8 f: g- f& _, F; f0 Hcopy c:test.txt f: >nul9 C7 J" y7 D& e, B q7 U" \: K
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
$ d$ Z7 M3 E+ l- J; [. X- A! @: Mcopy c:test.txt f: >nul 2>nul; s$ ~% x" i' x
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
! d0 I) ^/ g! G+ @% B, pecho ^^W ^> ^W>c:test.txt
$ Z$ C. }( d/ J( X- v生成的文件内容为 ^W > W
7 Z* ?' S/ _! o7 e( Z9 }3 q/ C$ k^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号' n+ `$ B, c" r5 V5 l$ x
i8 n. @; f, \" y( C0 a# f. r
27 <
1 D4 _/ N; K3 u/ _3 r! `6 v从文件中获得输入信息,而不是从屏幕上2 k% ~3 [. r- t- b4 [8 B. z
一般用于 date time label 等需要等待输入的命令: O$ F) d+ w3 l" c* Q* d& {1 O
@echo off7 [/ J) ]: \; E2 ^) G% H5 f
echo 2005-05-01>temp.txt
5 k0 @6 q" g( bdate <temp.txt
1 X# L6 [" z+ m8 w7 m& udel temp.txt
4 i3 C1 Q% R; }' t3 I7 ^这样就可以不等待输入直接修改当前日期. q9 I2 J* G- I& D( `! b6 h% m
" T9 y& R+ d* S
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*9 |/ x! m- v [3 W4 M" v
命令行传递给批处理的参数
- J& t. {0 Q3 }: \/ v% D/ @%0 批处理文件本身
j9 e- |( e. M7 F%1 第一个参数
% e, Y; A4 ^% b! L& G/ F6 A% N; f%9 第九个参数4 X7 Z4 Y( V1 U/ k
%* 从第一个参数开始的所有参数
/ i" j9 j+ ?8 A/ I, K5 d7 ?批参数(%n)的替代已被增强。您可以使用以下语法:% F4 L3 C" ?2 g
%~1 - 删除引号(" ), 扩充 %1
1 l; f* ]* D: p0 v# a! |%~f1 - 将 %1 扩充到一个完全合格的路径名
. p- ^( h$ A4 G: U: ] O6 i6 u%~d1 - 仅将 %1 扩充到一个驱动器号
8 p8 r- ]( k {%~p1 - 仅将 %1 扩充到一个路径8 g1 \: F9 W. F8 b, I! }. c
%~n1 - 仅将 %1 扩充到一个文件名9 u+ A& y1 s! s
%~x1 - 仅将 %1 扩充到一个文件扩展名( K1 |: u2 p P- m6 c: M. p# e9 z
%~s1 - 扩充的路径指含有短名9 y( H0 f; `" p! W: b* \/ | \" O* Q
%~a1 - 将 %1 扩充到文件属性
; \9 g% F5 M0 T, ]; W& ~% z%~t1 - 将 %1 扩充到文件的日期/时间: a' V5 K) O- u) F# C
%~z1 - 将 %1 扩充到文件的大小
) {; l/ s; A: H0 E& C0 @2 p* Y%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %12 w, h Y5 [* E: i6 |8 N4 B& y# u5 V3 [
扩充到找到的第一个完全合格的名称。如果环境9 A% V' [, P2 x3 K. h( l) [
变量名未被定义,或者没有找到文件,此组合键会! h- J3 H' s( \
扩充到空字符串
+ P* `# a* G& w c2 O可以组合修定符来取得多重结果:# Y+ O5 j+ F) s7 r* D% T1 N
%~dp1 - 只将 %1 扩展到驱动器号和路径
5 @, I2 w/ p2 N( G1 S%~nx1 - 只将 %1 扩展到文件名和扩展名8 g: W# i, b& B& o" ?9 W
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,7 D) d7 V" t% q- b% X! b/ F. m
并扩展到找到的第一个文件的驱动器号和路径。; R$ [0 F f* \7 w. y, t+ b) b
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
$ ?& I% m( W' T" m' |/ i. ~8 s) u7 ?0 L可以参照 call/? 或 for/? 看出每个参数的含意1 H, b8 D) `" A; X& ~0 N
echo load "%%1" "%%2">c:test.txt0 w' r/ g( Z/ } `8 h
生成的文件内容为 load "%1" "%2"
7 w4 j; R) r! z" J: O" v5 ]批处理文件里,用这个格式把命令行参数输出到文件 v; Y% d" e t4 ^5 L
0 z E4 J& M; q t- ]6 E29 if3 o, f& ^1 d( {% n* A0 t" V
判断命令! b: ]& u! j9 J' D
if "%1"=="/a" echo 第一个参数是/a
: b C! c( w1 L- {if /i "%1" equ "/a" echo 第一个参数是/a
8 \$ T9 M$ x; k2 @% N/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
9 o6 k8 q2 g: `9 J* x* hif exist c:test.bat echo 存在c:test.bat文件
3 c+ q6 w! Y$ c9 Z" o) Eif not exist c:windows (
; `' h; a5 ?# M' Q8 z. {" c" becho 不存在c:windows文件夹
% _9 k; @5 L6 O)! t6 V6 Z: K. @) H: F# }5 ~& W, d
if exist c:test.bat (
% Y* @: A9 R) y7 l0 Zecho 存在c:test.bat
9 |9 q) F/ ` F3 Q ~) else (
( ?1 R2 |1 e- C; Hecho 不存在c:test.bat- a% w5 ~0 | W, h
). ?4 i1 O) T5 ]) F5 o+ U
30 setlocal 和 endlocal$ s5 @4 n; _5 Q' j; Z! j5 ^
设置”命令扩展名”和”延缓环境变量扩充”
$ S. @& ^, ^% e. X; @; S, _SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"2 |9 b: V0 c3 N; x0 {9 ~
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名", d( S. T( P' K4 M' @
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
$ j( }4 w" O7 z& [, KSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
" L1 ~ |6 F$ j2 wENDLOCAL #恢复到使用SETLOCAL语句以前的状态: Y$ N- c. Q3 ^7 w& P% z: u
“命令扩展名”默认为启用
9 O, `) D/ o) V% t8 o6 H+ D“延缓环境变量扩充”默认为停用
, G( b- p7 L" l/ d# W' ~批处理结束系统会自动恢复默认值
/ a2 ? a$ A; X* N+ @可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
0 t& P/ T3 x! e J序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
& ~7 |! O& `! D/ c; p s# J8 l保程序能在其它系统上正确运行, Y% B: _) H/ B$ ?* [5 S0 P# E, P
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
- s9 d1 v" z2 L& y3 n, J3 J* c% L. c7 j7 V: [
31 set
- B+ I" o6 b. T' r: W2 K* P设置变量
) P: h" M' K/ I8 B5 D+ `7 a$ U8 a引用变量可在变量名前后加 % ,即 %变量名%( x/ H8 B, k8 a6 Q8 ^
set #显示目前所有可用的变量,包括系统变量和自定义的变量- B( B9 z* V* d9 a3 v% Q: ]6 |" [( S
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
% B6 X# f+ ], R$ ~" gset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=16 U$ p( N" L& x& g6 b+ \- h8 q
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
5 m9 O! m6 T& W" s! Oecho %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
# t. b' E. e% Z2 c, p1 c% Eecho %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2$ D/ {) R( i. W, f. G$ W8 ^; m" G5 ]; u
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa20 u, ^" j5 r* A# E
echo %p:~0,3% #显示前3个字符,即aa1
4 O, a+ L$ w# Yecho %p:~-2% #显示最后面的2个字符,即b27 D1 @- I! g& \1 C$ x7 U
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
8 y/ [ r) R# k1 v* F5 s& z4 N; gecho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2# B" u% o, O( u1 }
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2# L& s5 K) b1 @2 G$ G% n- W
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
3 w! B6 j: K/ xset p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2' I3 R& ?; P& O3 X9 s# P, k
set /a p=39 #设置p为数值型变量,值为39
& G3 Q- s# i2 ` d+ {! J2 `# rset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=34 ~6 l" J: |; f; d# e! Y5 g" g: e" a0 O
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用* }. f. A) `; E/ l7 [# N
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
: ?% t3 j, ]; b/ ~/ U; G+ R5 Iset p= #取消p变量! Q" r6 D) Y0 C% \, z8 k
set /p p=请输入1 j* g7 t& R* [0 u
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
- G7 O/ ]6 p2 ? u& Y注意这条可以用来取代 choice 命令
( }% }5 D; P4 F7 K注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
. d* {4 M: S8 E; T$ c8 R! g: Z+ B@echo off9 P% a2 r3 s; P3 g9 R& L. s b7 G
set p=aaa
) G2 O( R$ J4 ~- n. A- e. lif %p%==aaa (0 q+ {. m( M# M0 h9 p! v" _6 R
echo %p%
2 {1 I8 \3 _! @set p=bbb8 N) S6 l4 g9 t# n. C% Z
echo %p%, ~2 I6 u. d) {. ~' Z" |
)
+ Y4 p+ F2 u% E" C结果将显示
& `) i/ m& f% I1 h. H' q4 |aaa) G7 a9 J$ e; k6 h0 }
aaa
/ ]) x. }/ l0 J因为在读取 if 语句时已经将所有 %p% 替换为aaa% s$ _" z: }2 T" g, C$ z( M% r
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"+ F( d) k# m. @
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!* j' M7 e/ f9 D
@echo off
! Z# t( m- Q; x _- H5 S7 q1 FSETLOCAL ENABLEDELAYEDEXPANSION
& R% J- b# V6 o, t7 P& v2 G, Z e5 F5 wset p=aaa" o( }1 o$ K2 B* m8 m
if %p%==aaa (
$ F1 T/ r% a- becho %p%, C( q" V. l' W$ X" A
set p=bbb) a/ q8 v+ X( d. t) N
echo !p!
# i" X8 w" `# ]5 B& w/ j)9 |& |6 k1 B0 A* ~) Z
ENDLOCAL
5 T* H% T; E9 r+ H2 [1 n) s3 W结果将显示
" h- o. f/ @& A7 T6 taaa
) m; `$ k7 R. G& Xbbb5 C/ t5 @4 ^# s8 c, G% T8 O. A% _
还有几个动态变量,运行 set 看不到
% b0 D- _# o# Q+ W%CD% #代表当前目录的字符串# e) g, `' a# W: f
%DATE% #当前日期
" X: [, ?6 b; z1 ^- Z4 o$ [%TIME% #当前时间0 w% k- I' ^9 A3 o' k6 P9 c
%RANDOM% #随机整数,介于0~32767
- j8 l9 u4 q3 L7 p%ERRORLEVEL% #当前 ERRORLEVEL 值
' \% y- H' G! G) B2 H6 L5 X%CMDEXTVERSION% #当前命令处理器扩展名版本号* _7 O3 x9 T/ b K9 x7 k
%CMDCMDLINE% #调用命令处理器的原始命令行; R) _6 P7 N, g6 j* M
可以用echo命令查看每个变量值,如 echo %time%/ [; K$ n- @8 f1 U5 Q' X6 @4 O4 |6 f
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
) A: _6 I |) h- r5 D0 C' P
/ X6 ^0 D- r8 b0 L) r! [# _32 start9 q) [* K" t3 d; S m
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
& J V& m) I9 @. Z" R$ V) \
2 b! c# J9 ]; ?7 G4 A, ?+ k33 call/ j$ Z v x6 R
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行# E# V) \; W% M( r ~8 K/ s
有时有的应用程序用start调用出错的,也可以call调用
$ Z9 g; o0 l$ Q: G P* M+ P
# K: ?: ~/ _7 s9 n( ^" A34 choice (外部命令)
4 M) W1 ^; o( s. Z( }8 F3 H& s3 T2 i选择命令
9 @6 ]4 A" l7 x3 ]让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
, m" L1 _$ H- k) S9 S$ y0 V- gwin98里是choice.com5 T8 ?1 ~5 T' q1 e Q5 f8 w8 {2 Q
win2000pro里没有,可以从win98里拷过来4 t$ e' r$ B( s C) p) j( G
win2003里是choice.exe
: {( D/ M. d2 i0 f8 b# Ychoice /N /C y /T 5 /D y>nul( l- P1 O/ U/ Y u* \$ z4 ^$ d2 {
延时5秒
' w0 v; [# y0 ~' R% q( `- ]
/ B. D0 k( o9 N35 assoc 和 ftype
0 y% ?- A0 ]1 ]& y6 j; H* g: G; \文件关联 H4 t7 u6 D# u/ e4 E( W
assoc 设置'文件扩展名'关联,关联到'文件类型'+ K' k+ l+ L9 w5 @+ Y' ]
ftype 设置'文件类型'关联,关联到'执行程序和参数'
3 ` R* |7 \. C当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开2 [ b. ]! _7 v# s% C
而是先判断.txt属于 txtfile '文件类型'/ ?# E7 f6 u2 F/ ]' b% s8 g) R& `
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
; Z$ A" G0 w2 C/ U4 B; B% p. J可以在"文件夹选项"→"文件类型"里修改这2种关联5 i# \' _7 O" b7 A" e
assoc #显示所有'文件扩展名'关联
+ T. M$ {% l+ Lassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
" B. C9 N5 X( ^assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.89 h0 v/ Z% I7 y) i5 ^0 q
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile2 t1 V: G" B$ Z
ftype #显示所有'文件类型'关联
8 H+ Q7 b {0 yftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
i, `% I v' M- zassoc .txt=Word.Document.8
+ N7 I" i& f- Q' O1 i设置.txt为word类型的文档,可以看到.txt文件的图标都变了9 V# [: }' F+ V2 e/ W, s* ]
assoc .txt=txtfile/ I9 V5 Y n* I3 f3 O- ?
恢复.txt的正确关联
- g0 ?( M4 i, I8 dftype exefile="%1" %*8 U1 y! J- n, X! I
恢复 exefile 的正确关联
0 {, A2 w# X. B x4 t( n5 H6 \% m如果该关联已经被破坏,可以运行 command.com ,再输入这条命令+ T- W u8 y, C! }8 [0 I8 m& X
; e7 [: ]+ ^9 |3 i H
36 pushd 和 popd: z) H" }- o: p8 m7 T5 X
切换当前目录
6 c8 D1 \3 L' _4 g@echo off3 |, I( @& T, O. U8 }
c: & cd & md mp3 #在 C: 建立 mp3 文件夹* ^& ]9 D6 Q/ V7 y
md d:mp4 #在 D: 建立 mp4 文件夹
- Q8 t' Y- F8 I* q' f' n# Fcd /d d:mp4 #更改当前目录为 d:mp4: L6 i; O) o: y v8 d+ ?
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp30 L/ q0 {& \3 f( K. p; W/ b
popd #恢复当前目录为刚才保存的 d:mp4
" A0 C7 S4 M% l, M' }0 T% P3 a( G T i% W( v
37 for- w3 V9 V4 [& M! L1 A A; |& Y
循环命令( `7 x4 w8 H; v2 w) M' m0 s
这个比较复杂,请对照 for/? 来看
% W+ h. L3 J% h# r0 g& Q% q) u; Y7 \for %%i in (c: d: e: f do echo %%i
) ^$ X; g0 _$ [) t) j依次调用小括号里的每个字符串,执行 do 后面的命令; L- x* ^: B8 T2 r& h! K# g
注意%%i,在批处理中 for 语句调用参数用2个%& l$ L& a5 S$ u; D3 ~
默认的字符串分隔符是"空格键","Tab键","回车键"
" O" ^& _" z. d# ffor %%i in (*.txt) do find "abc" %%i9 k9 l$ z& U5 \: [0 P+ U
对当前目录里所有的txt文件执行 find 命令$ t. R( \0 e/ m8 n" @7 w- t. ?8 S
for /r . %%i in (*.txt) do find "abc" %%i
: ^$ ]' G' H& S+ M# z# Y在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
2 z7 @; Q C8 Y- j/ Ufor /r . %%i in (.) do echo %%~pni& I, f* @( @! U y
显示当前目录名和所有子目录名,包括路径,不包括盘符- t: q" D. a* w
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
* A! K B1 f/ a把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
$ J$ ?9 Q; M% x. E+ a1 Xfor /l %%i in (2,1,8) do echo %%i
6 r) d V) r0 K7 Y' {3 @生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
$ j, }% `0 x2 w' jfor /f %%i in ('set') do echo %%i
8 p7 M0 v5 A8 x2 m; P; ^对 set 命令的输出结果循环调用,每行一个
. x* x O( ~) Y4 W$ j: wfor /f "eol=P" %%i in ('set') do echo %%i8 y" \1 |& D5 ~. @7 U
取 set 命令的输出结果,忽略以 P 开头的那几行
5 o9 _( F6 i! R7 u ofor /f %%i in (d:mp3.txt) do echo %%i
& O. T* p/ q, u& E [; |2 `显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称: m7 O! A. u" B/ r
for /f "delims=" %%i in (d:mp3.txt) do echo %%i
. d- _1 n* h% ?/ B F显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
& O% T' U( E0 _# G# Ufor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
) R$ G3 A B) @3 ]3 n对 dir 命令的结果,跳过前面5行,余下的每行取第4列
/ n8 g) w: |4 I每列之间的分隔符为默认的"空格"
" M2 e8 u/ }# g. ]可以注意到 dir 命令输出的前5行是没有文件名的
# B a* E( n& l# Vfor /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
3 {) _, K; o0 O4 Z' Fecho %%a3 }9 `: N) B7 {7 q6 i
echo %%b
, Y0 Z* O4 ?+ y* becho %%c8 Z+ T' c. ]1 p5 E1 M( m6 V" q
), J9 U' q8 @) E1 [ ^& o q9 ^- c& B
对 date /t 的输出结果,每行取1、2、3列' x5 C+ a" j) H( f/ Q% f' M" \
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
4 R6 L+ E" A+ j7 K分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"4 @4 W7 y7 ?0 [
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
% n" U- }: \, P u- yfor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
6 Z* ^2 R" r! R3 x# A& T$ g/ h& c取第2列给 %%a ,其后的列都给 %%b
2 p3 |2 F( ~% z: h8 I$ D
4 M; ^' _# x: P; X$ k: E2 L" G! [38 subst (外部命令)
. f7 p- S8 [; q* Q. k; \9 T映射磁盘。1 E) ~8 P/ i% o
subst z: serverd #这样输入z:就可以访问serverd了
) e- b0 s! {9 L0 `- U% Asubst z: /d #取消该映射4 t0 L b9 j% U/ O7 Y3 W5 B
subst #显示目前所有的映时+ ]# k5 l) D$ n, b8 e) g2 H* D: m
' ^7 U/ p/ t5 N7 T" I7 \+ P39 xcopy (外部命令)9 z/ h. O" l; a
文件拷贝6 z0 S$ w$ N: f. d4 b
xcopy d:mp3 e:mp3 /s/e/i/y0 O. v( o8 n1 f6 ^
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件8 M2 z) p: z+ ?5 n# w2 M4 C
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
! L# E/ I+ g: }$ E7 ]5 Q0 V
. K! \$ L' q! {+ O. u常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退) _- E3 n! I/ N( g& }8 z% a( y8 ~
- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:
) k, d: B9 S+ X% D& i3 k) O4 p. ` 2 E4 y9 }' S; ?& c
@echo off8 D3 W" v; r7 k% b" L- z
set p=aaa
- a$ H' G5 F3 l& @4 iif %p%==aaa (
- [; Q8 a. s5 l, hecho %p%- O9 W" c% }% v5 q7 l( u9 @! n
set p=bbb1 Y. V( Y4 Z4 _; f
echo %p%: v3 u" e; J' `8 Q/ l5 Z
)
' N _) H$ z3 Wpause
8 v# x! \; O7 `- _( j1 B1 Z: C |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
|