|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!
, g$ g1 d3 Y; E 前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效! K2 c( n' E1 l" t( ?* o* K
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展/ D" F& ]+ B* @: T# F( V. W
名为bat 目前比较常见 的批处理包含两类: 3 ^4 l; B6 o/ t6 T
- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
! @) E- @8 p5 L7 } o
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的, W' ~# e1 m2 L) _+ @: d% V
命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
/ y% k0 ~) O" V+ ` 怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
: {' {& ?. I' R, ^# x8 w 批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set. ~* n O) O% Y) _: L
批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||
# h7 S7 `$ `3 o1 O" Q# H 常用DOS命令- 文件夹管理:
1 l% G. H5 U( o& c* P& S E6 e: R% F& r- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。& E8 { S( \% V: j" |/ s# D! X
- 文件管理:" u8 p+ w8 ^3 H- T0 L& V- U
- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同 X/ s' a1 k- _0 d$ W
- 网络命令:
- u. \( \( A# }) u- L3 n% ^- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表
4 T4 C, o1 t! o8 x
- 系统管理:: ~; ^) d. o: {
- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置
* C: r3 o5 }. J x; H' i+ N
5 R! o. ^: K% I* }
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /? 7 `& b- l2 N7 g9 k
5 ~2 o/ o! v: F0 U% h
Windows Batch 常用命令
/ N/ T* l6 I; P/ W0 @. k: |( I1 echo 和 @
4 \. F+ p7 i3 d( \回显命令
( R1 J1 C) P1 m% B/ r3 |! ^/ V@ #关闭单行回显
6 b) S3 ~+ h4 S n2 N8 w( g( ]echo off #从下一行开始关闭回显
6 d4 `/ B4 h! M- M; C" Z' ~. R@echo off #从本行开始关闭回显。一般批处理第一行都是这个
' W B% n3 J6 h& T; m* Secho on #从下一行开始打开回显4 d4 j, Q' ^, [" Z' V2 s$ O" x
echo #显示当前是 echo off 状态还是 echo on 状态3 m0 m% [$ b8 D5 V7 d' {
echo. #输出一个”回车换行”,空白行
: z: n; ]' R* Z: D! |#(同echo, echo; echo+ echo[ echo] echo/ echo)
" Y: _' C2 v9 J& |4 ]- G' d [8 y
2 errorlevel3 |' _; c6 L1 o5 k- J
echo %errorlevel%- [. X p* {0 t- I+ A' l( G& h
每个命令运行结束,可以用这个命令行格式查看返回码& X0 M: j" ]* @% b$ I+ ^, m" C4 M
默认值为0,一般命令执行出错会设 errorlevel 为17 Y+ f- a/ m$ S/ g+ q1 K% Q& K4 ~3 T
! ]6 I" |- V" L+ h& w L j3 dir6 B# N& E2 F T, z, C v; _7 e
显示文件夹内容7 J5 A/ j# W2 W$ V+ U; @
dir #显示当前目录中的文件和子目录$ a6 b# r. u! B! Z
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
, F" d3 N% K6 \& A6 \/ udir c: /a:d #显示 C 盘当前目录中的目录
5 s. t* {1 J( V5 K+ Odir c: /a:-d #显示 C 盘根目录中的文件
; m: ]. c$ o6 V% G/ j. r3 xdir c: /b/p #/b只显示文件名,/p分页显示: Q9 L0 n- F0 z4 n
dir *.exe /s #显示当前目录和子目录里所有的.exe文件( y/ k& u" ]0 V$ J% n6 W5 P& l
7 U) h7 p! q9 |$ P5 p: J# e: l. B4 cd
1 i( P/ N5 D5 I1 a! c+ V2 v切换目录
# _5 b3 g4 n1 L3 p) xcd #进入根目录
. }3 [; s G6 Z5 q0 xcd #显示当前目录
( G7 m! G1 O8 t9 p( Icd /d d:sdk #可以同时更改盘符和目录
4 X" w4 |. k6 d4 [& u
1 M$ e+ i* C9 l& J. U$ {/ @/ r5 md# Z4 b% R; y1 C1 H: }6 J; Y
创建目录, G5 `! D' R# l/ i6 J; N
md d:abc #如果 d:a 不存在,将会自动创建中级目录; ?6 e* x, t. ~4 [
#如果命令扩展名被停用,则需要键入 mkdir abc
; I8 U4 Q) n: O! n- g" E9 g, `4 O5 y2 K; T7 h9 \3 ^
6 rd) D1 k! s$ P1 q \2 c
删除目录
2 o. m" x* o. m" N, srd abc #删除当前目录里的 abc 子目录,要求为空目录2 s& V! M8 W. r9 j; q1 A9 X
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
: e! m# ?0 n" V7 L; H/ r R! L' W- X U
7 del
9 W9 f3 w9 ]: j' |删除文件; b3 m. P8 x5 h) N2 b7 s5 |
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件- f1 T: s f4 o0 I5 |4 W! T
del /q/a/f d:temp*.*
- o( ~# L2 W. C; d删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录1 k" ?7 ?/ `7 o( c+ t6 v
del /q/a/f/s d:temp*.*2 L U5 g, X; L; |3 X$ g% I
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录/ L' {0 ], F! a% b
& i3 _( j0 F% V. J! |$ B& k
8 ren
, R4 q4 Q3 A2 F" j+ i重命名命令4 n3 M( A/ ?% q, N7 b
ren d:temp tmp #支持对文件夹的重命名
. P5 y3 J" t% ^& g% K
+ }% b, b" p) o( i& h' [+ |* v0 D; y1 i9 cls- Z2 x4 Z. O! W) l9 k/ {1 ?& M: _
清屏
/ k; i z' y- L% s& H. W, i10 type
8 R% r5 s9 R& _* u' ~+ q显示文件内容* d7 R: y2 _8 P3 S% ]
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码$ p! u/ \; k9 _" E6 `" ?8 h# s
type *.txt #显示当前目录里所有.txt文件的内容
+ K8 d# L9 A5 y: O- f. _
2 v* C1 ?+ A& S/ r1 N11 copy
4 D2 _ b8 D6 |8 Q4 e拷贝文件% e6 }7 R& w/ u" K/ q2 v& O
copy c:test.txt d:test.bak, g8 p: y4 Y$ q, F: H' X
复制 c:test.txt 文件到 d: ,并重命名为 test.bak( U2 }! @7 A* Z
copy con test.txt
* b! i6 G0 B2 K7 [$ ]: R从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件0 x. F6 _; c/ ]+ T+ f3 c! v2 z* b' r
con代表屏幕,prn代表打印机,nul代表空设备( z/ m# l. ~$ w3 u A' e7 V
copy 1.txt + 2.txt 3.txt( z& x$ h* R! O u! i+ W, E
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件 h: m/ B2 A0 Q0 B, ]6 q; v7 j
如果不指定 3.txt ,则保存到 1.txt' i" [9 j1 u3 n, c& V1 U" V
copy test.txt +
4 H& Y7 Y! O- ~: e- u5 S复制文件到自己,实际上是修改了文件日期
' g& ^! g0 Q! e- Z# t# R0 d
) O& b& v* _+ a% O4 A% J, i12 title
# H# r: l7 d% {0 g/ G设置cmd窗口的标题1 z* m# v1 O) W" X
title 新标题 #可以看到cmd窗口的标题栏变了
& z7 G; G! _$ k' G7 A. t/ \ c
{3 z* J5 c! @$ f% j2 a13 ver6 y3 o! C7 C5 R* G$ ]
显示系统版本7 `/ J J8 ?. V) p, Q5 ^
9 s8 T; {* w7 C
14 label 和 vol
9 @: G- o3 P+ }8 r3 j设置卷标& I; L/ A$ x Z8 p2 M' n3 n) I
vol #显示卷标
% o v5 x2 _0 A0 e+ P8 xlabel #显示卷标,同时提示输入新卷标* W8 J& U! f0 U# q7 {
label c:system #设置C盘的卷标为 system
1 z$ @4 {- W5 z9 M% N! |( p) Z( P& e9 T2 b
15 pause
- v' J- H7 @7 W+ y0 `; h C! J S暂停命令& Q2 {8 Y1 ^" _" a
4 p" G* E( R7 C# u16 rem 和 ::
2 X4 g' a# y; \2 m" [* E注释命令( w( H6 [* Q- G' i$ p1 Q6 c; n
注释行不执行操作
, ]. u& I t1 b% ?- y5 @4 `# S% E1 O3 e
17 date 和 time
5 F' X" E1 m0 V1 ?- d, E2 L日期和时间
1 Z& s! S9 O0 C' X \date #显示当前日期,并提示输入新日期,按"回车"略过输入
. I* f! C5 f) H, ydate/t #只显示当前日期,不提示输入新日期1 h! a( C* K2 N' J# i
time #显示当前时间,并提示输入新时间,按"回车"略过输入( x7 T8 ^5 ^( E# ]+ g" L' H
time/t #只显示当前时间,不提示输入新时间7 l7 e' w# v7 P E8 S2 u
~& H: T T6 X4 c& F
18 goto 和 :
" h. z9 h9 J$ V. x1 V3 M跳转命令( @# \% z* X% V; [! P- J, c# p. x& T
:label #行首为:表示该行是标签行,标签行不执行操作
% a+ l# y: {" U+ O4 ^$ Egoto label #跳转到指定的标签那一行
5 o3 j) G# ^5 }) h! h( o
% E7 W$ d# A8 o19 find (外部命令)* C* H9 [: r) y" f) F
查找命令8 X3 t& E0 U) p( ^& A
find "abc" c:test.txt
* h% r1 q* I1 ~3 C9 s在 c:test.txt 文件里查找含 abc 字符串的行
2 h9 p7 C6 g3 D1 Q" {如果找不到,将设 errorlevel 返回码为1
6 O9 s5 ]# Q$ B% l* \0 H) Qfind /i “abc” c:test.txt
" {1 ?/ G7 ]! R; W1 U7 M2 P( L查找含 abc 的行,忽略大小写
2 e# w2 `7 |# r" M! ^) t* K* wfind /c "abc" c:test.txt
$ y" k/ ]) \" h显示含 abc 的行的行数- n0 P% ]! }8 k- t2 L+ k+ d
& J8 v# U# L( H+ s8 ^2 V
20 more (外部命令)* Z) B8 D; L1 C; A
逐屏显示
( n# r: v0 r$ G" \% hmore c:test.txt #逐屏显示 c:test.txt 的文件内容
$ y$ E- P# B2 d5 U5 V$ m9 M. p! B J+ G$ ]% G( T/ V7 F
21 tree
, Q0 D/ j3 D" D显示目录结构
1 p* K- \) S4 a+ s( Q+ Z* |tree d: #显示D盘的文件目录结构, Y6 a. N9 \7 ^$ ^9 b9 z
9 ]. U: ~( h6 }3 i+ C; t
22 &0 w; A9 r H+ ^% S8 R! v, k" g
顺序执行多条命令,而不管命令是否执行成功
' f8 N7 F, t6 _5 C( W& e" L5 D
( m; s! [; g% i, S- [* l23 &&4 V, |) C1 P( g8 j& o* B
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令4 A' f+ s# }6 F0 B+ E. p7 z
find "ok" c:test.txt && echo 成功) R h# y7 H& V9 t" C
如果找到了"ok"字样,就显示"成功",找不到就不显示
9 @6 F7 p6 D; z
1 g: E; ^+ O& I$ Z1 c2 I) ~8 K24 ||
/ l" S4 @" z0 [7 O+ X顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令% d% q5 v+ b" u! i6 R2 b
find "ok" c:test.txt || echo 不成功
( r! x1 z+ U: _1 L. G3 m1 q如果找不到"ok"字样,就显示"不成功",找到了就不显示
3 b0 g S5 z* M; }
% c$ p/ y, ]' P- u! g- r0 F+ H* u, _25 |
& {* D3 t7 d4 y# y7 F! ^- Q管道命令
( l- p) Z$ ] p8 z8 q+ Ydir *.* /s/a | find /c ".exe", q. G* k: [, f# V7 N& o# X9 u
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令; \4 A" k# G5 {7 d! d- K3 |* |5 L* `+ x, `
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
/ L7 w. _5 G; z N. ]+ e3 n* [type c:test.txt|more
* V3 ?6 O2 ^! ]6 N这个和 more c:test.txt 的效果是一样的2 _( }/ Q; S' ^5 {2 L" z
+ R" c- y$ a1 ~" `& {
26 > 和 >>
' A+ Q# C# P; `) b输出重定向命令- J1 |8 [5 J/ Y
> 清除文件中原有的内容后再写入
^! ^- j! R3 X' S5 Y+ x>> 追加内容到文件末尾,而不会清除原有的内容" ` n( M2 ]/ N6 O" U0 q) a
主要将本来显示在屏幕上的内容输出到指定文件中
3 F+ f. d; h' ?0 B! N指定文件如果不存在,则自动生成该文件. K7 X. ~% e% v7 i/ {* ^
type c:test.txt >prn I8 }1 F. P- H* |
屏幕上不显示文件内容,转向输出到打印机
( U6 j u; [' X7 ^: }echo hello world>con
. B; |* _- q2 v' K1 `; P在屏幕上显示hello world,实际上所有输出都是默认 >con 的 b- f' x' m* G9 m
copy c:test.txt f: >nul
7 M6 K) I' K9 i+ s# U拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
" Y1 J& B4 ^# `! Q, vcopy c:test.txt f: >nul 2>nul; R" O/ C6 y+ h+ t5 @
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
; k8 g$ m$ M7 T" Z, w4 Necho ^^W ^> ^W>c:test.txt) j6 `# M; J2 {7 \
生成的文件内容为 ^W > W- [( a5 v! K9 J; N
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号6 [* k8 M0 u Y: P \
, g2 P1 S) L3 M# T
27 <) S( _ s: f! N0 ~1 L& |
从文件中获得输入信息,而不是从屏幕上
$ ^4 g' E/ r" n一般用于 date time label 等需要等待输入的命令9 Q: d4 [5 l2 w% {) x$ k. T9 A5 I3 T
@echo off
) l+ n+ i7 V. Gecho 2005-05-01>temp.txt+ o% x" _6 ]8 W3 r
date <temp.txt+ T9 q9 V0 E( N# ^$ P
del temp.txt7 } e3 F3 j* s+ A2 n+ b: z
这样就可以不等待输入直接修改当前日期4 x' c$ k5 F$ z' e; W
* Z3 }1 N$ p: f* O: j28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*$ T/ j0 c6 X! p$ |' D
命令行传递给批处理的参数
3 Z; @( y3 w/ C# V9 B; u0 r% a H3 y%0 批处理文件本身# D/ b& W& D) z8 W e+ y8 k
%1 第一个参数
5 E) i3 Q( m. n# E3 |/ o%9 第九个参数
6 D L8 u; V# o/ G$ R$ G4 x%* 从第一个参数开始的所有参数
w0 M) m3 U% d* V1 I批参数(%n)的替代已被增强。您可以使用以下语法:
+ t. ]; k1 F4 ]- O$ |! n p: v%~1 - 删除引号(" ), 扩充 %1) N3 \' @, E5 }7 C
%~f1 - 将 %1 扩充到一个完全合格的路径名
% I2 ~, ^" U3 X+ _# }0 E+ I3 [5 v%~d1 - 仅将 %1 扩充到一个驱动器号
! B4 J: s7 d) G( L) K: n4 `%~p1 - 仅将 %1 扩充到一个路径6 J: Y- J$ d$ @* H
%~n1 - 仅将 %1 扩充到一个文件名. Y* ]& r: s0 Z# f
%~x1 - 仅将 %1 扩充到一个文件扩展名* j6 e0 O% r5 K4 ^1 g
%~s1 - 扩充的路径指含有短名
8 A; E, J/ ^5 ^$ ~& N2 ?. u%~a1 - 将 %1 扩充到文件属性
6 A8 b% K; N- W. E/ T/ Q%~t1 - 将 %1 扩充到文件的日期/时间8 b9 B* s. @$ q; \( R6 t
%~z1 - 将 %1 扩充到文件的大小
8 d. e- A/ u6 M4 x, z% U%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %12 F1 s) V+ p5 g
扩充到找到的第一个完全合格的名称。如果环境
$ b/ g! f' A9 w( Q0 G Z. F变量名未被定义,或者没有找到文件,此组合键会
; E2 I. s& g, A6 a! b* ]扩充到空字符串
1 V) a( G& Q- ~# W2 M3 G/ o可以组合修定符来取得多重结果:' y2 e1 s5 \4 L: L! N P
%~dp1 - 只将 %1 扩展到驱动器号和路径3 a6 K/ i/ k. o
%~nx1 - 只将 %1 扩展到文件名和扩展名
J6 U1 r& [5 p. |) A4 N; T6 A& X%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
. }$ T* P5 o/ v2 A% W }并扩展到找到的第一个文件的驱动器号和路径。
0 r4 B% {: k( t. b0 ]# B1 V7 C' X7 j%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。. V3 s5 e6 `, }" ], C) q
可以参照 call/? 或 for/? 看出每个参数的含意
% I7 e9 A5 z8 Q; u+ pecho load "%%1" "%%2">c:test.txt) w8 W& e4 K' S2 N% A: \
生成的文件内容为 load "%1" "%2"
- ^9 P2 u4 A$ w+ b5 V批处理文件里,用这个格式把命令行参数输出到文件 A0 [1 I$ a- U3 C" i
9 }6 n3 _1 a w! p4 Q8 o5 ]2 P/ h
29 if
7 _5 j2 Z) I. f6 p. }% y; D判断命令' p- X B2 T4 r2 T, H
if "%1"=="/a" echo 第一个参数是/a- s/ ~1 [( L. @2 a
if /i "%1" equ "/a" echo 第一个参数是/a
3 N) @6 \0 s8 I) l+ V/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?* f9 R+ m" q T9 w9 {4 x# i
if exist c:test.bat echo 存在c:test.bat文件
% C2 n$ z& n C, @( D3 oif not exist c:windows (
$ Q: V. `) W8 W2 `1 V, _1 u, wecho 不存在c:windows文件夹) T4 x9 e( Z H
), r P& z O2 O' ^2 e
if exist c:test.bat (
% b3 x4 P. U1 V+ t+ Cecho 存在c:test.bat7 j- z( X( s- }5 ^% ?
) else (
! a1 S1 Z/ a* u) @9 z1 O" b# wecho 不存在c:test.bat0 b9 I8 q' M; ]/ W A E/ D
)
" e' p; X7 U5 K8 ^, n30 setlocal 和 endlocal, A5 b1 n) P) @. D5 C7 X
设置”命令扩展名”和”延缓环境变量扩充”
3 c# \2 d2 ?+ F' Q8 {SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
# D( O6 r3 p' k# f/ ESETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"2 x3 @" l. D7 H$ a! R
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充". A) b; U: Q/ S/ F. y' p9 \( }) h
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"0 {/ F! x3 I, g+ r) f
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态" w/ m1 V3 _) w" {3 G0 s
“命令扩展名”默认为启用
6 W+ U' y1 d! v“延缓环境变量扩充”默认为停用
: G, a/ {, z# T( }批处理结束系统会自动恢复默认值
5 r& j" o- n8 a8 C$ P: I+ U4 w可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程0 [, r% [, T J+ ]' T
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
0 H* M6 l$ `* `' g2 Z$ H# [保程序能在其它系统上正确运行
& A& B1 c, j, U# i B$ y# S; u; n"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
7 E! R& y$ y- {' {: ~" _/ M
$ I4 J) j6 q. D x, N; t31 set
/ {' b5 K" H8 }* R: y7 p设置变量3 r$ Q; K/ I$ n7 N; @5 o/ v! m# d. q
引用变量可在变量名前后加 % ,即 %变量名%
2 H0 O8 t! v/ cset #显示目前所有可用的变量,包括系统变量和自定义的变量1 S/ t! Q9 \5 F$ p! O$ u q
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
1 x6 G: E; b4 W5 O0 g0 d/ m7 nset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
5 S& o! i% y6 ^, z& b$ X4 qset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
/ e* W/ h% E7 Q4 r+ A1 ^echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2* t1 Y2 P: q* Q, I
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
% Q+ w3 B9 C Q- q7 e5 \# Jecho %p:~6,3% #显示第6个字符以后的3个字符,即aa2" R$ s f+ d' w6 b' H
echo %p:~0,3% #显示前3个字符,即aa1
0 e% H; P5 Z" J" T$ c( I& L# T" kecho %p:~-2% #显示最后面的2个字符,即b2
2 T( C2 B: T) X q5 Oecho %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
& C1 K. ~, ~7 t& b/ d, @3 d: yecho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
' P2 d+ ]$ x6 G8 u2 e4 s: d; gecho %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2! J$ w. {% j9 {/ n; ?+ B$ C
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2; X3 ?4 P+ ]( E, I, }. W; S
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
0 o7 `! w; g8 ]# _% Bset /a p=39 #设置p为数值型变量,值为39
+ l- k$ R3 G+ U0 n6 wset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3/ K; [; r' P0 V( ^* G
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
; Q1 I) A7 M& x+ yset /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
% U! S6 G+ B, R4 W# {" Cset p= #取消p变量
6 ~/ q8 t M( ?% Q9 p1 H( @2 Zset /p p=请输入2 l# a) ^# |& m% ^2 |: ^- J
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p+ Y# }% y f* H& U! L7 q6 b
注意这条可以用来取代 choice 命令2 g0 v" a1 T$ Y5 U, \
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
8 Q& w* x; e) }* x) S$ l9 n@echo off) S7 Y3 E! M' l, a e4 z8 b
set p=aaa! S' t1 T" m) t: f4 @
if %p%==aaa (
# U" r0 C7 ]8 }) a: m- yecho %p%
/ l, x [# G$ wset p=bbb
2 A! K5 R) \( N: qecho %p%7 ^1 Y! N' k% W; Y* c2 f
)$ ?' j% {; a6 Z! W$ O" w( y
结果将显示
1 z+ T) v1 D! ~: r; D+ V9 saaa0 h, X( U; t R
aaa
4 o# N5 k! g* o8 G* \* ]因为在读取 if 语句时已经将所有 %p% 替换为aaa. p: Y# Q2 B/ {8 u c
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"% V B0 a/ r" a3 @
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
8 Z: Y2 H* Y) b! c \) n% _@echo off
* {: M. \: n* ~; v# gSETLOCAL ENABLEDELAYEDEXPANSION
0 E9 V. |, B/ L2 nset p=aaa' V$ q# C, _5 T7 X% s
if %p%==aaa (
9 h' o# o4 Y& W* Qecho %p% G4 Y& x8 ^: \1 d; H
set p=bbb
! ^3 \1 V3 m L* Necho !p!
- t& C! e/ v8 g' J)
" |/ W Q$ A, L+ fENDLOCAL5 f- i! A- r Q0 E- u+ n% r
结果将显示8 P! s1 N& J( a: \; N8 a* ?1 G
aaa
1 V0 d/ e. w! u3 k @bbb
4 x2 x! G+ G7 H. r5 f8 n: ~' C- y还有几个动态变量,运行 set 看不到* P6 `( c/ F- q6 ? a7 [7 X6 p
%CD% #代表当前目录的字符串# f2 Q' w* V# d- D! `6 V9 z
%DATE% #当前日期" n6 M# M6 B$ M6 y: H! F
%TIME% #当前时间1 |4 E; z$ Y1 u
%RANDOM% #随机整数,介于0~32767
; E# l. z5 R4 y% w9 D3 @6 y4 {. j%ERRORLEVEL% #当前 ERRORLEVEL 值
4 G" y) |2 P3 C2 l$ V1 A%CMDEXTVERSION% #当前命令处理器扩展名版本号
' t' r' u/ R. A& w4 ~' D; H) A% [ }%CMDCMDLINE% #调用命令处理器的原始命令行
9 e7 G: C. Y% x5 g可以用echo命令查看每个变量值,如 echo %time%' Q8 o4 C: V+ p4 l! W2 P, g
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到+ r- O2 _4 A( w6 H
D6 k3 u: }1 o7 E9 A- P0 L32 start: L" B. u b5 f' n* N# C" Z
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令$ |/ @6 l# g% a8 F/ w( X/ V
( D/ p( f3 J! Z5 B: E) X$ Q# p33 call$ U0 }& v1 h9 {( V$ [) Z! q
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
/ j3 e3 v0 y9 R: S( |有时有的应用程序用start调用出错的,也可以call调用
?8 ~) r( a* Q( n ~* C4 h& ^2 C
( Z9 }" K* B# a3 l8 X. W34 choice (外部命令)
7 Z1 O4 I1 o) I, J% H1 W选择命令- u" h+ [7 G0 F$ W7 ?2 h
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
$ j8 I3 e( @; i7 g: gwin98里是choice.com4 G% G4 k! v+ _2 s( r- D* l
win2000pro里没有,可以从win98里拷过来/ }8 B& m' x1 X$ b1 u0 B; b
win2003里是choice.exe3 F: u" r1 x k& B1 M2 r
choice /N /C y /T 5 /D y>nul
: Y7 c0 {# h' B0 K延时5秒8 W( U! I+ @0 `6 d( J
' B* K9 E( T- M$ c! P35 assoc 和 ftype; t! H0 @, |- K+ X
文件关联5 J# C6 N; h$ f, r
assoc 设置'文件扩展名'关联,关联到'文件类型'
8 h7 b Z6 o' Vftype 设置'文件类型'关联,关联到'执行程序和参数'
1 b% @; i' B6 B0 K" ^当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开: @7 W' j* f- b1 q, v" i
而是先判断.txt属于 txtfile '文件类型'
: ^, c/ o( V" ^5 k! Y9 T' h3 s再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1( F+ r" {8 ~. v& H. `* C8 H
可以在"文件夹选项"→"文件类型"里修改这2种关联
4 Z, R0 A3 z+ k, W4 g- w6 Kassoc #显示所有'文件扩展名'关联( I1 s+ M; e) j
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
- s# O0 R- C# b3 l" Rassoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
2 c$ ], L$ ]) @. ^) p2 C( sassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
8 I1 k2 J" n. k9 E+ m/ dftype #显示所有'文件类型'关联( g% ^4 U0 \! l1 u" o* k+ L0 B3 H1 D
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
7 s$ K6 V9 W* o7 |6 {- d: D3 kassoc .txt=Word.Document.85 |4 K" ~ @0 M6 z7 B v
设置.txt为word类型的文档,可以看到.txt文件的图标都变了9 B4 S! t( I4 a" f+ V
assoc .txt=txtfile J! \, t3 k, d3 ^% Q% U
恢复.txt的正确关联
6 V3 O# D/ h( o6 Y+ I: d9 Iftype exefile="%1" %*
4 s6 i3 Z0 j0 I恢复 exefile 的正确关联: @& T u" f' x) p3 C4 R
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
) P3 t# F1 m0 a8 h
2 Q9 K c* s% O5 o, H36 pushd 和 popd
1 e: n# ~4 k4 l1 C4 O& ^# n切换当前目录* K( c# m3 u; k
@echo off
0 f9 f% j6 h5 lc: & cd & md mp3 #在 C: 建立 mp3 文件夹
. J+ k/ W$ p* r" }md d:mp4 #在 D: 建立 mp4 文件夹: y' {& X0 ~- n% I. @
cd /d d:mp4 #更改当前目录为 d:mp4/ N8 ^8 l! F5 {$ \4 d
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
, c; n2 t. L! ]. \popd #恢复当前目录为刚才保存的 d:mp4
% z+ Z. Y, A1 i' d8 z, s; A- a" n" C% h
37 for r ^" t( m- @
循环命令- k1 l" E/ G& q) }
这个比较复杂,请对照 for/? 来看
8 Y4 c0 j' a5 y3 T! efor %%i in (c: d: e: f do echo %%i9 c5 h* C# t" Q
依次调用小括号里的每个字符串,执行 do 后面的命令. {5 S: ~+ ^# B
注意%%i,在批处理中 for 语句调用参数用2个%
y; S+ a: n' C, a v5 S默认的字符串分隔符是"空格键","Tab键","回车键"
7 ]# s; P: ^, h4 E; t6 F% R dfor %%i in (*.txt) do find "abc" %%i0 ^, w, g3 a3 R6 i+ L0 g
对当前目录里所有的txt文件执行 find 命令& @* A: @# }! t, z( v" \% W4 G
for /r . %%i in (*.txt) do find "abc" %%i
/ H$ x3 H- b/ ]# E) w在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行6 D+ U7 |! ^! T3 v
for /r . %%i in (.) do echo %%~pni
8 d- f P( N# {) W2 s显示当前目录名和所有子目录名,包括路径,不包括盘符
?- t' o9 C8 E8 Y7 [* Gfor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt+ z! s" p# k8 R' K, ~3 X. a! r
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
# @0 u) {: `5 W" m* ofor /l %%i in (2,1,8) do echo %%i1 W8 U( ?4 u& Q; z; Q% b }
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加12 w8 s; K6 Q4 v0 w1 y
for /f %%i in ('set') do echo %%i
. D% r" M0 Q% Y p( R" J* s对 set 命令的输出结果循环调用,每行一个
5 q) ]5 l& R% c. T, d" O$ O% Hfor /f "eol=P" %%i in ('set') do echo %%i& [4 G" J- w9 S, r$ B. C
取 set 命令的输出结果,忽略以 P 开头的那几行8 d# ?0 l( _7 s! Z$ |% G
for /f %%i in (d:mp3.txt) do echo %%i" |0 R5 ~, x5 s
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
: s8 { v2 @2 b/ A! dfor /f "delims=" %%i in (d:mp3.txt) do echo %%i3 p: d: S" ?: ^! t" M
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
3 k- O& \1 i/ t4 |$ Xfor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
: l+ Q X* p/ X6 N5 b I对 dir 命令的结果,跳过前面5行,余下的每行取第4列
5 P; B' s3 z, |& E- s每列之间的分隔符为默认的"空格"2 A) V' r: ]. v+ j
可以注意到 dir 命令输出的前5行是没有文件名的8 a3 n9 M8 @8 g; ~+ [" G
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
4 q$ |7 C% z6 O. G$ Wecho %%a
5 c$ O$ W& D$ M/ S- techo %%b
( k5 o- h: \& a* }! g6 Y8 w5 }echo %%c
5 C. Y2 l0 u. e- g q)4 O* H% |" A: ^& U3 i1 p
对 date /t 的输出结果,每行取1、2、3列& d a% x- T4 A$ M' \# j, s
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列8 M/ M' E) F4 {
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
, {% f, s; a& e7 _, v; ~其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的0 S5 h' k; N# ^3 }
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b2 E/ m* l9 e2 j* I
取第2列给 %%a ,其后的列都给 %%b. j3 `' h% }( y
3 F4 ?7 @! y5 O- c A: ~0 @% D
38 subst (外部命令) z( y5 C( G5 S# J' W
映射磁盘。
3 M! [; h) H; V$ l# Jsubst z: serverd #这样输入z:就可以访问serverd了
5 R% H+ \) }2 e6 D; Z1 J5 ]3 ~subst z: /d #取消该映射
9 G$ U" Y8 C: l9 k7 M, Tsubst #显示目前所有的映时
- l$ h' q9 r- j- p5 m# V* I/ u- h4 w0 p' ]( `: e
39 xcopy (外部命令)7 b' q1 k/ Y+ u" d8 k, |, G% f
文件拷贝, R% F/ w8 G( H. O; p1 w" D
xcopy d:mp3 e:mp3 /s/e/i/y
3 ~8 J3 S% Y9 E i0 d0 |复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
! ?' E) {/ v1 s加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问6 U+ F0 P' D* ?! B* l$ l
3 ^+ t+ J0 s2 ?; M+ @$ H5 U& U3 ~
常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退: K7 V7 b- o2 h* u+ b
- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:; B7 H, g- i8 M
3 S- {5 `( B% f" v- G4 Q+ m
@echo off9 V3 n' y/ C9 a
set p=aaa6 z( n) ~! R0 j4 K& g& g0 a
if %p%==aaa (# ]/ u7 e% W% z4 T, q
echo %p%
: P; O( K# a. b6 s) `set p=bbb
7 l% [" _ z9 a2 j8 e- g; eecho %p%7 k: I0 ^$ n6 a8 W, ]" x8 Z
)
# w% c) d! Y) r# A( H" B" Xpause
截图:& R1 ]. O1 s. R7 V* a
2.批处理.bat 文件中输出中文乱码
1 k5 r3 @9 c! O6 S$ r1 I- 原因:记事本新建的文件,编码不是 utf-8
- 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
- 操作截图:
; [' T7 m) i% A @ - 效果截图: H" [ X* H4 u' U
2 C2 W9 n# T3 T' z 5 i) h! E" Q- n$ d$ Q3 e. N' w2 U
R: ?0 G$ L# [9 }5 ]
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|