|
|
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!
w" e, r7 x0 @2 m! a X: ?5 M 前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效
y2 Y% r& u- _1 l
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
- U L: t* W6 e1 i名为bat 目前比较常见 的批处理包含两类: # z' {4 S9 F7 Y5 B& O0 ~
- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理: p! r0 K ^& I% p2 B
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的/ f; [2 I; b6 ]& W+ [3 f+ Q
命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件 / Y( _# w5 k+ u( F; M& z
怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
& i2 W" @8 _2 n) H 批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set# H9 t `7 ~5 |$ S
批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||
8 T4 D7 ^/ ~( R' K 常用DOS命令- 文件夹管理:
4 G! ]$ I, r8 G) n: h4 v- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。
. g+ f' c2 h% L9 y* e! a
- 文件管理:
9 c6 b' f2 ]% E/ E2 p- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同0 \; [/ s0 @3 f% g a0 v; K8 T% @; Z
- 网络命令:% F5 G0 N/ P# a" e0 b2 F
- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表
# Q! p7 X- T l' L, S" o
- 系统管理:
/ Y7 ^' t. t; [8 M! z: Q2 E- q- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置! b4 O# P1 w5 T5 Q9 L6 T: Z4 a
/ b2 _4 M. [' Z3 _7 a8 E/ X$ e0 ?
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
q) H% S" c: |. s/ ]- ]0 {4 Y+ r( Z' e; P# H2 S
Windows Batch 常用命令
5 U' k; ]( O% A7 e1 z. B1 echo 和 @
/ ?' U# ^ K' n: k( e回显命令4 g; H8 O* v6 s3 ^" b" C
@ #关闭单行回显
5 ~/ h% I8 a* g9 t8 y! ?echo off #从下一行开始关闭回显
1 Y3 b S7 a$ N@echo off #从本行开始关闭回显。一般批处理第一行都是这个9 E9 A9 z( S0 t4 B. r
echo on #从下一行开始打开回显
9 \: [, ^' l Z+ _% Xecho #显示当前是 echo off 状态还是 echo on 状态9 E' g& b* b- h
echo. #输出一个”回车换行”,空白行2 ~, @$ a6 J7 }$ Z6 @. ^3 j8 p2 ?
#(同echo, echo; echo+ echo[ echo] echo/ echo)
+ ]6 U) X8 v1 H
( y% s! C7 X- Z0 O1 v2 errorlevel
& ~& k. H7 `- A2 @% v9 C. P, [echo %errorlevel%% f/ F+ W" @4 ]7 B7 p/ A% P3 C
每个命令运行结束,可以用这个命令行格式查看返回码
- X' L9 R' n* P5 |/ o默认值为0,一般命令执行出错会设 errorlevel 为1: f* b2 T$ i# X; O4 z+ F
# {& w* [8 `9 t& `) T8 k3 dir4 r! a& z6 g8 p9 s) l0 H) {! ?
显示文件夹内容9 z1 A& x8 r. X8 W* H0 L5 z
dir #显示当前目录中的文件和子目录" m' G8 c2 V/ [, @+ y* d( A
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
6 i# \0 L% N6 k7 _+ Edir c: /a:d #显示 C 盘当前目录中的目录5 F% r# X* S& P% |7 s
dir c: /a:-d #显示 C 盘根目录中的文件: @9 _* G; ?* N
dir c: /b/p #/b只显示文件名,/p分页显示% `' Y; O4 k5 s. r s4 B
dir *.exe /s #显示当前目录和子目录里所有的.exe文件
5 B: Z* V @9 d- d |, q8 L* _; y
1 U# U0 O8 N2 D: b$ \3 s4 cd
( j4 Z, X7 ~- ^& Y i; A7 U' m切换目录
1 u9 P B2 R$ g. B. f* _cd #进入根目录
0 ]# D0 ?4 W8 k- o3 H Fcd #显示当前目录; ~% w) `/ S4 ~" W/ H. ?
cd /d d:sdk #可以同时更改盘符和目录
4 U# T& j/ N) |# q& \( Q0 o, G5 G/ @7 p
7 w' |! c1 S2 l1 k+ U5 md1 c8 ~0 }2 r' A* a
创建目录
8 u/ p3 x) q; {0 y; v9 z, y5 t) omd d:abc #如果 d:a 不存在,将会自动创建中级目录2 u. b( B! w2 ~& {$ v; [) S) H3 y
#如果命令扩展名被停用,则需要键入 mkdir abc1 z- D$ L9 H/ w) F$ p# ?' |; _
" ?9 V- T6 q% `+ ]- A
6 rd* }. Z5 u: d& I$ B( P
删除目录$ U# l4 J" Y. s8 t* {
rd abc #删除当前目录里的 abc 子目录,要求为空目录
4 l$ q4 ]$ Y, o7 Brd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式7 p. {9 ? v- [) N% W
1 C0 B$ x: X4 F2 p ^6 d
7 del7 ^& F: G) v5 X) Z3 a& s9 B% D
删除文件& j0 ]$ l! b. S5 e
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
3 L: z2 t" T+ t9 V, Zdel /q/a/f d:temp*.*$ x/ S- E+ U4 T
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录, @2 M9 l) d* B8 e. k+ Y
del /q/a/f/s d:temp*.*
7 k/ ?- a; T: m5 ]; o删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
- E# S7 x$ v# H) ^+ U3 e+ t8 ^ H e( ]4 m
8 ren
0 R) K2 g n A重命名命令) X, o, i( x6 f" x3 W l9 p2 r
ren d:temp tmp #支持对文件夹的重命名
8 k# A: R2 O$ T% ~, R$ a
$ B; l4 a H! I9 cls
. A* P3 p6 ~' B/ ]/ q4 u. I清屏
3 n$ A& [ R- d; {9 O" @10 type
' Z5 C* \( e% D显示文件内容% f' u4 q1 g$ S- Y7 Z" n
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码: d& \. m0 ]+ f4 \7 [
type *.txt #显示当前目录里所有.txt文件的内容
/ q5 L4 A4 X8 L4 V2 t# W% w! K2 N! q& ?7 a
% L/ b% w1 Z9 r% {. r0 i11 copy8 s* f" f9 J1 y9 a* G8 S. x- E+ L* P
拷贝文件7 K |8 w: ^5 s6 ]7 I# G5 c o
copy c:test.txt d:test.bak& [% V, w, X* v( X- j' z
复制 c:test.txt 文件到 d: ,并重命名为 test.bak
, O6 U% s- m. `& G: ?. u; Wcopy con test.txt1 ~, W! \# \& l# ]% p: I
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
# |5 l/ [7 s4 x( m0 D2 h/ L Bcon代表屏幕,prn代表打印机,nul代表空设备
; p( Z' S( D0 n# S$ \copy 1.txt + 2.txt 3.txt1 K1 @4 ` a3 B3 X: s0 n, y; G0 Y
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件. Y5 c6 I8 J3 a6 V3 ~! O
如果不指定 3.txt ,则保存到 1.txt4 p9 {. t# u5 |) f5 D
copy test.txt +
# |, t- u% m$ n2 m3 l' A( {复制文件到自己,实际上是修改了文件日期: n; @4 z' }: Y1 T
# ^1 O5 K" U3 Z% M! |/ I12 title
8 u1 ?' L; d8 P8 ] O设置cmd窗口的标题 r/ ~9 ^5 o% ]0 `7 A7 N
title 新标题 #可以看到cmd窗口的标题栏变了
) C- V# M0 ` Z5 W) n- [6 b; S3 l- h3 l8 g I. X) N
13 ver
2 R- Q; t5 P+ b7 {显示系统版本
# N. V: [+ P- I# O6 Z6 X) ^7 m( h: @, u, B: q0 U9 Q! _9 u
14 label 和 vol
2 j# ^" Y1 p6 F6 K设置卷标
# h# y) S9 E& n: w+ M/ mvol #显示卷标
8 H" N! p. k! P- _+ ~5 E) flabel #显示卷标,同时提示输入新卷标$ Y/ V3 B8 u( K% A# A# V
label c:system #设置C盘的卷标为 system
7 ]1 d8 @* V6 G1 K2 q: ?. `
6 ^* {5 x% j0 c# o! J15 pause) {+ `/ `6 s& k
暂停命令. q/ K* \9 k& _% _& ?5 T9 x* V/ [
! J- v }# k2 \7 a16 rem 和 ::$ q" y+ ]9 r5 d+ M: o0 b# y
注释命令
0 ]. k9 O8 H! L; M; y; m注释行不执行操作. _8 c7 s" `* v# d) O0 x
. L D9 l7 i( z% G* U( ]* j
17 date 和 time2 @% w, g! B: U. S7 i
日期和时间
! Q( x" w- q q9 n1 t8 [5 C4 ^; qdate #显示当前日期,并提示输入新日期,按"回车"略过输入, J* P6 e7 i" s, r6 f6 \6 ^
date/t #只显示当前日期,不提示输入新日期8 x Q7 T J1 I0 Q2 l1 D
time #显示当前时间,并提示输入新时间,按"回车"略过输入
# K1 G! n) N. b3 w1 F3 \( ]& ?time/t #只显示当前时间,不提示输入新时间% O$ N( Z0 M! l3 l( T9 V% Z Q
: P# c n2 i; H) p4 C0 D& u18 goto 和 :
1 n: P" k; d5 b# O跳转命令* D( N) J( x) j8 d
:label #行首为:表示该行是标签行,标签行不执行操作
% w, H2 P" e Y% ~goto label #跳转到指定的标签那一行
3 B! F& `' F/ N4 M! [8 _0 E! S
5 {' P; Y3 _4 ]6 A2 p, U. I# t19 find (外部命令)! Q( M! C- P4 d9 T; ^
查找命令- b; ^4 B, O# R% N
find "abc" c:test.txt4 a6 T8 M+ I- t. i: d
在 c:test.txt 文件里查找含 abc 字符串的行
6 Q# k! F E8 C1 V6 S: G! t如果找不到,将设 errorlevel 返回码为1
& N: p% Z8 d0 X# F% U7 @5 A+ H; dfind /i “abc” c:test.txt& f( A8 m8 p, \4 F/ l4 _
查找含 abc 的行,忽略大小写 G# O; k/ o9 a! L6 s1 X5 G/ [
find /c "abc" c:test.txt
+ k: L3 k6 H6 g0 b显示含 abc 的行的行数
+ ~4 V3 U( l3 T+ U: n
9 q- j0 P% D0 r+ g6 H$ Z; ~- N( f20 more (外部命令)& }( ^6 a E: o' a+ L+ ]
逐屏显示- e- Y `/ w7 b; o! a- ?
more c:test.txt #逐屏显示 c:test.txt 的文件内容/ P$ S; W0 b+ ?1 w
+ ?9 z; P( \$ u5 _' e+ |) {21 tree0 ?& `+ m) U! Y, Y
显示目录结构1 C, [4 m% i0 U9 i
tree d: #显示D盘的文件目录结构
( K0 ?- H3 S' ]" X: P6 K3 U4 g/ Q1 u$ x" D a
22 &
; J6 O. o' ~/ @顺序执行多条命令,而不管命令是否执行成功
5 t( i% }3 M5 z( Z
( a& ^+ W2 z# q+ R9 S6 {) \' P23 &&
+ l1 y$ d" |) z' [: d$ Y2 p顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令4 v3 j' t; \, h# b/ N/ y
find "ok" c:test.txt && echo 成功
! M" k0 e2 w; a1 O% b% V. C$ O如果找到了"ok"字样,就显示"成功",找不到就不显示
: p' D; [; a, J# Q/ {3 |. L7 h ~# Q# _& y, k( F
24 ||( D1 ?/ n; w2 K c& h
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
" g% b, _# p u% m7 |5 b" J- hfind "ok" c:test.txt || echo 不成功+ W& h+ O6 k3 z2 d( i# `
如果找不到"ok"字样,就显示"不成功",找到了就不显示$ u! ?7 D) J7 J
2 U% q% r' _' u" e, ?* z25 |
) Q( P0 J+ ^% W: C管道命令0 v' r+ J0 H9 l, E
dir *.* /s/a | find /c ".exe"
4 J: v+ `0 K( \. ]+ o9 I" q/ v' d管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
+ L1 q% j' R4 V. G5 K$ n {该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
6 I' Y& ]2 M- K, o. Y; U3 ^type c:test.txt|more$ w+ k x( i" R
这个和 more c:test.txt 的效果是一样的
7 P# Z) N9 a7 j% i( z+ m$ e& ~% P; P
26 > 和 >>
' Q0 u1 v7 W8 w0 a; Q% }输出重定向命令1 G# f7 o, Q- E
> 清除文件中原有的内容后再写入, f+ d% R* g1 b# W7 Q6 k
>> 追加内容到文件末尾,而不会清除原有的内容
+ c% j8 O' J* @主要将本来显示在屏幕上的内容输出到指定文件中# k" s7 Z; r' n% F f6 t( L) Z) ~
指定文件如果不存在,则自动生成该文件
! e% w W- G! Z; _9 d- L! |type c:test.txt >prn
" ?5 |9 r: l- k& ?; n+ E; o& R8 |屏幕上不显示文件内容,转向输出到打印机/ S4 B8 n9 G/ ?; N. Q% G. z1 O5 L
echo hello world>con
) z8 d0 R6 P7 z- g2 B h/ Y在屏幕上显示hello world,实际上所有输出都是默认 >con 的
. j! L& @" D$ L3 W$ Icopy c:test.txt f: >nul/ ~. H ]* x* H/ D' l- M5 K
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
. _4 x; ^5 L/ F$ }8 H- n8 e# Wcopy c:test.txt f: >nul 2>nul
6 Y1 R( Q2 o+ I8 d& I2 [不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息+ `: r# ]: ^; M8 @# f. \8 q
echo ^^W ^> ^W>c:test.txt5 {/ O- e& k! y( n$ |
生成的文件内容为 ^W > W* R4 B3 z; u+ m% C9 d9 d9 ?
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
, S2 J( G+ R% e9 D
' l! z: K6 r& |& A* u3 O R27 <
. \% o; Z. C, ?& `0 Q5 j5 G, v8 T从文件中获得输入信息,而不是从屏幕上/ Y4 o* {, i9 |8 \" m
一般用于 date time label 等需要等待输入的命令
: _. H9 U( ]# ?; l3 t/ F$ |@echo off
- y: ^: P, K9 V2 Necho 2005-05-01>temp.txt
+ \) p' d: P2 r) N' }3 udate <temp.txt7 B, h" m8 f9 \$ _: z
del temp.txt1 u3 X' D5 R8 S, l( y% @
这样就可以不等待输入直接修改当前日期' I p1 @5 q5 O f! X" o$ i y
% u k! p: F4 ]% [( ~1 H
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
; j' g% B* A* W+ y( `! v命令行传递给批处理的参数
1 A$ |/ t/ g* q: M7 C9 g5 V9 R& j- b%0 批处理文件本身3 x' u9 N% }% Y& m- i8 S6 D/ i9 B
%1 第一个参数
- U# _ x- ?; A2 z! {%9 第九个参数3 {0 b) N5 x8 k% M2 o& J
%* 从第一个参数开始的所有参数
6 A$ R' X0 }+ C) ^批参数(%n)的替代已被增强。您可以使用以下语法:
1 |5 J" z+ d; O%~1 - 删除引号(" ), 扩充 %1
% d! t- t: V0 W0 g1 g%~f1 - 将 %1 扩充到一个完全合格的路径名
) B! q; m; E" s$ U) q%~d1 - 仅将 %1 扩充到一个驱动器号 w4 v6 | v2 n9 v; @) H) q7 B
%~p1 - 仅将 %1 扩充到一个路径
; J+ S1 a K% \8 q8 |, I+ C( c%~n1 - 仅将 %1 扩充到一个文件名& X9 h5 O7 o$ F! ]$ @* ?+ c
%~x1 - 仅将 %1 扩充到一个文件扩展名: u. ]9 |; z7 ~6 z$ R9 m1 U
%~s1 - 扩充的路径指含有短名
0 T r; x% h8 a1 h: t- K%~a1 - 将 %1 扩充到文件属性& E# n" W' q T2 |4 ]+ U! X# P, V
%~t1 - 将 %1 扩充到文件的日期/时间
: ^# C, q* i3 L w! Q%~z1 - 将 %1 扩充到文件的大小! S6 L+ O6 E. g; }7 a @; g( k7 t
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
2 k/ ^- u6 x8 C) F3 U扩充到找到的第一个完全合格的名称。如果环境) X3 d, ?0 \% R3 y% y* n
变量名未被定义,或者没有找到文件,此组合键会6 Q$ Y% |0 ~- N. E; [0 i
扩充到空字符串
5 ?* e0 d0 V' g$ L) E可以组合修定符来取得多重结果:
* R2 @+ b$ Q! o+ U%~dp1 - 只将 %1 扩展到驱动器号和路径
+ B# K& ]+ s* k+ D& [%~nx1 - 只将 %1 扩展到文件名和扩展名+ C( `, f0 E( ~1 k; g1 v+ \. }: @
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,1 j& ~3 I1 c+ [8 F' R. j/ P
并扩展到找到的第一个文件的驱动器号和路径。% M% Y7 x- v H$ A1 p8 O& S
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。9 O) @* T, z. c$ ~
可以参照 call/? 或 for/? 看出每个参数的含意
3 A, M2 J( ?* q2 F( j% K" recho load "%%1" "%%2">c:test.txt, x# n$ T- T- h3 ^" \+ V
生成的文件内容为 load "%1" "%2"4 `9 s1 U. q \2 l3 ?, s# U. w9 P
批处理文件里,用这个格式把命令行参数输出到文件& S/ u: F# X6 N5 B! e
* y) X2 x3 t4 X1 h
29 if
; O* [, _; ^! X- R3 t5 x判断命令
! F: F* ^6 j; X) Z/ V8 Xif "%1"=="/a" echo 第一个参数是/a
2 h/ |+ Y0 Z; x! N; ^" J# b gif /i "%1" equ "/a" echo 第一个参数是/a4 U8 r% v( T$ d. D' R) J
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
- ^4 O( M+ `3 r0 x& }7 |8 ^8 kif exist c:test.bat echo 存在c:test.bat文件
+ x2 d3 c* ?' j: zif not exist c:windows (
% f! Y1 W* H- [2 P/ C: hecho 不存在c:windows文件夹4 R5 L5 K! e/ V" m- O
); ?9 t% @0 B% f* q" j: u( i8 X
if exist c:test.bat (
5 O+ Z+ \3 z0 h2 F7 K% ~echo 存在c:test.bat
& O7 W, N" `/ m" [) else (/ p. z8 x/ q- S; q
echo 不存在c:test.bat9 i" S3 C+ U( p: p1 T3 R0 F
)/ t0 }: \2 h" S% D; p% l
30 setlocal 和 endlocal
7 V; D5 a- H) D8 n' c j设置”命令扩展名”和”延缓环境变量扩充”
7 {/ L% G- B# z/ n `1 Y+ wSETLOCAL ENABLEEXTENSIONS #启用"命令扩展名" V# y0 ?! F$ ]% Y, T. y
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名": x" v8 R9 x- B
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
8 D4 Z C% B( B5 J, p3 ZSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"- ^) z/ E5 R. N
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态$ Z) H& I& i/ [* o$ N
“命令扩展名”默认为启用
; D- D0 D7 o2 D/ i9 f“延缓环境变量扩充”默认为停用+ R2 c: p# h9 O ?, U' z
批处理结束系统会自动恢复默认值
6 q7 w) X- B6 s4 ?可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程1 z* n- p% n+ n: W1 E9 v( k* K9 N
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
! `1 T( W* K# `3 _- W# r保程序能在其它系统上正确运行4 v* I9 f/ k/ d8 d4 ]: E4 H. s
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
! `, e- j$ c2 Q1 G+ z$ T! H8 E- l' |' _# b4 V6 T5 p
31 set
5 a4 ~) z8 [* |+ r( }9 m7 `: Q设置变量8 r, a% m0 E: A8 C$ ?
引用变量可在变量名前后加 % ,即 %变量名%
; X8 r: ^ v: `. A# [# N% P% dset #显示目前所有可用的变量,包括系统变量和自定义的变量$ @" M; ?2 W/ ^
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
! _3 t8 Q/ S2 Y3 M/ E& qset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1" r4 E* u; u+ ^4 ~3 K
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2) e. _/ Z) x' y( M( C+ v
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
0 D3 P$ t: n) q, {3 H: mecho %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
1 [" c4 d8 W% N1 m. Zecho %p:~6,3% #显示第6个字符以后的3个字符,即aa2/ C1 F" x: E5 w5 u; v- ?. D+ ^( X
echo %p:~0,3% #显示前3个字符,即aa1
K4 D _& q$ H( D( R3 _3 v( v" Techo %p:~-2% #显示最后面的2个字符,即b2
2 H: x4 _9 Q. b: kecho %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b2 U4 Z% l- l" g# g5 j$ s
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb28 `8 @7 U- ~. I; }0 i& b
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
, R2 x5 O: x' A' Cecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
( E& v- b b- J4 dset p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2+ s! Z0 a3 w' X/ t O* v! {& [
set /a p=39 #设置p为数值型变量,值为39
- _) C( f+ [" Q; \, x) hset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
. z. M6 {2 J+ W4 F! Yset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用1 n. q7 B( F8 E! b* {& p
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?/ r% B$ }# Q1 L$ |1 ~9 F0 Y- j( r
set p= #取消p变量) _% r7 b8 z; U {! V* i# E1 \
set /p p=请输入" h/ ~6 ~0 Y; X. @4 h9 l6 c
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p& r* l* Z* i8 \& _$ d) q+ z5 K
注意这条可以用来取代 choice 命令/ [. F) B1 E& q) H5 b1 r
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
! L2 f4 I9 J$ q3 i+ m0 |. B% o" k@echo off' w0 h( z c7 E4 {
set p=aaa) z! s/ t4 k$ ?) {/ F; ]. f2 m
if %p%==aaa (
$ [- d& }+ G6 P+ @echo %p%, S A8 L/ @3 r' n7 m' [ c
set p=bbb
& `9 ^ C! P5 Q* v2 aecho %p%
8 ^( n/ Z+ N' W% A)
3 w& K) j* v: N8 l# h) o$ ?结果将显示
4 R* A/ A+ w0 d" }+ |aaa
b1 j6 ~) `& z5 p4 a& V2 S0 j" Xaaa* Q' B4 a$ ?0 N8 L
因为在读取 if 语句时已经将所有 %p% 替换为aaa& s5 u! U$ T) K# U! _
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"5 m) y' K5 y/ B+ l
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
4 u7 s9 Z2 {0 ~% J5 ?; a@echo off3 `$ _% d5 Z+ T& _! L
SETLOCAL ENABLEDELAYEDEXPANSION
! l+ T6 s* a& Q9 T' qset p=aaa
4 w, M6 B# N: N* a. x! Oif %p%==aaa (8 F5 G) A i; v9 L( w; Q8 i+ c+ h
echo %p%
* K; C; t6 S8 M6 h1 l+ wset p=bbb
0 c3 P/ ]6 ?8 k x1 H. w, Uecho !p!, K* n& {+ a( q) |
)4 d6 I: U$ l" N5 U7 R) y
ENDLOCAL$ F& g2 A' d% K
结果将显示
C2 \3 T2 O) ]3 O e/ E1 maaa2 G0 F$ s2 Y# B. o% a, V6 ^) j$ }
bbb. H2 Q% ~& x% K" I
还有几个动态变量,运行 set 看不到( G6 I* ?/ k. I5 R; ~
%CD% #代表当前目录的字符串
4 Z. H- I3 \8 @0 X+ Y! \%DATE% #当前日期! d7 a( u& L% m {8 h7 N
%TIME% #当前时间
* N8 e' K/ O9 e! P, h3 t0 d8 [( C%RANDOM% #随机整数,介于0~32767* g! t+ }+ I) {/ t' j, V( G
%ERRORLEVEL% #当前 ERRORLEVEL 值- p! V0 z: [- }
%CMDEXTVERSION% #当前命令处理器扩展名版本号% U4 A8 r8 B- q: x
%CMDCMDLINE% #调用命令处理器的原始命令行
4 n: ~2 T4 A3 e6 |& u; X. p$ M可以用echo命令查看每个变量值,如 echo %time%3 [" G1 _1 D1 q+ ^7 ?9 r
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
& |: D) W* T! B- Y1 {) ]! I( H. l2 s) W& U) W) K
32 start
; k; r9 F2 h0 _4 t1 m批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
7 s6 i; w& \, q0 o/ o
1 ]1 b$ g4 k6 p& n3 H+ {/ l33 call7 S3 [* |4 ]5 C$ ~. k% Q9 [1 F& J
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
; o5 q& P. P- ^有时有的应用程序用start调用出错的,也可以call调用
; l+ }' v* x% I, _. h: o0 z/ w2 n( `8 b! o" E
34 choice (外部命令)
, c# w. |+ U4 n1 {2 z选择命令
" C9 ]/ V9 Q7 i5 ]3 H) j9 z1 }让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……7 X& w7 f8 X3 C/ T8 {+ I E8 ? Z% ~
win98里是choice.com# ]" O& m* }- i3 ^ \3 L A, i# m
win2000pro里没有,可以从win98里拷过来) B' ~- T9 s: r* |. e, S; o$ I
win2003里是choice.exe, o( h+ n |: X/ }# U% Z' n
choice /N /C y /T 5 /D y>nul
7 A, R% O Z, {0 w' d: R* _' F/ J延时5秒! X" G* ~; g' B8 E5 w; w
2 W" v2 R Z4 j7 B
35 assoc 和 ftype
2 u- J1 E- H- {2 p0 w% q" }) o文件关联
& U3 L! s# m! p6 z1 Oassoc 设置'文件扩展名'关联,关联到'文件类型'
0 G1 B( J) y6 E) ]. `ftype 设置'文件类型'关联,关联到'执行程序和参数'
V8 @: U, u; e- L- `. z: x [当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
; S) l1 a: Y. O* j) s7 K1 j& j而是先判断.txt属于 txtfile '文件类型'
1 T3 k; P) E. W再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1" b, w) t. K( Z, ^ v! G
可以在"文件夹选项"→"文件类型"里修改这2种关联
5 y% m& ^, n# o, C aassoc #显示所有'文件扩展名'关联! `; g' s' Z9 o+ r
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
* U% i' ^( E! Bassoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
+ Q3 f' E8 Z1 m8 hassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile; [. s8 t [) _& a3 N( s
ftype #显示所有'文件类型'关联1 ]5 D' l& k$ b9 b; }
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
# ]( y2 |8 e/ n8 w+ U# qassoc .txt=Word.Document.8
v# o9 U; |' X9 T5 q+ P/ {. u设置.txt为word类型的文档,可以看到.txt文件的图标都变了
" ?. ^9 `3 H) A0 Xassoc .txt=txtfile
) G7 V W) Y7 M3 t( g O& u6 R恢复.txt的正确关联) w3 J. W9 m$ B6 }
ftype exefile="%1" %*
" F: t" Y8 a( Z恢复 exefile 的正确关联
. n2 N* D; Q3 r" B" ]如果该关联已经被破坏,可以运行 command.com ,再输入这条命令6 P2 e! d9 |6 I2 T
1 E0 ]& T7 Q: W) X" V36 pushd 和 popd
5 m$ c7 i w* X4 Q& H$ N切换当前目录; U6 [' g4 q: C
@echo off
- m$ q* G2 K S! pc: & cd & md mp3 #在 C: 建立 mp3 文件夹2 h" K, A: M7 n9 Q# E4 ~
md d:mp4 #在 D: 建立 mp4 文件夹- n7 x/ x2 B2 n% }9 f4 x# l1 E) ^
cd /d d:mp4 #更改当前目录为 d:mp4& k6 V+ v; | j* X
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
' f5 G9 H5 l& \& Qpopd #恢复当前目录为刚才保存的 d:mp4- U- P9 I+ G' o4 L
& f2 ^4 W5 o, |+ f8 U
37 for1 s7 E. {; q! v" `9 t0 Q7 S; S
循环命令$ g* r/ F! U% t' b& |: W6 W
这个比较复杂,请对照 for/? 来看5 k# w; t0 j* S
for %%i in (c: d: e: f do echo %%i1 S) ~3 d0 j5 ]! S) ^, U
依次调用小括号里的每个字符串,执行 do 后面的命令
! {3 n) V, V! v7 j. d% I6 [5 w6 p; o注意%%i,在批处理中 for 语句调用参数用2个%
p7 ] y3 g1 U默认的字符串分隔符是"空格键","Tab键","回车键"
' A5 i2 W9 n' n) \, X$ vfor %%i in (*.txt) do find "abc" %%i
8 h$ V3 ]4 A7 q& I对当前目录里所有的txt文件执行 find 命令' O5 y( c3 L# {1 X
for /r . %%i in (*.txt) do find "abc" %%i" P6 C$ W l6 U) R5 [# n# \
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
5 T; k1 @- ?0 U" gfor /r . %%i in (.) do echo %%~pni
( j$ K6 k* N: T- t0 d显示当前目录名和所有子目录名,包括路径,不包括盘符
' M3 g& ]: P mfor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
# Y( f$ f: A2 A ]* P9 o) f2 L把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
0 h1 L# q; V# P* b0 e* }for /l %%i in (2,1,8) do echo %%i
$ ^9 {7 Z3 G3 T+ q! ~8 E' \3 D生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
& K* x8 b. O+ I/ P3 _for /f %%i in ('set') do echo %%i9 v* L* `. t+ r$ g# j" D3 G1 D
对 set 命令的输出结果循环调用,每行一个
6 g2 F5 }9 R/ tfor /f "eol=P" %%i in ('set') do echo %%i
0 F/ O9 U! |' y" N0 E+ K+ E; U: J取 set 命令的输出结果,忽略以 P 开头的那几行( ^& I; G* t& m' [
for /f %%i in (d:mp3.txt) do echo %%i
3 O3 \5 u: O% G- v1 c( m! a显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
+ O4 F* T& e; Kfor /f "delims=" %%i in (d:mp3.txt) do echo %%i6 h; k0 X/ ~ z( @: J8 O$ |; N% W
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
" ~1 A( D2 q& N' s! Lfor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
v v+ C3 W4 u+ y" k2 s5 q) M0 G对 dir 命令的结果,跳过前面5行,余下的每行取第4列: K4 A J- k* K8 q1 P7 { I
每列之间的分隔符为默认的"空格"5 E: T0 z; ]/ ^# O9 [& t' G
可以注意到 dir 命令输出的前5行是没有文件名的 g3 a* k$ f1 d9 e
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
9 t! B. x( X7 E. F: l1 aecho %%a
! [. H: D) X6 w2 t3 U; @8 decho %%b
- J3 }8 ~: z) b/ n9 M5 aecho %%c
R3 X0 W) d4 i& u)
% I& Q) }- E; t4 Y! S7 `对 date /t 的输出结果,每行取1、2、3列. f7 {" R! N; ?$ @
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列* O4 |1 K8 R7 Y5 P, Y) C" o
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"1 F; b9 o& a/ }7 w
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
0 f6 v* e6 l! X. m! e+ x9 r& rfor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b) {' J4 {. g& _+ t% w6 x) r6 G$ m
取第2列给 %%a ,其后的列都给 %%b
. m( G: Q& j7 Y- S0 s( t4 T9 C1 C, Y. J0 n( t5 j
38 subst (外部命令)$ b L& o9 a* b& A' }
映射磁盘。
1 b& x; l* @) \subst z: serverd #这样输入z:就可以访问serverd了
6 l6 |6 @* \) |& ~: J Ssubst z: /d #取消该映射
( D8 {' u9 l" @8 f; L _subst #显示目前所有的映时
: C6 i( N2 M# n! X. d
8 m9 s1 J1 p! j1 o) y7 ?39 xcopy (外部命令)
1 M1 a j5 D! e, y5 u, r* }$ W文件拷贝2 _! i' r" e1 U2 i
xcopy d:mp3 e:mp3 /s/e/i/y8 m) m; n; [% b! U7 R
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
6 Z+ Q- U' |6 J6 n* i8 {2 U- v加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
* P1 G- u9 o- E1 T3 \6 z
- A9 J b7 B: @常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退1 r2 e& W2 X8 D' M# }
- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:
6 }; ^1 ?- p) D6 _* U2 v8 B 7 v9 o0 `' l9 e1 R( ]( P- b' L2 j
@echo off
3 f. k/ |, }5 g# [1 {# s) t) H8 ~set p=aaa1 i5 u0 |3 M; s9 T
if %p%==aaa (
) I* k, x6 d M+ Iecho %p%
# i* {9 @5 j5 A; Vset p=bbb6 E3 D; ?& Y1 i5 c; y s
echo %p%5 a- R y! \/ M5 F' Z* L- [
)
4 l6 } D$ l; B8 z3 x& I# w. Q* r' Epause
截图:
% Y" } ?; Y$ k& { 2.批处理.bat 文件中输出中文乱码 8 J9 r" K2 I8 o+ |6 C& Y
- 原因:记事本新建的文件,编码不是 utf-8
- 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
- 操作截图:
) j. z$ _9 Y9 W - 效果截图:# ~9 T( `. c- L
5 ^! U! Z: w5 v" N
/ g, F" @* I7 S: _
* J/ g- M" n( {9 D |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|