|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!
& T/ O) W+ K" g2 P& q$ { 前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效4 r+ ^) _# C# L/ R2 f/ i
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展) [6 D* u$ Q7 i4 P
名为bat 目前比较常见 的批处理包含两类: 6 G8 L8 v9 @8 j* q6 o8 G# V
- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理" g* t, @3 a& [7 Y, I8 F
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
; q" J7 J- l6 e* B. b3 E2 c命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
8 v" U9 ^, X' x% {; H( L 怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出: o: K' ` K) G
批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set
! K; ]" f* \7 w, z! s" C h/ g 批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||" q9 U4 I. x/ C B
常用DOS命令- 文件夹管理:
& m, Q$ J% r, B1 W) m- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。+ B7 F( g7 _, q
- 文件管理:
7 z+ D, s f3 \5 | h+ @/ m- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同
0 L; P1 |2 O, Q" G; K. [
- 网络命令:
* ~1 ~! i) C l, i: {& t }- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表& X+ b( U- }5 u0 g
- 系统管理:9 ]8 B' p& J2 E* P" D" ]4 S0 a; t
- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置
/ Z" V& s/ m, c9 Y + H' {/ k# v2 q% z, m2 W
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
' w$ J6 L8 J& Z" l7 K; l+ {% C( }
* O" S6 F& t$ ]: R2 P% T% o% IWindows Batch 常用命令3 o7 Q) j+ E; k+ Z5 b; m# D
1 echo 和 @
6 U, M+ L- c/ a& i+ o* M回显命令
+ e0 ~$ O$ l' c L@ #关闭单行回显3 t' L! p7 d' ?# |% c! g# g; ^
echo off #从下一行开始关闭回显
) O% H2 w" x( I& Y@echo off #从本行开始关闭回显。一般批处理第一行都是这个
& S" G4 H F* ?2 ^. C* X9 e' Aecho on #从下一行开始打开回显
, \7 }: {; b0 q% x: N, u+ fecho #显示当前是 echo off 状态还是 echo on 状态
2 i! d; C! X' a5 }2 Gecho. #输出一个”回车换行”,空白行
' D& B) K& h. @6 c#(同echo, echo; echo+ echo[ echo] echo/ echo)8 G1 G0 q" u& N4 w4 P
3 z, [ W# _! }% r* Z9 `
2 errorlevel4 \' z0 Y% m4 _- }3 z# A$ M/ q
echo %errorlevel%+ Q( Y8 e% D. u
每个命令运行结束,可以用这个命令行格式查看返回码
* Y8 s, b% V, J5 g8 A& L默认值为0,一般命令执行出错会设 errorlevel 为16 Z) ?3 m. s3 I. u
3 ^2 Q' [- L$ n3 dir
& r) f' G' ^/ i4 R( A, v! j显示文件夹内容
. n8 Q- f1 z4 Q& x7 C1 Wdir #显示当前目录中的文件和子目录
, M. L% Z% T2 }/ ?) \& e9 jdir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件3 r# ^, `2 l3 K, l+ y) X' M
dir c: /a:d #显示 C 盘当前目录中的目录# c f5 L3 ]" W+ V# A/ x
dir c: /a:-d #显示 C 盘根目录中的文件7 Z! O0 ?/ }, O/ L$ q; y P7 I! u
dir c: /b/p #/b只显示文件名,/p分页显示
& p( A: D' u( }% Y5 bdir *.exe /s #显示当前目录和子目录里所有的.exe文件
9 H3 y9 r1 q+ T" e8 H8 G8 R
# p* Q* v" L; p4 cd
( C% ?, T; C! _0 m# y: I$ Q# h1 `/ [切换目录" e3 Y! h5 k6 i) C( u
cd #进入根目录
- g: w& z5 s l* m& N( H \cd #显示当前目录
6 T1 y% U r( \$ a, T' _" L$ h% \- Acd /d d:sdk #可以同时更改盘符和目录0 U$ F# i6 F% j! j/ b
6 v* b3 `' S/ ?8 G5 md
- g8 {4 D3 G8 Y9 N创建目录4 v3 e& q0 G* N6 L9 L
md d:abc #如果 d:a 不存在,将会自动创建中级目录% w2 _3 Z ~! s9 d( j+ C; \
#如果命令扩展名被停用,则需要键入 mkdir abc( v2 ^( s/ P2 S3 J; m3 D6 N! G* m
4 ?2 u& L+ D+ y% \, E% F% ~
6 rd; a" i8 z. S1 I, Z3 ^) T- T
删除目录
! n2 W4 l8 ?1 I* F( krd abc #删除当前目录里的 abc 子目录,要求为空目录
4 R5 x9 T- [" F0 N( Grd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
! \* I( a6 c) n& L
3 v1 P1 @. E& J: f. R9 u7 del, X, z- b$ J2 l8 K* N5 k* g3 p
删除文件8 V; K/ s% r- w3 f& _; g
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件& y1 a& `7 \( }0 [. o
del /q/a/f d:temp*.*
7 J- r x/ d' z0 s9 F0 ~8 T$ }. N8 O4 M, g删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录* K. E; l8 l. @+ ]9 h# V V
del /q/a/f/s d:temp*.*
1 {3 ?7 ]8 m1 A# n2 p& k! ?' o删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
" K) A" M5 w/ ?, z% D. X9 O1 B" ]% Y0 f. h
8 ren5 S: v; @8 t m, E: o
重命名命令
[4 x( x, B, [2 c" @; J( i: f6 Kren d:temp tmp #支持对文件夹的重命名9 k. i5 h: j& O( |
' t/ B: b- q5 `8 ~
9 cls
0 a, ]8 |5 S5 Y8 q+ b清屏
! f# W {- d c) Y2 u10 type
1 v- k% ?2 b1 ~/ [显示文件内容! t) a# _& S* l! X! b$ ~
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码/ a T( M* T7 M. O x, V6 s1 k1 S
type *.txt #显示当前目录里所有.txt文件的内容 a# w. m3 |8 C/ R) p
& l9 _; G! g L- k! ~9 B' @
11 copy
: `3 j! ^: U% t' }+ @1 ?拷贝文件: u# ^5 k! C5 A/ K
copy c:test.txt d:test.bak5 b% q- F/ |& H( J8 L
复制 c:test.txt 文件到 d: ,并重命名为 test.bak
2 J# `% z- n' m5 e1 Mcopy con test.txt, s( W" W* B- x8 X9 W X
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
H' N$ Z. C8 k! tcon代表屏幕,prn代表打印机,nul代表空设备( K0 S: |" s4 q' {) ?1 x
copy 1.txt + 2.txt 3.txt
& l% Y; _0 y w. P1 M. W5 Q# K8 S9 `合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件9 i7 t0 b% G7 Z# d9 r% h! }
如果不指定 3.txt ,则保存到 1.txt
/ R5 n# @% T% Ncopy test.txt +! S% I, d+ {& V% Z* P6 N c0 D2 Q
复制文件到自己,实际上是修改了文件日期! B* K. L# k' l' E, b
$ l7 r: X, m# l3 H/ m# h! D
12 title
/ b3 t$ T/ {4 ^/ k设置cmd窗口的标题: z3 R3 m: x* D+ N
title 新标题 #可以看到cmd窗口的标题栏变了3 B; V! S' p8 [# o# O
0 X- w5 T( t6 ?$ u) Q5 |- g
13 ver7 `9 e2 _- w3 P) V
显示系统版本
9 J( z T1 t* l* K8 C1 A. C" X9 ~" V8 u6 O
14 label 和 vol
) F' M+ v5 F# U$ S设置卷标1 y$ e9 L/ i0 p
vol #显示卷标
5 A& D3 \, L7 m/ l. |label #显示卷标,同时提示输入新卷标: e4 ]6 W1 o1 [$ ^# E* s+ x6 y& c
label c:system #设置C盘的卷标为 system. M1 ]3 u4 T% J, p7 g/ ]" \
/ o0 W# d( b0 o
15 pause
+ @4 Y+ J" n$ F0 S( z. T暂停命令1 Z3 l- q$ p: a+ \! g5 z& o; c) `
) e" e0 r0 B% W. b; f16 rem 和 ::" v- e3 \6 m: _8 h$ y' {
注释命令. Y' i; P2 ]5 T* ~7 Q# l
注释行不执行操作
6 {3 j) n3 I" b3 g# @+ b- p& Z6 ]7 D5 s8 a _7 m
17 date 和 time) x+ G" |: `8 W6 \4 B! j( j
日期和时间/ s! M2 g4 s1 |5 S- w: Z# r! i! E
date #显示当前日期,并提示输入新日期,按"回车"略过输入) H- F7 A F- I; S' U2 v2 t; i3 p d
date/t #只显示当前日期,不提示输入新日期) H% J) O& C) C* }5 m: v
time #显示当前时间,并提示输入新时间,按"回车"略过输入: @6 F% t& c6 H D( l6 j
time/t #只显示当前时间,不提示输入新时间
0 p: z# Q4 M8 d4 i8 i! I2 N2 n1 X( t s# b5 h
18 goto 和 :
9 W( }' J& U7 _跳转命令$ u" l% x4 f& @8 k8 ]9 l* I
:label #行首为:表示该行是标签行,标签行不执行操作) t( X( g/ Q S s ~3 z# z
goto label #跳转到指定的标签那一行
( L1 ?" [+ F- J; a' w6 x* {6 q$ i- w
19 find (外部命令) {5 p: q5 e) Y; c
查找命令5 r5 V( S9 h% }6 L
find "abc" c:test.txt
: Y* {6 ?# b/ O: M* e( ?& `在 c:test.txt 文件里查找含 abc 字符串的行, l; q9 v1 F& f: Y4 w% L
如果找不到,将设 errorlevel 返回码为1
0 f' m9 F4 Y4 I1 _, v' t7 d+ G Ufind /i “abc” c:test.txt
: R# r' X3 f& D o _- X: s8 h. b查找含 abc 的行,忽略大小写
. ~/ b7 f- v& o0 w4 T& u/ Cfind /c "abc" c:test.txt: }- B8 M$ H, H; E
显示含 abc 的行的行数
# u) y4 o( m1 ]% r: E1 c: ]
: c" a6 r: J' |. r# O20 more (外部命令). Y3 F7 F3 B3 U( R* f
逐屏显示
; H7 g: Y) x" p9 emore c:test.txt #逐屏显示 c:test.txt 的文件内容
0 \) E! R! i7 y
0 y0 X( c% S, t- x% M21 tree
+ C7 A. D& }, N显示目录结构
. ~. n8 K: k+ Y4 o: Rtree d: #显示D盘的文件目录结构
9 Z: X' ]( Q( j* Y
8 s: I2 L' ~$ U: N ~1 c4 e9 j22 & C6 k+ W2 g' s5 z, j1 S6 q& o
顺序执行多条命令,而不管命令是否执行成功
- @6 a" \6 D3 |" @2 G4 p7 W9 c6 j
23 &&- O* C0 J& n7 b3 m) v
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
$ N: Q; {+ d2 c, L, Sfind "ok" c:test.txt && echo 成功2 a! n* i3 J4 p3 z4 k
如果找到了"ok"字样,就显示"成功",找不到就不显示
* b: @1 w2 j; t: x# q+ i w& G
; G% F8 m, R# y24 ||
2 Y; k* {8 Z: r8 V, Y, ~/ N% v6 P顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
3 J: c t3 X. y$ i# f% |) afind "ok" c:test.txt || echo 不成功
# e0 J' h' d4 k' B+ @) s6 j4 U如果找不到"ok"字样,就显示"不成功",找到了就不显示
7 f3 B8 w5 C5 c8 x% L# u" x+ `3 l; K
25 |
/ V2 ~9 m. P: P# J- [管道命令6 r% c7 @% [3 R; X5 `: q
dir *.* /s/a | find /c ".exe"
5 V/ x; L- q% L; C管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令 f3 ]" B% \2 T/ w$ [
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
; m: ?$ |9 |4 y4 i3 i5 Ytype c:test.txt|more
8 q0 f3 t2 i5 w% O4 M这个和 more c:test.txt 的效果是一样的
* e6 y, E- s, d9 ]( ]% {# e1 A2 V! j* L6 X" A) N
26 > 和 >>$ p+ z% a, H- B. q. D
输出重定向命令
. ~1 z, \0 r! x- Q# F3 @ d> 清除文件中原有的内容后再写入
- ~6 m; S# q+ a [; O>> 追加内容到文件末尾,而不会清除原有的内容
2 h ^9 a5 H8 j* b, B2 S主要将本来显示在屏幕上的内容输出到指定文件中) {7 w( k, A- d2 n/ K
指定文件如果不存在,则自动生成该文件6 l4 I3 o; Q9 X/ A5 Q
type c:test.txt >prn
u1 Z! U; _. j) p7 x屏幕上不显示文件内容,转向输出到打印机9 i7 Y" ~/ ?$ t# I% R
echo hello world>con' m5 E \( ^ X1 ~1 j0 a! @$ k
在屏幕上显示hello world,实际上所有输出都是默认 >con 的
- D/ ?4 _: z1 N' F4 a5 Lcopy c:test.txt f: >nul' s$ C% @$ v; ^! _! n
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
$ V1 l" \- m8 a+ n1 ^copy c:test.txt f: >nul 2>nul: m! b1 X/ Y$ Q$ P, e
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息9 L( u6 x/ t& G( j$ L5 C
echo ^^W ^> ^W>c:test.txt) l0 i' C. p2 o8 ^5 t0 {
生成的文件内容为 ^W > W p' P6 c8 h6 F* w
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
: ~# t2 c/ c% H
; s+ X; z' O- A27 <
- p; R1 y; \0 V从文件中获得输入信息,而不是从屏幕上
; G- ]& K! h& `+ C1 ]+ j一般用于 date time label 等需要等待输入的命令4 w. T6 y1 X2 _& O/ K# h
@echo off
- h- B! G; [1 W% s3 N* yecho 2005-05-01>temp.txt
O1 |! d/ w9 F8 ?! g8 O( Hdate <temp.txt
3 d5 X$ C8 n7 [% l$ O) t* Edel temp.txt3 A9 K! \; n: Y2 q, K7 g
这样就可以不等待输入直接修改当前日期# q4 @' f. V7 g; _+ R/ R+ L* Q
3 `3 D" R5 Q0 Q% F7 B28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %* ~/ H" X L$ n. q7 k1 t2 R
命令行传递给批处理的参数# N. a c9 @8 P4 T9 B V6 `. O
%0 批处理文件本身
( a5 k7 ^# N9 {: E! m%1 第一个参数2 I9 k+ ^4 K6 W0 y
%9 第九个参数
0 n0 y7 G; t9 N' {0 n1 ]& }" g%* 从第一个参数开始的所有参数
- V5 X% X# G# ]+ E批参数(%n)的替代已被增强。您可以使用以下语法:( P0 q) y3 F# R: {& \* L5 b' n1 o) E
%~1 - 删除引号(" ), 扩充 %1
" r% B5 x& i+ Z1 f; E% _$ n5 V%~f1 - 将 %1 扩充到一个完全合格的路径名2 A* c+ K9 ` Q" M }+ U
%~d1 - 仅将 %1 扩充到一个驱动器号; O# w" R: U) i; `6 Y
%~p1 - 仅将 %1 扩充到一个路径
. I* A p6 P- [ w' h9 H( q%~n1 - 仅将 %1 扩充到一个文件名1 _2 u/ u$ m2 s
%~x1 - 仅将 %1 扩充到一个文件扩展名
4 ?, t, {- {4 Y) Y0 O%~s1 - 扩充的路径指含有短名
7 h# E* P: x0 t4 C1 ~%~a1 - 将 %1 扩充到文件属性* _3 A7 T& ?# x& U1 D o& T
%~t1 - 将 %1 扩充到文件的日期/时间
# G- n* H0 j/ x9 `2 _3 z%~z1 - 将 %1 扩充到文件的大小5 |* M0 E: h* M5 v& t$ |
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1 Q7 p6 \0 b9 S$ D t: U
扩充到找到的第一个完全合格的名称。如果环境
1 {. `# B: S9 ]. F Q" r变量名未被定义,或者没有找到文件,此组合键会
; o1 N, `; ^# s2 {$ X2 h扩充到空字符串
/ j) X) h& Q( ?5 w% f可以组合修定符来取得多重结果:2 E( C0 }+ f5 o4 N. `
%~dp1 - 只将 %1 扩展到驱动器号和路径
6 ]2 g: C. y6 H# t( O%~nx1 - 只将 %1 扩展到文件名和扩展名* B4 e, L: A6 r2 M% i' F: c
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,7 w5 Q+ B) q' I: z) d
并扩展到找到的第一个文件的驱动器号和路径。) j" v4 T+ ]1 {2 `: Q
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
$ M( d7 O! `2 C' k: x$ G4 \可以参照 call/? 或 for/? 看出每个参数的含意
* R3 j" ~* @* K7 C# w7 a! jecho load "%%1" "%%2">c:test.txt# N: A% x) L: ^$ D; E0 \, e% T
生成的文件内容为 load "%1" "%2"3 n* S- ^! \+ |" {
批处理文件里,用这个格式把命令行参数输出到文件
) G `0 W8 P, y/ G8 R7 X2 O8 q- i: C# e2 ^4 \. |. A- |; [
29 if* @" ]6 f/ ]) m5 |. R! k
判断命令4 X z8 V$ e+ r+ {# Q
if "%1"=="/a" echo 第一个参数是/a
! q5 C4 M: N j; tif /i "%1" equ "/a" echo 第一个参数是/a
) ^: e- c; @2 w" z/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
: N3 v. g0 p! h1 `if exist c:test.bat echo 存在c:test.bat文件
4 N" J, n7 b. L4 gif not exist c:windows (
5 o/ Q/ b: G) M( p+ Uecho 不存在c:windows文件夹9 p1 k a. s2 N( z
)
* j0 F" X0 q0 Z: Z% xif exist c:test.bat (' u8 [+ \/ x' X. v+ g
echo 存在c:test.bat
6 G. S! Z. D o3 J) else (- R4 A( o9 _8 C3 }
echo 不存在c:test.bat M/ j. m+ b" ]
), {! `% b1 u+ A5 D
30 setlocal 和 endlocal
1 _! b, H e+ u" \ @: S设置”命令扩展名”和”延缓环境变量扩充”7 {7 J- M+ ~; h* X6 V2 @4 O' Y9 f
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"- i: l- k4 \# l! L# P
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
6 X; ^5 Q0 V0 l9 J) I, z) {9 P+ vSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
( ?' g3 U5 Z; R* X. q6 uSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
3 z8 T$ c: ~( O$ q1 w- QENDLOCAL #恢复到使用SETLOCAL语句以前的状态* S, @! g3 D2 z/ [# C1 H, C
“命令扩展名”默认为启用
4 v. m/ O/ Q' H T# T0 a9 x“延缓环境变量扩充”默认为停用4 o* |; U- [( X1 K' [' m
批处理结束系统会自动恢复默认值7 \: [8 K \9 a1 ?
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程: E( A! n* u9 B% C0 s, s
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确2 R7 O( |% h; P7 G5 I( J
保程序能在其它系统上正确运行
/ X6 R8 L* b+ }; B ^; w% F% I"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
+ D9 H/ F0 N# Z' i4 p. I* z4 o- G' f+ K# P) x" A& D1 k
31 set
9 N5 A, h9 k1 N0 `$ V. Z设置变量
; O9 j/ Z' P/ ~3 S% d" P$ p引用变量可在变量名前后加 % ,即 %变量名%+ m. z/ K3 r% s, i; E* [9 [
set #显示目前所有可用的变量,包括系统变量和自定义的变量4 Y+ P6 x" P w3 p7 w
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用" j1 H0 O1 c* L6 w
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
9 f3 b- t* d n& v: jset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
- f. Z2 c6 R' g' P }# r7 V$ I" o ?echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2 e/ ~ v$ O7 B+ {
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
2 r& `" Y1 F4 u7 ~% n% Oecho %p:~6,3% #显示第6个字符以后的3个字符,即aa2
- y, E; K, p0 G! _) F" Xecho %p:~0,3% #显示前3个字符,即aa16 r+ t, X+ c+ k; N- i8 t* g- I
echo %p:~-2% #显示最后面的2个字符,即b2
3 [, V I( [3 @3 yecho %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b% p/ Z: R4 y S; z' z, ~
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb29 d% n- {" ^2 k" d: y
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2 E, A1 e I; h
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2. N2 ~1 p' t/ s0 T2 s
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
# N. _' T5 V9 D+ q7 s7 @set /a p=39 #设置p为数值型变量,值为39 c6 I; R* d( i" ~
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
) J! s" @1 P4 `set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
4 S- `; G/ W% a6 k; @; Kset /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?( c8 H( j+ }1 j2 d+ }9 l: |# ~) y
set p= #取消p变量2 ^3 y' x9 _0 v* f3 c! `( x, C2 [
set /p p=请输入
1 i+ {1 g% m' S& R屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
/ s7 |+ J) K( j: n! C3 w8 E注意这条可以用来取代 choice 命令
0 s) g9 U( k0 u! u6 @ X注意变量在 if 和 for 的复合语句里是一次性全部替换的,如* ?$ d2 t* C5 y2 {* ~
@echo off3 Y1 X6 Y7 _) z* ?5 {& N
set p=aaa
# O$ T' X0 i# r0 P4 w2 m% Xif %p%==aaa (
6 c! x! o8 {' G' [$ y: Wecho %p%, c: u( @- g9 O" X! d8 Y$ n, T
set p=bbb+ H# T0 H4 P. }7 r
echo %p%2 z4 h$ R/ I* b
)
# O+ `# b0 z4 a5 J# R; R( l% ]: P8 R结果将显示
' d. c) }7 [! waaa$ v, L9 a! R7 q0 B# F
aaa
' r/ a- G" h( O U* w& l因为在读取 if 语句时已经将所有 %p% 替换为aaa* Z5 S i V2 l- m& M3 w+ \6 O2 f
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充". t/ ` T3 f# q! U5 ^; R* Z
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!3 N ~$ p p. D, O b3 F
@echo off
5 V$ A6 u) m% x0 x; o# W% S# Z9 @SETLOCAL ENABLEDELAYEDEXPANSION
0 d7 Z4 @, u+ K( C P" J8 tset p=aaa7 w6 O- L7 c p) A
if %p%==aaa (+ P0 x/ c# ~. ?* M
echo %p%. l3 o8 o7 S4 S6 I* q8 ?. ?
set p=bbb
% |9 k _6 D( T% ?% T! U$ C& ]0 Wecho !p!
$ S6 y* k3 x3 I3 Y, P)) o! L$ r8 r4 ~& f4 |
ENDLOCAL
' p* @6 t* B3 E7 h( V5 d结果将显示
% E! Z: @/ c& n' ]aaa
0 ~! i3 L( p7 M5 {, w* K h/ C g3 P. obbb
0 \( R) k. z/ g2 b% y" s! p8 w+ d还有几个动态变量,运行 set 看不到
3 I9 e {7 I- N7 T%CD% #代表当前目录的字符串
5 L$ g0 E5 {" t$ t%DATE% #当前日期
& W7 {) z+ d1 n$ x4 A%TIME% #当前时间
" \' {3 k4 ]5 N# p) |0 G& C' J%RANDOM% #随机整数,介于0~32767- f ~) P' o+ [1 ?2 W: V( q# I
%ERRORLEVEL% #当前 ERRORLEVEL 值' H. R. j0 Q a
%CMDEXTVERSION% #当前命令处理器扩展名版本号2 ^1 _9 H5 q3 N/ E
%CMDCMDLINE% #调用命令处理器的原始命令行" e2 \9 C' T+ u5 [
可以用echo命令查看每个变量值,如 echo %time%5 `+ \% T6 }& w( ?/ k
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
) [. h" e# E& i( |$ s7 Y B9 X& p- w" G* K2 {, g
32 start f2 v* l" V) e/ M6 f/ ^
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令6 W! B- c' n( K1 g! X0 V
; R: X, X1 C, ~' e3 e& D) j5 F
33 call
! c2 g* l y! v2 }4 \批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行 N7 w3 v5 l) \/ i( g6 v
有时有的应用程序用start调用出错的,也可以call调用# h9 c3 X7 G, p) |/ q/ H/ B
6 B# v1 J( N/ Y9 P6 o0 z5 `# e' d34 choice (外部命令)- L8 w$ c% }' h
选择命令
; S, a$ P, N4 R; d4 B( L让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……- H+ j' E; e9 F9 s
win98里是choice.com
8 d5 j5 Z) D9 D8 e& \7 Z% {2 D/ W4 x6 Lwin2000pro里没有,可以从win98里拷过来; _: ]9 ^8 l# I) e! N6 a& d9 H' k! ?
win2003里是choice.exe, O2 d9 B( h% o1 n7 v2 ]1 Y
choice /N /C y /T 5 /D y>nul
5 B9 ~* N2 G5 S8 z延时5秒
: j1 S* Y$ ]6 ?5 Q8 R$ X5 l1 d$ }$ ~8 e0 m9 H4 i
35 assoc 和 ftype+ j0 ]2 \7 C5 X' I, {6 P
文件关联$ {4 Z0 q8 n2 K7 Q# Y: b/ X
assoc 设置'文件扩展名'关联,关联到'文件类型'* ~, a# s2 o8 M! y. L. K# q+ }
ftype 设置'文件类型'关联,关联到'执行程序和参数'
- x% _. `; b" q9 s" i当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
3 G% }0 S ^8 D1 X4 k而是先判断.txt属于 txtfile '文件类型'
$ [" W1 @3 M1 a再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
) p) m# e9 ~2 v: M可以在"文件夹选项"→"文件类型"里修改这2种关联1 d1 S6 _0 h+ [, c
assoc #显示所有'文件扩展名'关联0 q* y v: Y% x' l. I; [; H/ N+ T
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
`' y' C3 t C& X8 w* ^assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
7 x1 w! u5 g0 o4 T! oassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
* w: C( E; W v1 c/ Eftype #显示所有'文件类型'关联
1 j5 [4 l4 j1 x- Wftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
4 x+ D' \6 W }2 q: nassoc .txt=Word.Document.8( W6 B ?1 }$ Q# q
设置.txt为word类型的文档,可以看到.txt文件的图标都变了
& C1 T2 A2 J5 H# passoc .txt=txtfile' Z# I# e0 j6 `0 V! ^+ n2 l
恢复.txt的正确关联/ B. E/ F' d' o" j1 @- B" u
ftype exefile="%1" %*
- \' p! S) z5 `& T% ?( s4 \6 w- O恢复 exefile 的正确关联. w3 i" m- u3 b, b* i" s4 a
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令$ L3 U+ f* {. K. Z* {- i
9 X' C( i4 L, j* Z2 G
36 pushd 和 popd
3 S+ Z$ S6 u, s/ E切换当前目录
+ u( e0 V. n4 ~, I( j@echo off
0 q% }. v- k4 t6 T* x' @c: & cd & md mp3 #在 C: 建立 mp3 文件夹
! U' \+ \6 ~. R' N. P7 vmd d:mp4 #在 D: 建立 mp4 文件夹
6 b3 V, N4 w- f: Fcd /d d:mp4 #更改当前目录为 d:mp4/ I7 K! E* n6 W' B+ X) E7 E. q
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3' j+ F, _& x; s3 F' A
popd #恢复当前目录为刚才保存的 d:mp4
6 }! `8 |6 h/ N5 g7 y0 N& e; O
& g" I/ {; u9 Q- H37 for
( t, G9 m1 _% z3 u循环命令
: }& @" j* E) M7 f* {3 l3 K; {这个比较复杂,请对照 for/? 来看' O) o1 @3 K" e* J9 Y& \- _
for %%i in (c: d: e: f do echo %%i
$ p5 b2 g/ B1 l/ O' G( g依次调用小括号里的每个字符串,执行 do 后面的命令5 T4 A( R1 G1 ^: G) w
注意%%i,在批处理中 for 语句调用参数用2个%! F3 b! M5 \! x# V, K* A K
默认的字符串分隔符是"空格键","Tab键","回车键"
6 E5 |! f1 x! G! p' D' hfor %%i in (*.txt) do find "abc" %%i% |, c. [7 X3 i- `& v, b0 M
对当前目录里所有的txt文件执行 find 命令
( U: ^, W, {, Z! Tfor /r . %%i in (*.txt) do find "abc" %%i
3 x- x4 W) m9 q在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
3 {/ \9 t; y" {, ? X8 {' Nfor /r . %%i in (.) do echo %%~pni7 v* S; A. H' C& W
显示当前目录名和所有子目录名,包括路径,不包括盘符# o1 S, w/ B' Z5 w
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
# A c1 t- S8 D* {; ]/ c. N把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
& x5 A8 g5 _5 u* \6 Vfor /l %%i in (2,1,8) do echo %%i: ^( s$ X4 r) r. F
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1. V5 b* B. @; N! s
for /f %%i in ('set') do echo %%i
/ p; f& H6 B a0 @9 \对 set 命令的输出结果循环调用,每行一个4 Q3 `- \) H+ E8 j
for /f "eol=P" %%i in ('set') do echo %%i
" y$ V2 @. H" Q" x+ u. z, f/ t0 A取 set 命令的输出结果,忽略以 P 开头的那几行. X* m0 K" V( C
for /f %%i in (d:mp3.txt) do echo %%i* m1 X" w: B$ v8 H# L5 d
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
# {3 D8 ~1 q' ^# w" j% a9 zfor /f "delims=" %%i in (d:mp3.txt) do echo %%i6 y* S2 _5 @# |5 t
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称9 b! m7 o1 ^; \. F* i, J4 l" ~
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
) C! } K, \5 c N E/ [对 dir 命令的结果,跳过前面5行,余下的每行取第4列* P3 v# f6 I& U b
每列之间的分隔符为默认的"空格"2 P" e* b1 p q0 L& ]
可以注意到 dir 命令输出的前5行是没有文件名的! [: V4 M; K) i+ @ S+ i1 f
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
" m9 F5 \$ `3 g. zecho %%a
2 Z3 O& E5 d0 v/ F' U) U; G. |- c# Gecho %%b% r3 B6 S# Q$ g5 B7 r. c4 Y. ?: t8 K
echo %%c. z1 X( L/ v8 j) g' W2 q
)/ ? l$ D2 w6 u9 h9 @ R
对 date /t 的输出结果,每行取1、2、3列/ x' F: ~8 g0 `" @3 r) O2 F1 `
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
) ]5 j; m" z! `分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
" F; {/ x' k! h2 U: t其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的/ |3 `1 h, w6 h+ X+ W
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b& r1 B+ \! [! h# H J% u% H
取第2列给 %%a ,其后的列都给 %%b
: H4 o I1 q: b4 u7 W. c
' g' D" O% i& }% h6 U" m38 subst (外部命令)# l7 [$ T" B8 E! T
映射磁盘。3 j0 w1 l( X, {$ R
subst z: serverd #这样输入z:就可以访问serverd了
, C0 `* H4 c% e$ g9 m; B( D- ]subst z: /d #取消该映射
2 Z' @( r/ z( o$ o2 C/ L9 Psubst #显示目前所有的映时4 k; b5 A X9 L# B5 `/ O& k
1 R6 d) O3 R" ]39 xcopy (外部命令)
+ M5 \) W! Z+ l) c文件拷贝
2 e+ [3 d, D7 A/ _' s5 Pxcopy d:mp3 e:mp3 /s/e/i/y* V3 f+ g' q8 @1 }& A# r
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
- R9 ^& N4 G- c. l加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
. U: T- ]4 h8 X- S8 l
+ f, ]# R" ~. t6 q常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退) H$ m8 S0 c* N+ H: ]
- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:' X' k% e) ?( n2 b7 w
: B2 p/ U1 [! Q! @) x/ K
@echo off4 C2 O6 | J0 `; E* L6 R
set p=aaa
( g* d/ f x1 [if %p%==aaa ( q0 u# i2 }+ P' P5 _, N/ `8 G
echo %p%& E2 U& m6 U' C# t! S5 l
set p=bbb* @% V2 @! L1 G) p6 J7 h" G
echo %p%
# Q1 e- O% G5 D" c& z)
# H: W/ X: d+ d4 `pause
) C6 s! `' _: J. T- a; g5 s6 h |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|