|
|
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!
: ^! x. y5 G; D+ a- E 前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效# L. k5 T6 O d3 R6 j1 S' {
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
, G1 ?/ l( J% I( \) y6 D名为bat 目前比较常见 的批处理包含两类: / T* W& C& Q7 f. q/ P
- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理7 Q4 @0 F# G! @; k
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
3 Y* \5 d/ W! N8 S5 L9 x4 r, J命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
1 O8 T, D+ {. i4 s% ` 怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出% T; ^2 l. a+ ~ B3 S/ }
批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set
, q0 w& ?1 u+ ^ 批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||5 q' q9 h* P6 i# @' d
常用DOS命令- 文件夹管理:* ~) i& x, V9 U4 W
- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。
$ A ] e1 w- B
- 文件管理:
+ b- e* }2 \ L F8 c- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同
, g9 K4 V- h+ @2 Q
- 网络命令:: v/ E2 R9 i, x/ W2 h
- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表1 O8 V4 N# F q/ W9 v) [. e
- 系统管理:
. j. {- [ S" l- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置
0 m1 h ~& i& V9 m$ C" e* {* ~6 h - _1 {, d5 `7 ^7 @) _# {) y/ a
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /? / }- m9 N9 u. T# h" ~' Q
4 o$ n* C+ s6 @ @0 m o
Windows Batch 常用命令
' E# s! Q+ y) H, g. F4 O1 echo 和 @
5 T3 m1 f' J2 F1 K回显命令! Q" M& v' B+ y
@ #关闭单行回显) ~8 U0 }5 B: o6 K3 [
echo off #从下一行开始关闭回显
1 O0 f0 A6 }- j+ E@echo off #从本行开始关闭回显。一般批处理第一行都是这个
$ I4 O9 G, l* @& k" T& mecho on #从下一行开始打开回显8 o, U# z# G ]/ }3 C
echo #显示当前是 echo off 状态还是 echo on 状态6 Z9 `% z/ o; h$ X
echo. #输出一个”回车换行”,空白行" t4 @( x" Q3 ~4 t# e
#(同echo, echo; echo+ echo[ echo] echo/ echo)# k% C! y, Y) F6 f% Y
- d3 W9 i9 |9 s/ \7 I& r! z2 errorlevel U+ J7 t( m! c- o
echo %errorlevel% p( T3 B1 R! ]( D1 `$ q
每个命令运行结束,可以用这个命令行格式查看返回码$ t$ @- N. N/ f. Y& u
默认值为0,一般命令执行出错会设 errorlevel 为1
4 s G6 q6 r( X0 e7 n" P, l# n2 i3 u+ ]$ L+ I e
3 dir
) [; O0 p! x( m# r* Q2 W, I: t显示文件夹内容; d# T: M! C7 @1 d, K% H
dir #显示当前目录中的文件和子目录
+ q; q c( M' L, \2 R+ ^dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件1 t7 Q8 {0 G, R, O
dir c: /a:d #显示 C 盘当前目录中的目录7 s* o' U0 A+ D7 r) A4 N# W2 O
dir c: /a:-d #显示 C 盘根目录中的文件
- i% T+ P$ V) g9 P: m5 i/ `0 x$ O" Ddir c: /b/p #/b只显示文件名,/p分页显示2 W3 k. g% x* q% Q R% B
dir *.exe /s #显示当前目录和子目录里所有的.exe文件
+ C' ^ v" i% S4 U! E, X/ _* H+ T
4 cd0 b4 a1 t, [" Q5 H4 `
切换目录
* d) R1 g6 s$ c9 |1 i& Zcd #进入根目录6 j! @4 [9 T" K1 k5 ^! H6 w9 a" Y
cd #显示当前目录% c( o' ~% Y+ i! w" {# Q
cd /d d:sdk #可以同时更改盘符和目录. t% C1 t( e1 N4 K' G# T
2 U/ i1 e- A/ f. }* W
5 md
: }: {) d0 f# t' q6 b创建目录
0 n6 ^4 o& @( T/ f% I( Dmd d:abc #如果 d:a 不存在,将会自动创建中级目录
3 P: i1 s8 J* l1 P. Y#如果命令扩展名被停用,则需要键入 mkdir abc
! k P9 Y3 J6 i# S8 y7 K% N
; l. q) Z/ w3 p. B4 v6 rd
4 X/ ?4 y9 M1 N6 p7 c: B删除目录0 a& {- Z8 z3 Q% v0 y7 H: s
rd abc #删除当前目录里的 abc 子目录,要求为空目录4 v2 @7 H1 O6 d2 n* F
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式3 c! L* K( q2 e8 v5 M" L; B7 X
4 z: k+ `. a% t0 ~1 l: I: J7 del7 b; Y1 h! [ x' r
删除文件' h" L9 P ]: U! p# }, [+ M
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
" k! _+ e' _2 N1 H: X2 cdel /q/a/f d:temp*.*
; K6 U& b+ D( s! f7 S删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
: V$ r1 f$ A3 f8 U4 ldel /q/a/f/s d:temp*.*
6 h- d- | l1 I删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录# Y5 Z a! _: N3 X
( _; Z' S4 `( U: a( P; e
8 ren$ z4 }2 @0 o0 o
重命名命令4 i; }' O9 u. b" H/ O+ g, Q2 U
ren d:temp tmp #支持对文件夹的重命名
' O- @: n9 p% n: [; U7 F% ?8 H4 z+ X- m) _; O- f% j* O
9 cls/ U0 C$ H/ e; i4 u8 f" ?1 y
清屏
2 V! o$ u+ [8 e+ z10 type6 W1 V- E" ?7 R3 h
显示文件内容: l7 S0 f" k& L
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
" v# f- H: r& a* o3 [; h6 z: }' e3 s, btype *.txt #显示当前目录里所有.txt文件的内容
# {7 V( t! H' u8 @4 Y1 i
: ~9 |2 R \* s* j4 p8 @% u11 copy: O! W L: K4 y
拷贝文件
, Q* }* G' [4 A! s7 Xcopy c:test.txt d:test.bak, O2 u6 ]- o9 {& I; p* j: O8 c
复制 c:test.txt 文件到 d: ,并重命名为 test.bak& F; M+ C( o, o( U+ ^ ?
copy con test.txt# Y$ ]; \$ [( q9 }* H' u
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件, {$ Z) J) b8 E% B) P9 e
con代表屏幕,prn代表打印机,nul代表空设备
6 b& F2 D3 T! a4 y8 xcopy 1.txt + 2.txt 3.txt
% a/ y9 J" t% r# @: X+ M, S+ {合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件& ~* c$ l0 f2 |* ?
如果不指定 3.txt ,则保存到 1.txt% G. V6 t! H7 d$ h: _5 d
copy test.txt +
* U& q9 Z. X* A$ [' J0 U复制文件到自己,实际上是修改了文件日期: P9 c& T% S c- {! N! H
4 E) _7 D# D$ ^- w2 F12 title, }; E% `& Y9 ]+ E j
设置cmd窗口的标题
3 X9 P6 r) U& G( u5 mtitle 新标题 #可以看到cmd窗口的标题栏变了6 U9 r+ q2 _. \. d
! p' Q w" q/ _. i
13 ver$ C3 X3 X) Y( I: \/ I5 f& A# d" L% A
显示系统版本: `# o4 D0 z- g
% R% a/ D- b& e( _& Y) `14 label 和 vol# {2 x. P" l' Y0 v( O$ R; U" J, }0 `( O
设置卷标
) q, ~/ Z- E, A( G+ G" r' Xvol #显示卷标
2 `5 U( G8 s1 q0 Y, g1 [, k& zlabel #显示卷标,同时提示输入新卷标 ?+ u% i U& X3 M( N* [
label c:system #设置C盘的卷标为 system T$ w% b9 s5 `8 C8 Y. U6 `& Q5 A. z8 Y
3 @, G9 v9 Z' _% m4 p
15 pause! m2 L2 s+ y+ @
暂停命令1 }9 I( J2 E9 h3 T9 Z
) L4 r' R3 u! n. e4 A5 v' H
16 rem 和 ::
7 t( n* G+ B3 @8 A V C注释命令0 I: E2 f2 a8 z: ]0 l0 f) w
注释行不执行操作: }( f/ t& {7 S! _: c& M
2 ?9 a4 {* [# O5 u" A( P+ l5 e
17 date 和 time
0 D6 `% R* v' O8 M3 [7 r) f日期和时间8 ~+ y: T, {5 j/ ^2 o I
date #显示当前日期,并提示输入新日期,按"回车"略过输入
3 j! ~$ M r. b, \. |date/t #只显示当前日期,不提示输入新日期2 u4 s" x& }" Q# w. H2 A, Z6 R* \
time #显示当前时间,并提示输入新时间,按"回车"略过输入
: ~) i) \: y2 B* ?. W0 j! Q( Atime/t #只显示当前时间,不提示输入新时间
7 O7 U; e6 m. Q3 t1 \. c
$ `; x( I6 B% t& Z& q18 goto 和 :
1 g% g B5 |/ t0 |( A, f% _跳转命令
) \- N* w: j) x:label #行首为:表示该行是标签行,标签行不执行操作
6 r6 p5 Y) F9 P, `goto label #跳转到指定的标签那一行
( o, D# b$ @% y" t
8 r# ? k5 X8 Z5 f& g6 I! z19 find (外部命令)
* `( M7 @$ Y `" |2 K6 i, }+ f: }查找命令
' c9 P* h1 D; _$ l' Vfind "abc" c:test.txt
6 e8 @8 ^" t7 `9 T0 y3 R7 P+ {! O在 c:test.txt 文件里查找含 abc 字符串的行( e. U& f1 `- `4 O9 @) n
如果找不到,将设 errorlevel 返回码为1! I/ D* v% x1 |
find /i “abc” c:test.txt" @5 K* t$ L, B
查找含 abc 的行,忽略大小写
) U8 ], V- ?" `find /c "abc" c:test.txt
8 Q7 ~. e4 o) m) N/ L; K+ W显示含 abc 的行的行数, P1 G6 P5 l& g) L" Y
' N% f2 O0 `: n) U; r' f- K7 ]4 O
20 more (外部命令). b& F. x: F: E" ~! V& A
逐屏显示: W/ M8 l# S' V$ U
more c:test.txt #逐屏显示 c:test.txt 的文件内容
" e ^0 k( L5 ]7 w% C9 u; W$ P; n7 V/ l9 e
21 tree
: h) q$ J2 S; {/ S9 G显示目录结构8 p: E8 k5 |9 v, ^% I# B
tree d: #显示D盘的文件目录结构
! n5 \$ Z4 j" m9 p1 t7 P1 X
$ p3 K$ n3 b* I" N: V3 v/ ]22 &
( C" D" ^8 \3 O! i) }顺序执行多条命令,而不管命令是否执行成功
1 O8 v: M! g i4 Z M8 V
0 Z( [. c" i! T! ]* m h( l23 &&( d0 _2 u: W; B; P$ V4 _
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
. r/ ~" z6 R: s$ |) j. [8 }0 ~3 P& [1 ?find "ok" c:test.txt && echo 成功
! d: [3 R$ T) @8 \( g* B( B; M如果找到了"ok"字样,就显示"成功",找不到就不显示; x1 e1 P% c1 t, Y# r5 T% b& H
- S2 B9 V3 k; F
24 ||
' W& x# ?, ~- P, g顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令. `) \, i! m, s& e1 _7 L9 R; G
find "ok" c:test.txt || echo 不成功" o0 _) z |8 b
如果找不到"ok"字样,就显示"不成功",找到了就不显示
* ~ p9 A$ f* `) O# _2 q8 o( b) f0 r# d3 C6 r
25 |+ q3 |6 Z8 t2 W2 b. r `/ A# T: K. X+ I
管道命令
6 v7 N% K( |2 q5 @dir *.* /s/a | find /c ".exe"
" B- G! |* E) N' e3 w管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令5 T: c: t- v% h8 J+ b. Q
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数1 r; U' b _4 s- k# D
type c:test.txt|more
* O( W4 }- f- Q, s这个和 more c:test.txt 的效果是一样的
2 C3 P3 F$ S" _) r/ I/ k1 |7 e0 V2 I( U8 W! p; Q; N
26 > 和 >>6 G1 w/ Y- \9 V1 n2 k
输出重定向命令; v& j& t7 L! n$ t$ r
> 清除文件中原有的内容后再写入
) J/ g7 c4 u) R/ {: Q1 z>> 追加内容到文件末尾,而不会清除原有的内容
* U/ [: {7 D' Y1 _6 B主要将本来显示在屏幕上的内容输出到指定文件中
0 r/ u3 ^, X& A" |; {. A指定文件如果不存在,则自动生成该文件- K4 g5 F2 w/ Q* K6 u* Y
type c:test.txt >prn
2 M( X& Z5 k q* N i1 l' A屏幕上不显示文件内容,转向输出到打印机
e& s, D$ g/ w0 x- w3 C* oecho hello world>con
) P6 H5 h" \) i9 t* Q在屏幕上显示hello world,实际上所有输出都是默认 >con 的, Y( M# y* e( [4 u
copy c:test.txt f: >nul; o- P" E" a, L ?2 a1 U
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
1 x5 P% P$ B$ Ccopy c:test.txt f: >nul 2>nul% {3 P/ [) V/ V
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
" Y: J$ p5 |( @; |( G8 z" M0 p2 vecho ^^W ^> ^W>c:test.txt
" ^2 h$ f2 V' u. m3 K. y& ]生成的文件内容为 ^W > W
( |) V& Z" D$ n+ Q: d^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
- p" a4 D8 p* [! g9 c
- E) q2 g% G) m0 n, C0 Z0 s27 <! q7 M6 A4 C4 R% P, q, B2 w! _
从文件中获得输入信息,而不是从屏幕上
4 n) y8 U6 ~( X5 v8 L一般用于 date time label 等需要等待输入的命令# N" N* e$ h' _0 \, q/ d' w; _
@echo off
$ d& C& Y3 B: e% h+ \echo 2005-05-01>temp.txt3 I) @! p' P0 s8 n
date <temp.txt
$ X8 u- L! d }# v. L( ]2 Cdel temp.txt: {4 M3 S# q8 A: ]
这样就可以不等待输入直接修改当前日期
' {6 h8 v9 g7 G9 g( q
8 G' H- g. m. d" k0 T28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
2 V' \1 ]: Q8 s3 P# m/ E命令行传递给批处理的参数% z2 b- M- n- s( l
%0 批处理文件本身
$ U8 R. Z7 X* x' p. j6 _1 G0 }$ _%1 第一个参数& }3 q: W) {& J8 y
%9 第九个参数$ Y! K& p* c# ~$ f4 i1 {
%* 从第一个参数开始的所有参数
) d6 X" G, y1 c0 W批参数(%n)的替代已被增强。您可以使用以下语法:
4 y1 b& i& [0 U1 N U* Q%~1 - 删除引号(" ), 扩充 %1
! Q/ `" `- g; A* a( |%~f1 - 将 %1 扩充到一个完全合格的路径名9 `- B/ N t0 H+ ?) [* M/ j5 F$ f
%~d1 - 仅将 %1 扩充到一个驱动器号9 ~6 h `: ~1 {/ s' s) w2 `( Y
%~p1 - 仅将 %1 扩充到一个路径( m+ ?, e8 t3 N0 p- y, F) F( k
%~n1 - 仅将 %1 扩充到一个文件名* M5 w4 }$ ?3 l, K6 p( _
%~x1 - 仅将 %1 扩充到一个文件扩展名# Y6 z! l# Z' Q
%~s1 - 扩充的路径指含有短名 O1 b4 O1 o p" U
%~a1 - 将 %1 扩充到文件属性
' Z+ b! F. n" @% Y* S- @8 ^3 P; A%~t1 - 将 %1 扩充到文件的日期/时间
# ^7 x" I8 N( ?; o%~z1 - 将 %1 扩充到文件的大小( J, o) u( _ z7 O+ U7 V
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
, k3 `. N7 a4 f3 E扩充到找到的第一个完全合格的名称。如果环境
0 x1 i) J) _& l+ ?$ x) F变量名未被定义,或者没有找到文件,此组合键会 r4 j/ j Z# {; m, y' J
扩充到空字符串# W: A, i6 {+ ~" Z/ D) v; M+ R
可以组合修定符来取得多重结果:
, u6 b- B$ Y" \# K* n1 K% j%~dp1 - 只将 %1 扩展到驱动器号和路径6 g0 F$ V2 t6 ^+ u8 w I6 N8 e- o
%~nx1 - 只将 %1 扩展到文件名和扩展名
, ?& b J" h/ }%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,& ~8 C* ^0 g8 n: ^! _
并扩展到找到的第一个文件的驱动器号和路径。
6 {9 j9 ?, ?; R+ n5 Y3 V2 y%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
5 x1 L: Z2 |- C. H( D- y可以参照 call/? 或 for/? 看出每个参数的含意6 E6 y9 b j) S4 u# B. A, c* I
echo load "%%1" "%%2">c:test.txt
3 }9 Q& N5 s4 b% d" \. y+ `生成的文件内容为 load "%1" "%2"
4 I' f2 K. o2 `' Q( Z批处理文件里,用这个格式把命令行参数输出到文件6 q6 J8 B: y$ ~6 z/ ~7 |# g$ o
( `$ P( u' }, ]29 if9 @. ^+ J9 V# ?. T, ]( L y$ i
判断命令4 ?5 a/ H7 ?' Z0 r" s0 ?% J9 ]
if "%1"=="/a" echo 第一个参数是/a# x9 G' u( P$ b# ]5 O5 v
if /i "%1" equ "/a" echo 第一个参数是/a- L2 o" a" h- H: G" m: w; a
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?, M& e9 Y& Y; J! u- |
if exist c:test.bat echo 存在c:test.bat文件& }0 Q5 [/ d3 n+ z5 @
if not exist c:windows (, `. Y1 e% p1 \1 S& H2 ]
echo 不存在c:windows文件夹6 n) _9 {+ ^9 ~- [# p/ i
)
! ~; S3 t( x/ c1 l1 d# x+ t) n& M: Zif exist c:test.bat ( k: [0 Y( g4 u' p3 G. g* t
echo 存在c:test.bat
- p4 T j$ u& ]- }) else (
3 c" t- [! Y$ l6 wecho 不存在c:test.bat
% H/ B4 F: u9 d' m' ~' W9 K9 n! m3 [% U)
) K# H+ z/ c8 K0 c30 setlocal 和 endlocal( g2 u/ Y& l, a) d: k5 ?2 x
设置”命令扩展名”和”延缓环境变量扩充”% B3 Y6 F6 e- g8 }8 H
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
, E! ]4 M1 [/ r F1 \' F$ VSETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
3 s5 H0 r! K7 k) V: z' i5 nSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充") i' G8 A. r& Z% O% I8 _
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"+ b A4 _* w( {4 p
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态
. r) v' C6 v6 q. t! \“命令扩展名”默认为启用$ _6 h! x7 t2 n' p" X' |) s
“延缓环境变量扩充”默认为停用: e; G2 T( m) A5 M3 {
批处理结束系统会自动恢复默认值" m: @; G4 m+ m
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
) _7 {+ p5 f; c3 w序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
0 y$ G1 W9 |+ e/ ]6 b- P4 b保程序能在其它系统上正确运行, n _4 t) K! {( G
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程, k/ B5 A& F# }- H! i
# N# }* }) s3 D% f( ^/ F# B7 ?( i31 set4 h. |" j; ?% I3 k: r& h! ~: _
设置变量
- m* k' w/ ~. g3 b/ ~& U引用变量可在变量名前后加 % ,即 %变量名%+ o0 J3 e' i7 i
set #显示目前所有可用的变量,包括系统变量和自定义的变量
7 E, p9 a- R1 r, lecho %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
. @: [* c+ A, o8 @9 ?# Q! eset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
# F! Y4 M: r% ^+ ~0 aset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2) j& M4 [) }3 @8 @- H0 H4 h* ^
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
$ J0 F* O5 x% N( C+ Decho %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
" e4 t0 @/ W4 _3 Wecho %p:~6,3% #显示第6个字符以后的3个字符,即aa2% y: {$ S2 U, T( w: x9 \9 _( }
echo %p:~0,3% #显示前3个字符,即aa1) O9 T. J6 r6 Z" Y, P' r- I
echo %p:~-2% #显示最后面的2个字符,即b2, X; m! t! _. U( S @0 c% p
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
' |) ~3 {9 w+ o( |/ cecho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb26 b' i* ?2 C1 I: \) z
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2- s* k' F' U2 i
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
9 F/ ]& p, U, T; _4 \" Uset p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
0 U+ a$ |. P: V1 h1 G& h9 k, |6 E3 k$ Bset /a p=39 #设置p为数值型变量,值为39& L. A$ s$ ~! \4 }& N% T
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
9 K! v9 A+ `4 c2 E3 Y* W6 S3 Tset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用7 }% G+ Z; q2 ^+ O
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?* t! @) s9 C0 o6 N- {8 }
set p= #取消p变量; }$ }0 ~! k7 V3 W+ ~
set /p p=请输入
+ E4 M* M4 m1 A' Q# |! a0 C屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
! V, U* [* \: H5 V2 P# p注意这条可以用来取代 choice 命令- v6 y% K( g5 K: I$ m8 u0 |
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如" d; m' c3 ]5 a3 y& V* }
@echo off6 h" G* [. L3 {; x$ w/ S3 g4 q O5 q' I
set p=aaa$ `% g- k. N0 f: q$ X2 k7 z
if %p%==aaa (& a% ^2 R" V" Q- m0 s. f
echo %p%6 m/ d7 [, h5 m- ]6 c, |
set p=bbb4 u2 F- I, Y' ~. u8 R
echo %p%5 R7 [3 P3 W1 Y6 B ~- y+ {' o& ^
)
) x: J V! ~! d9 F+ z# E结果将显示( G% _+ \$ g }5 P) {* S5 a
aaa% ^) M0 |2 W7 ?# r$ x- D+ d
aaa& x% m' z0 E0 b
因为在读取 if 语句时已经将所有 %p% 替换为aaa% d0 ~3 A3 Z; I8 c/ ]% g
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
+ B2 O/ _6 ?0 r) Y可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!3 z" a% ~: \' y, O4 T- P
@echo off
. o* j& O* J' |* H* s& LSETLOCAL ENABLEDELAYEDEXPANSION, h' h/ Q; l0 B! N, C! f
set p=aaa
. z7 k$ R. M) ~1 m4 u( e# oif %p%==aaa (" W+ |2 l5 c+ A. P( F9 w; ~0 ^
echo %p%
/ S6 A1 ?; O( yset p=bbb
& ?) T$ k/ y% t# A/ lecho !p!7 P8 L( y% I l4 Q/ K# Y
)0 L4 B7 T+ t$ W* [: ?* q* _
ENDLOCAL
# X6 t4 _* H3 |% Y/ ]1 ~结果将显示
7 L0 B! e+ K% Oaaa
S) w2 }9 w' @. j3 h% l" sbbb2 {8 ?9 I7 j0 d) y' ?
还有几个动态变量,运行 set 看不到
) m# w8 E' E& _ y: P2 B& x# v%CD% #代表当前目录的字符串
8 `7 J6 e7 D; d$ {: l8 G: T5 K; ^%DATE% #当前日期
. \2 ?2 j L: V%TIME% #当前时间. x; m3 Q8 b2 d p& T. S$ a
%RANDOM% #随机整数,介于0~32767
2 l" F( b4 D) R+ `' B+ k! k, a; t%ERRORLEVEL% #当前 ERRORLEVEL 值: c7 t6 [0 D9 w9 A3 u
%CMDEXTVERSION% #当前命令处理器扩展名版本号
! D( [ }; q+ N0 ~& `9 g" l%CMDCMDLINE% #调用命令处理器的原始命令行
3 V+ C1 ]9 \% Z( v# R可以用echo命令查看每个变量值,如 echo %time%/ ~, R b ]. f: }) ~9 f
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
" j' g4 J$ ]2 Z! F6 n
, s! Y2 D% P7 {' w32 start: _7 z7 c# `6 Q
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
/ t5 u* R+ Y) b. x8 W0 x- R) J6 f/ A
, E8 ?6 U8 n6 h j4 c0 X# ]+ L33 call" m ~$ |& `# [! A
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行( W9 U. _, C. _
有时有的应用程序用start调用出错的,也可以call调用" o+ X7 T: o/ H# U
% w1 }6 b( `- p' i0 T34 choice (外部命令)
* c: z$ ~+ {1 d& s5 e8 r, S- r选择命令
' ?; f) p1 C, w0 O! A8 d( n, f让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234…… Z; i( r) \2 @+ @6 i
win98里是choice.com% S* M s( G3 Q- Q( k% k; Q
win2000pro里没有,可以从win98里拷过来
; c" ~/ X. B; w1 vwin2003里是choice.exe9 d7 \9 o6 X3 N
choice /N /C y /T 5 /D y>nul, M! l7 A+ @3 E" J: `; ]$ k1 R) T
延时5秒
7 S9 D! U4 Z4 _+ L( D2 R- t# n
3 ?% @3 ]+ ~- x3 ^35 assoc 和 ftype
3 B* G0 P, p: r$ O' N* \# K文件关联
3 Y5 M: ^7 Y9 @5 @assoc 设置'文件扩展名'关联,关联到'文件类型'. U- C, @9 d- {% j, r+ l
ftype 设置'文件类型'关联,关联到'执行程序和参数': ~0 O8 s- W3 }* s
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
2 }5 @% Z: @5 d而是先判断.txt属于 txtfile '文件类型'
" k. q% H/ T4 s' K9 @4 j/ X再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
" k9 d; |( u8 H" G可以在"文件夹选项"→"文件类型"里修改这2种关联
, ]% V0 V# I! u' |3 o% Q% s2 I: Passoc #显示所有'文件扩展名'关联5 B; Y/ Z! Q. h
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile; N4 B% V* L: u3 u# _
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8! G! ?: P9 t- n
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile5 N! u. z4 v2 ^! Q5 F9 ^: {
ftype #显示所有'文件类型'关联" G/ N' x! `4 d) {) U" v- h, y
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %* {/ l3 _9 e/ y6 y. H' j
assoc .txt=Word.Document.8& F: E6 q" |, H' _$ {
设置.txt为word类型的文档,可以看到.txt文件的图标都变了
1 L4 A3 J" g/ h1 r# Oassoc .txt=txtfile4 e- U9 _8 q: g" F. Y! S! U: u
恢复.txt的正确关联
" N5 r' v( p2 ]8 B2 C) bftype exefile="%1" %*
, P" z5 c7 ], ~: I恢复 exefile 的正确关联/ T; r- {7 T/ K+ P# z
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
# A: U2 L- M: I* }4 P# P- N- r0 D
. C C0 R' |6 X: o; K* M! }36 pushd 和 popd9 \ L/ k- A$ V1 F* O( a
切换当前目录
4 Y; Y& L6 j( j" l@echo off: b8 ~$ h9 ^" T9 Z
c: & cd & md mp3 #在 C: 建立 mp3 文件夹
: ]7 B" G+ u: [. A' X, hmd d:mp4 #在 D: 建立 mp4 文件夹
6 z$ i* `) @) e }7 q- G/ Tcd /d d:mp4 #更改当前目录为 d:mp4; p" E( k1 s, t! R
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
8 [6 T; |' b. C! t. A) `popd #恢复当前目录为刚才保存的 d:mp4, h/ c5 L [7 q" s# b. h
( J/ Y2 v3 t) F/ L9 g8 d: u37 for
O3 \+ \/ r7 C. S循环命令& l" V* N! \' e3 E' F
这个比较复杂,请对照 for/? 来看7 j& ~8 b0 H; n
for %%i in (c: d: e: f do echo %%i+ G {: @+ M& C R5 @. t
依次调用小括号里的每个字符串,执行 do 后面的命令6 c/ L7 r, \. K+ c- H
注意%%i,在批处理中 for 语句调用参数用2个%
3 C% N! r' k1 {5 X! n默认的字符串分隔符是"空格键","Tab键","回车键"
C9 R3 I- u/ N Z, Cfor %%i in (*.txt) do find "abc" %%i
% s `& D8 o6 b对当前目录里所有的txt文件执行 find 命令( @4 U1 N1 q' B0 d4 Y9 W9 i5 ]
for /r . %%i in (*.txt) do find "abc" %%i( ~* J. C7 Z Z0 v; Z3 T, z
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行$ d% G* H1 ]6 G1 V, j7 c ]8 a- L
for /r . %%i in (.) do echo %%~pni
~8 t" J) a: ^9 B显示当前目录名和所有子目录名,包括路径,不包括盘符
/ A* y) b9 x3 T8 Lfor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
+ Y; U5 K% Y8 A" d, f- c( }把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去: I! N- I4 S. b: I7 {
for /l %%i in (2,1,8) do echo %%i
$ q, l! q9 V+ l6 N; f# ^生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1" C" ?; O" I' g' Z
for /f %%i in ('set') do echo %%i6 R% F6 ^% G' D! l# C
对 set 命令的输出结果循环调用,每行一个 B6 H- N+ R" C8 c! r6 `
for /f "eol=P" %%i in ('set') do echo %%i+ t6 Q, L/ k: `4 p
取 set 命令的输出结果,忽略以 P 开头的那几行
& R4 v' @" J7 R" f8 t7 zfor /f %%i in (d:mp3.txt) do echo %%i" V! Y9 T% o* ^
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
. b3 w3 E2 F7 w" H8 ?for /f "delims=" %%i in (d:mp3.txt) do echo %%i
& ?+ ]% y$ _* \& L! K/ u3 H显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称6 s9 ?3 I! j, a& B# B0 |& h8 {
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a0 ?; u+ E4 j/ C1 |' i7 T
对 dir 命令的结果,跳过前面5行,余下的每行取第4列/ _! U3 g- E, Y
每列之间的分隔符为默认的"空格"
+ K2 [1 b/ Q- S" W; {可以注意到 dir 命令输出的前5行是没有文件名的
, t* w5 D3 f7 r8 o; g0 S4 cfor /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (8 u) I9 l+ ~& T/ m% s+ J- x' c* o
echo %%a
/ `& l9 ?2 l. n7 l. z4 ~2 Decho %%b
+ D' f4 k8 H( Becho %%c
" Y y/ |6 Y/ P% _)9 P- v1 @+ _! |/ f% N- S
对 date /t 的输出结果,每行取1、2、3列' k5 E5 l7 a$ w. O
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
# @! }- }- F$ m7 C) c) z分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"- D, |& G x* k3 M! R. ~ q
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的2 m- ?- N* @& [' p
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
$ r, c- ^7 P1 @( N2 ^ B5 K8 ]取第2列给 %%a ,其后的列都给 %%b
# p* c6 T+ S' C! X) T! G, a0 L! S A; I- o7 p) f3 x! x
38 subst (外部命令), _8 h5 L' E! n
映射磁盘。/ o' f$ _) H5 a% `8 h, n
subst z: serverd #这样输入z:就可以访问serverd了% y' }: Y% d- _5 e1 ]. _
subst z: /d #取消该映射
9 ^8 ?0 a2 Y7 {/ ksubst #显示目前所有的映时2 @/ [5 P# o9 b" [0 U7 \5 \9 o9 m
3 H9 `5 P# W- }3 Y' R: {4 {- m0 M
39 xcopy (外部命令)
* Q- M( ?! h r( [& _1 L7 |: y% e+ u文件拷贝
! N; U& |0 v! D( P d$ e! J1 Ixcopy d:mp3 e:mp3 /s/e/i/y7 z2 e9 M6 U3 p8 V" }
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件0 J/ g& ]3 v( t( s4 n/ ?6 K
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
! {! g6 Q' E1 @# u8 v. P, q
3 z# Q( T; m( g/ i常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
5 P: {7 D" t; K8 R, R- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:2 Q/ }* l7 r' }0 l9 i0 }% e/ J
" s: I" j9 r. ~' K
@echo off' E9 D: ?! k0 i' M3 S( _) n; F
set p=aaa5 N8 Z7 I, k9 V5 |1 Z2 e% U8 o* N1 J
if %p%==aaa () _* a5 Z$ N4 q q1 \0 q
echo %p%" K# W% `7 M7 x3 n4 M8 z
set p=bbb% J/ h2 X$ A; q( K
echo %p%) x7 o0 P* R2 C5 M8 t3 r
)
z* w6 b- D. g) m7 Kpause
截图:3 u* ~, s& ]7 x
2.批处理.bat 文件中输出中文乱码 6 n5 E0 [ T: P$ F) y
- 原因:记事本新建的文件,编码不是 utf-8
- 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
- 操作截图:$ ]/ V$ d0 F0 K- Z8 x b3 Z
- 效果截图:
4 X- `5 x$ K" B9 Z, q. W& D
# j) G( |& N7 a+ G* R9 `& u6 p, Z0 [
# b7 I0 C. t; M& ^- }& U" H. G/ M 9 R% Q: s' `6 [
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|