|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!
- M$ H" G& h8 |$ {% ~ 前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效' c8 P3 G/ S* b* A. M3 u# N5 ~
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
; ~+ e( x/ ^; Q% E名为bat 目前比较常见 的批处理包含两类:
7 U" Y+ M2 y; O( _% O, z- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
' s" c4 D9 g1 {3 J1 C
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
; l- @2 _5 P* t* w' G" S3 z+ b命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
. C% [ W/ u9 `8 E' a o- ] 怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
f4 ]' j3 Q! r! P5 z7 K1 y 批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set; Z2 X1 C+ k. F" ~8 `9 W, G- k! O
批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||" {3 V* q1 i5 e; [' A
常用DOS命令- 文件夹管理:' y3 \9 C) U8 }' j
- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。4 {/ n% y! M* B9 T# p
- 文件管理:
' f8 |3 O5 D( A9 @& Z& u- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同
( e: Q9 g1 E* L
- 网络命令:% W: z$ k1 L: V: f
- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表8 i2 i2 X8 R B) H, J2 h
- 系统管理:8 V. r* J* R) o- N: Q: O; w) h$ P
- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置! b, ^) H2 e% r1 }
& o" y' l1 N+ e: L+ ?
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
+ J( F6 z e9 o7 Z# p3 W7 g2 Q2 w; ^
Windows Batch 常用命令
$ W) \) T' V# `$ z" `: }' f' C# J5 C1 echo 和 @$ j. j% y) l# b2 K4 ]
回显命令
+ {8 I' N+ B. M@ #关闭单行回显
8 D3 }( f3 y7 w1 k/ O& Q. ~( ?echo off #从下一行开始关闭回显
4 H+ ]& ~, v9 t. n/ M/ D@echo off #从本行开始关闭回显。一般批处理第一行都是这个, V! U: ]. r0 f; o; p3 o1 u
echo on #从下一行开始打开回显
9 q q G& k# |$ q$ O6 ~$ Vecho #显示当前是 echo off 状态还是 echo on 状态- E( g7 }. F3 @9 N4 i
echo. #输出一个”回车换行”,空白行
9 r% ^" @3 O* `$ _/ I1 W5 r( H. A#(同echo, echo; echo+ echo[ echo] echo/ echo)2 F; R2 o. U+ E. d
8 d( T" L( V- z+ j. _$ l4 y2 errorlevel
8 J. K9 U0 Y" ~5 |) g9 b6 cecho %errorlevel%0 u6 G+ K! b+ |9 ]; m( p# c0 v1 l
每个命令运行结束,可以用这个命令行格式查看返回码
1 ?0 d6 T, j' M v9 ~默认值为0,一般命令执行出错会设 errorlevel 为1" @2 i% p5 v) [+ l6 }9 M
1 ? t* C: @1 Y" b
3 dir
+ R7 A! F& h1 s" L0 |显示文件夹内容% u2 [$ f) l8 ?/ e4 ]0 I* D1 q& t
dir #显示当前目录中的文件和子目录6 [) _: \3 y& K4 H: L( ]* M5 _
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件4 _1 \5 W9 m' k
dir c: /a:d #显示 C 盘当前目录中的目录
3 J! h* Z& g& w8 y Y% Wdir c: /a:-d #显示 C 盘根目录中的文件; s. b; j7 i% y2 S
dir c: /b/p #/b只显示文件名,/p分页显示' d5 x- k+ E( q/ y
dir *.exe /s #显示当前目录和子目录里所有的.exe文件
1 F2 h7 b' A' p* x! Q) |4 h1 ^; h; d/ Y1 X$ J' ]# g
4 cd& \# O) A9 b. T! _
切换目录
5 u! Z$ j( t1 h- s- [cd #进入根目录
% F+ {9 `# U8 y( T7 R' }, \- x9 j0 ]5 mcd #显示当前目录
8 G( N ]: Z" y" |! [cd /d d:sdk #可以同时更改盘符和目录3 X- t& n: I% F
- Q5 ~" d- [ j, x: @- ^; [$ Z5 md' q) i. _6 O2 j- k
创建目录, v& J" s9 z+ D! ~7 M
md d:abc #如果 d:a 不存在,将会自动创建中级目录
" X7 z# x# o7 `& x% O- w e/ C, R# D#如果命令扩展名被停用,则需要键入 mkdir abc3 v$ H; ]8 I1 b; C/ z6 _1 \0 @
2 z& S. k( Z5 Y6 rd
7 f: X* Q. V M删除目录+ f. V0 d; Z. D+ ]. E. K. ^
rd abc #删除当前目录里的 abc 子目录,要求为空目录7 r5 C0 h, e1 y7 U
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
5 D' E( A! l0 Z& ~& t! m
2 U: h' E. Z# {# f) j7 del$ b1 h5 x1 a! b1 w6 {& Q% V
删除文件
, `+ t7 \* g; n V. L: {del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件3 A: ~/ F1 a2 u! E
del /q/a/f d:temp*.*$ j2 F% Y* ^6 y% [0 m+ t
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录# P, Z4 S; Y5 W# y& J( q" {: x( l6 S
del /q/a/f/s d:temp*.*
. O+ i* m1 z* @' `0 ?: |删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
( U2 ^ S( @5 o% F" P3 v& D* Q7 H0 L
8 ren) g$ ^" F' E# h9 A: B9 D
重命名命令/ X; d7 i; r7 B* ~4 L5 ]% k b
ren d:temp tmp #支持对文件夹的重命名6 U: D5 t& f9 n* q
7 B9 T+ c! ~! S" L, x9 q: N9 cls
' B M; G7 e* j- V% w清屏2 f" o3 T4 Y) }' |/ _0 T6 A
10 type8 k* u2 }+ B6 B7 q" w7 l7 }
显示文件内容
+ B1 R0 s6 U& m" T. Y& Ctype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
. I; H3 `6 u/ t* w9 j& Stype *.txt #显示当前目录里所有.txt文件的内容
/ a0 f5 w4 F9 `5 U! F0 U4 B1 T
1 s% D8 Y: J P0 ]5 K0 g7 o11 copy
2 @& A9 p9 {3 k5 J4 g$ [8 p拷贝文件
8 h% W7 `: v3 B+ @1 U# ncopy c:test.txt d:test.bak
. f" z S ?2 g$ @) } l复制 c:test.txt 文件到 d: ,并重命名为 test.bak( i7 m; o6 ?! M+ d: U. W3 \
copy con test.txt1 D. ?2 Y& V* a* w. k5 z8 w! K
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件# l; L$ d: f4 d: s
con代表屏幕,prn代表打印机,nul代表空设备
0 i6 {3 E, s( \$ @$ y$ Kcopy 1.txt + 2.txt 3.txt
' S, p# _1 J, n合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
; S( O9 m/ k/ Y) C' c, k如果不指定 3.txt ,则保存到 1.txt
, Q3 ^6 p6 x4 ucopy test.txt +* t$ V ^+ m3 v
复制文件到自己,实际上是修改了文件日期1 w! o4 K, ^, S1 z8 `2 G
) i$ x4 F. _! a
12 title- X$ J7 x& b8 r8 W, s3 @0 t
设置cmd窗口的标题, k' m- t2 h1 }/ T
title 新标题 #可以看到cmd窗口的标题栏变了+ _1 B5 b- k8 ~, J2 c0 Y* ]
% w, x! [& h. `6 c- ?* q0 g I
13 ver
. F* v3 G* k M! b8 p6 ]0 F Q# f显示系统版本/ y% h9 S$ {* Y1 x: ~
: i, ?/ V. H s: W: s1 ^14 label 和 vol
0 f$ v* s+ N* f. j% r设置卷标
$ i. f, J) B- V( K: Mvol #显示卷标8 R ^) d+ Q- n: O
label #显示卷标,同时提示输入新卷标6 j" b$ z6 Q4 d9 x8 C1 ~
label c:system #设置C盘的卷标为 system" W8 d. G& q9 i4 A
4 @) n, I; h1 Q( J( I15 pause4 {& a0 }8 z0 c5 s& k# o6 C2 y
暂停命令
/ {& f) C9 ?' k$ Y- \* j. z5 ~% J) x B" |% A; S3 O
16 rem 和 ::$ H& A2 d$ n- l/ e7 e: @: x
注释命令
0 p) |8 f1 }, R; M( ?9 ]注释行不执行操作* v2 l8 A6 x- ]& m" t
, `9 ~3 S1 a! V; f) O
17 date 和 time3 m, C8 Y/ A, G! a- g& h& T
日期和时间; c: ]/ G" I* F
date #显示当前日期,并提示输入新日期,按"回车"略过输入
2 w. d* r: p v( Q% hdate/t #只显示当前日期,不提示输入新日期: m1 F9 T7 p9 E/ U) a4 Y" k% G
time #显示当前时间,并提示输入新时间,按"回车"略过输入
' Z' i! i% h! e1 w; j4 F( F! Ktime/t #只显示当前时间,不提示输入新时间- k3 H8 E/ D- ]& G
+ F; f2 S! \" l' X: H$ F6 M18 goto 和 :/ B. e0 {# G4 l/ b" A2 F
跳转命令) r# j0 @* F) Y1 H
:label #行首为:表示该行是标签行,标签行不执行操作# h/ _% g& d8 A# L4 q
goto label #跳转到指定的标签那一行
/ K+ o* Z7 g$ ?9 }) t4 Z K
( Q% l, D# a f+ R$ R- c19 find (外部命令)
0 X% j2 `: s" V" M查找命令% p8 g; m) A$ Q3 _3 [
find "abc" c:test.txt- \- V9 T. a9 x; K" N" L7 {4 ]
在 c:test.txt 文件里查找含 abc 字符串的行. j8 V' o5 W2 W5 ^
如果找不到,将设 errorlevel 返回码为1 O; ]2 C7 W6 Y3 z/ N; I7 ]
find /i “abc” c:test.txt
2 ^! q5 @; g3 y+ \查找含 abc 的行,忽略大小写1 e2 q3 O& q C1 R- B3 h
find /c "abc" c:test.txt0 Z1 @- b6 i: B+ G% B c! a K& d0 S1 O
显示含 abc 的行的行数
* _( P3 m( K3 s* {/ o
/ }, Z% L6 u; e7 M. x0 O5 ~. P" J! V20 more (外部命令)* z e4 W9 K: f/ n! @' H
逐屏显示$ Z5 `) ^" \2 X; F- c, D
more c:test.txt #逐屏显示 c:test.txt 的文件内容; Q. T6 l( U! Q3 q
1 F8 G* T, {* w
21 tree* O0 r# q# Y" L4 [+ V7 ^! G% d# B
显示目录结构
5 t; N; j5 D( Ntree d: #显示D盘的文件目录结构, ~* Y3 D7 a: ?: c, d
- O& a4 c) I: P$ l. M2 Z1 W; b* J/ b22 &
( p3 \8 l; u& Y# z/ Z3 i4 v顺序执行多条命令,而不管命令是否执行成功 ^0 F+ x, G/ }9 v( U% [7 \! D
9 f/ u' ^% V9 l- |4 d( u. w( Y* A1 R
23 &&
B/ j7 Y. f8 [顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
A' Q% U+ [; i+ W5 Z @find "ok" c:test.txt && echo 成功
6 ]: F. p, S+ F0 G: p" G如果找到了"ok"字样,就显示"成功",找不到就不显示3 t. g) |) J* l0 H) V9 r
: I, r" W4 P# q" x4 H, N24 ||
# w: a0 ~5 N( P6 i5 Y$ z* N顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令! y# x2 k# c7 Q: d& e
find "ok" c:test.txt || echo 不成功1 h F p, V# g* t3 J4 o; M- R
如果找不到"ok"字样,就显示"不成功",找到了就不显示
7 M6 b3 k3 F, E5 M. M9 N$ S4 J: x% W% [7 N% W, }& E6 S3 S
25 |
4 j( E. M: v& ^7 y$ ~2 z管道命令
- C% C8 t( B: L* bdir *.* /s/a | find /c ".exe"7 i0 `' y: ?8 g2 J i
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令- L. B& Q3 S" a7 @$ C; a7 v
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数 x0 D/ U# N V3 C" M
type c:test.txt|more
& z. ?& J' H8 }4 w这个和 more c:test.txt 的效果是一样的# @9 r- C2 a) l8 I
: y; _+ Y* B, N* @
26 > 和 >>" f$ T* E4 g8 t# o0 Z9 w
输出重定向命令) `$ [( q. [7 [8 A o! ^
> 清除文件中原有的内容后再写入0 E7 s: N4 D: v' ]# U6 z+ K' Y
>> 追加内容到文件末尾,而不会清除原有的内容4 e% m% R& j, a! x0 N/ }' w
主要将本来显示在屏幕上的内容输出到指定文件中% r. R1 |) ]; y, \1 ~; F+ C
指定文件如果不存在,则自动生成该文件
* A5 Y) `( H6 G8 ?, }! ytype c:test.txt >prn6 y! W8 u) H- t
屏幕上不显示文件内容,转向输出到打印机
: x! |' x, L3 becho hello world>con
+ O# o3 m5 m; p$ j4 ?% @在屏幕上显示hello world,实际上所有输出都是默认 >con 的7 N6 }$ k1 j3 g/ ~; g
copy c:test.txt f: >nul+ n, R1 Z" k0 c% |$ }& \
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息4 c) x9 M- \( Z1 O
copy c:test.txt f: >nul 2>nul, w% ~1 H4 {! c+ L/ W% d5 A
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
; h$ }* j7 P0 T( Lecho ^^W ^> ^W>c:test.txt
( S1 S- S% ^: m* B* W4 |生成的文件内容为 ^W > W6 U$ b6 x8 a8 E$ y6 c" Z
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号1 D6 X' A' C% l( H% w. k% O8 C4 q3 }
- Y! B6 z7 A. C! g27 <
' [9 k! J) B: _6 Y2 O) S从文件中获得输入信息,而不是从屏幕上
3 r1 @" `+ \2 ~* p4 D4 U! `一般用于 date time label 等需要等待输入的命令9 z3 x- m1 X2 Y3 q2 V- O' p$ w
@echo off
+ j3 I0 l; t% K3 E1 B" c* zecho 2005-05-01>temp.txt# [" h g! `% d$ Z$ `
date <temp.txt" w" Z* C G2 f$ U, x& ~. w
del temp.txt7 F9 ]; P! l& D1 a# i0 F
这样就可以不等待输入直接修改当前日期3 b7 N& Q: a3 h. C( H3 _0 F
, X/ D+ h$ p/ e3 o$ C28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
+ r( i- s; Q( {$ y; F. L: I. m+ v) d- a; V命令行传递给批处理的参数5 x6 K" v m2 a- I4 E; N t
%0 批处理文件本身
& s$ B9 x8 b+ A/ r; H1 v3 q+ Z6 ~%1 第一个参数4 O+ P6 h' G0 j) @
%9 第九个参数' r8 { ~' N; Z: x. O
%* 从第一个参数开始的所有参数 _5 |, s" R5 t" d( y0 \1 V. o" @: f
批参数(%n)的替代已被增强。您可以使用以下语法:2 f: C0 h+ j+ O# D8 Z9 ?
%~1 - 删除引号(" ), 扩充 %1
4 s* K1 S. C3 Q4 y2 F%~f1 - 将 %1 扩充到一个完全合格的路径名: W) \, e8 a8 D+ j% V! ]
%~d1 - 仅将 %1 扩充到一个驱动器号7 d6 q6 J; M: A6 k# F! o6 _
%~p1 - 仅将 %1 扩充到一个路径
' L+ J% V+ ]! y$ f" E%~n1 - 仅将 %1 扩充到一个文件名
; E( O* t' @0 Q' i1 Z%~x1 - 仅将 %1 扩充到一个文件扩展名
; Z4 M) w+ W# M ~%~s1 - 扩充的路径指含有短名
* i* g7 i4 W' Y' U%~a1 - 将 %1 扩充到文件属性
% O7 u+ g8 B7 T3 M* X) o4 i9 U+ V5 _%~t1 - 将 %1 扩充到文件的日期/时间- @) F1 I. _/ F: h- r) v
%~z1 - 将 %1 扩充到文件的大小
" U! H2 Z- A- @8 N U5 v" r9 V%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
% I. S7 v" L. E9 h扩充到找到的第一个完全合格的名称。如果环境
% g: k9 v# d, n! F, s) R- V变量名未被定义,或者没有找到文件,此组合键会
. e8 E9 O+ c# N; g& V扩充到空字符串: Q, R) @' K) _3 \. M0 P6 A
可以组合修定符来取得多重结果:6 H1 Y, I4 _% f! K( ^' T
%~dp1 - 只将 %1 扩展到驱动器号和路径: M) _# }! h+ n6 N, t
%~nx1 - 只将 %1 扩展到文件名和扩展名
: q- U! M5 o/ t; G%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,$ ]4 w1 V# }; u) j- }
并扩展到找到的第一个文件的驱动器号和路径。+ K3 _; \& G5 C
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。) t! ?$ V' D. k9 K) L6 g: H
可以参照 call/? 或 for/? 看出每个参数的含意
~: w; i8 v2 R, pecho load "%%1" "%%2">c:test.txt: H9 |$ ]" N" ^( C! ~) @
生成的文件内容为 load "%1" "%2"+ \8 S! T- r, ?, E; Z( C+ H
批处理文件里,用这个格式把命令行参数输出到文件
1 ?" H8 E& |, c+ W/ e. [% E5 B4 d. _- ?( ]) ^9 ?) t3 V
29 if
/ E; ?( z- v+ H; C- Y+ b7 N& ?$ l判断命令' X- {- M/ v( ]
if "%1"=="/a" echo 第一个参数是/a2 d1 e' l0 {5 E) g. R+ O1 i
if /i "%1" equ "/a" echo 第一个参数是/a
3 d5 D- i- I; i5 V1 G/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
; k# ^/ a! O5 ~4 D3 _! V6 G9 hif exist c:test.bat echo 存在c:test.bat文件3 |! E# B! H9 N" S6 x8 h3 t
if not exist c:windows (
4 _+ @) c* _6 h) S4 `, gecho 不存在c:windows文件夹8 W5 h8 M; f% P6 d
)( G) p- O0 g+ I0 {3 P4 @. X- f
if exist c:test.bat (7 P9 E' R4 `+ x9 K( @/ O
echo 存在c:test.bat
/ w/ d5 F" L4 h1 b( G+ H6 z" z+ l% q) else (6 o' X' n/ W0 p0 d
echo 不存在c:test.bat) C) m4 O- ?9 x
)
* u, l: g8 A U! g s30 setlocal 和 endlocal
- T! r9 A6 [% j9 [8 X设置”命令扩展名”和”延缓环境变量扩充”. j. y! f6 c: z/ E
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
, Z. r8 ], X$ a5 V, _; oSETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
: T/ X# |: X4 F, KSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"+ m" E P( U, h5 s% d7 s
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"" F' a6 F' v7 X" b
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态
! K( F2 U6 y, P5 x" E7 X“命令扩展名”默认为启用! A/ V) b& B' h0 _
“延缓环境变量扩充”默认为停用
* {7 a2 A) b9 n2 ]5 F7 I2 g8 t批处理结束系统会自动恢复默认值! X7 b3 U/ d Q8 q- v9 B! v+ o
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程: E4 D3 y" H% T3 V) `
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确4 K3 Y# s" N9 f% @' u
保程序能在其它系统上正确运行
/ ]/ J3 k( S4 N. h' v8 _1 i"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
/ g6 z( M7 ^$ z1 z' }. J4 `. Z0 w4 g" S" g" J2 E0 x
31 set# V7 g' _3 |4 z, ?( r U8 k
设置变量' E" m9 M% \* F9 J! c
引用变量可在变量名前后加 % ,即 %变量名% }& l9 ~8 Y, Y; C* o4 [
set #显示目前所有可用的变量,包括系统变量和自定义的变量
* Y `# J5 }* Necho %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
0 g9 [3 j% ]$ c0 R& rset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
4 h7 K6 l7 @ t9 B; fset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
. r1 ?! Y; j; uecho %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
0 D) L4 n8 u9 |' Techo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
! L+ S: ~" Y) w$ O2 i C \/ k6 Zecho %p:~6,3% #显示第6个字符以后的3个字符,即aa2
8 L. l: h5 K* zecho %p:~0,3% #显示前3个字符,即aa1
) P6 N; r1 G8 O% ~* d/ k7 Techo %p:~-2% #显示最后面的2个字符,即b2
0 E5 [2 v4 }$ hecho %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b/ a5 n3 U# L+ t$ g$ e6 o4 W
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
! b7 J/ }* A& T4 H$ c# Secho %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb25 |8 g& D' ^# y) t5 x
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb24 ]' }2 A0 J6 \* A( W7 J c7 D% @
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2/ r+ q# K6 b; l, [
set /a p=39 #设置p为数值型变量,值为39
2 A, B6 v' x! o; z3 b# c; ^set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
s" v1 X5 _: n4 aset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用6 F; n( |7 H4 o' d/ i
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?; t: i5 _+ D Y8 D, a5 [9 W
set p= #取消p变量1 R2 e; j8 m4 b" Y0 n# Z6 Z
set /p p=请输入
8 u7 S8 r6 I/ ~1 M' T0 y- f: l: |! M' f屏幕上显示”请输入”,并会将输入的字符串赋值给变量p X2 W' f4 k+ U# Z; u$ i
注意这条可以用来取代 choice 命令
~; A$ I7 n" j s3 v4 T6 ]$ U" k注意变量在 if 和 for 的复合语句里是一次性全部替换的,如6 g) g0 t1 ^) d$ P, P3 o6 e
@echo off# }$ ~6 a% x- [! Z4 A \% G- \
set p=aaa' Y& d1 t0 x) Q& @3 p; A8 A2 |* P0 P
if %p%==aaa (! |/ [9 h4 T- e5 T3 T6 B% e; f8 |
echo %p%
% D% P k# w; S0 ]$ K% c7 Cset p=bbb7 l5 s9 a# \5 @( u
echo %p%
+ ]3 @9 ?. k* U, m! N)
6 |/ E: w& f9 Z1 d$ ]+ z9 c结果将显示
1 i e- z7 P7 q7 H6 D' d6 O taaa
# d8 q; ~9 J9 h" yaaa
5 M. s0 D S( P6 z+ @0 g2 |9 w因为在读取 if 语句时已经将所有 %p% 替换为aaa
' ?; f$ h7 G! G/ |4 V这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"2 M$ X# y6 k& H2 O' T* T
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!# v1 Q) b* ~: N0 F. Q. E! {
@echo off
0 a$ d6 p8 @# O* y- NSETLOCAL ENABLEDELAYEDEXPANSION1 N y2 a+ t& @6 d
set p=aaa7 ^/ M8 ]4 d7 i9 f4 ?. T5 U
if %p%==aaa (
9 O7 o2 ~: z- |echo %p%2 E1 c J$ r! T8 Q/ d% I
set p=bbb
) B K2 c! l+ ?1 decho !p!
+ N. [+ H* s6 F y. E6 F0 V: L8 Y)
* @& s8 q) X7 `4 ]$ Y1 J/ @- nENDLOCAL
/ g2 |6 ^/ [! w7 M! ^) f1 G" w) ~8 I结果将显示
, V1 }2 [/ U) N8 V; A: T4 l! `aaa8 X5 w6 Q* ~- U6 [6 ~% l
bbb
" W, n: |0 a% W# W7 j还有几个动态变量,运行 set 看不到
v8 i* d1 N2 u3 b5 w/ |%CD% #代表当前目录的字符串
8 v& W; q9 V9 W, y/ Q%DATE% #当前日期
3 M+ K) Y( ^1 n( X%TIME% #当前时间
0 S. F1 @. C$ c( E" C2 }" B* X& X%RANDOM% #随机整数,介于0~32767% x; D q+ |" R4 T2 ?4 c3 C
%ERRORLEVEL% #当前 ERRORLEVEL 值7 |2 @' k3 z: ]7 U
%CMDEXTVERSION% #当前命令处理器扩展名版本号
# p8 f" _2 a4 L x% q% p%CMDCMDLINE% #调用命令处理器的原始命令行4 M. w F2 }' _; t
可以用echo命令查看每个变量值,如 echo %time%
2 N6 J, E: @) `- w注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到# f* w8 P) j7 F9 s' ?
8 S+ L% W% P6 i* [! U
32 start$ ]! D4 U6 H9 ?* @
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令3 ?3 S5 U: [9 `
. b" p4 `! Q3 G" w0 a33 call
3 s" k* q1 @/ m2 ~7 q1 u& H4 r8 [批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
: r# \- d" p4 y! {9 V( Z# d( B' G有时有的应用程序用start调用出错的,也可以call调用* S8 b5 g, b' D+ q1 f
3 g# o: h; [- R* j3 S$ y) g34 choice (外部命令)
8 L9 h$ u6 A& t. I6 u选择命令8 c1 {1 {2 u0 a( U+ k
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
8 o+ V* w5 V& i$ {, e: F0 {2 \* Awin98里是choice.com
8 u" L% Y3 ^2 V |win2000pro里没有,可以从win98里拷过来
7 s- c: O, H& I$ S4 v" f3 p8 K+ f2 M, kwin2003里是choice.exe/ l! p' C( Y2 K& @" y& V3 F
choice /N /C y /T 5 /D y>nul
7 y- ?' }* F; y6 Z# j4 [" b. Y延时5秒' O7 i+ |/ X7 ]) b. J+ {
" ?$ o( O* Y4 {1 _( t/ F35 assoc 和 ftype0 K' A, E( u2 O# c& H% F
文件关联
3 H% {: b$ @; S5 m( `assoc 设置'文件扩展名'关联,关联到'文件类型'
# i6 h4 j" K' z' c. V; V) Rftype 设置'文件类型'关联,关联到'执行程序和参数'
) T- O% e8 D/ d当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
4 O9 T9 F' @2 f+ s5 M7 d" f6 Y而是先判断.txt属于 txtfile '文件类型' n- b' |* C1 c p
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1) X/ k$ K, g, z' {' g! H3 G, P
可以在"文件夹选项"→"文件类型"里修改这2种关联. ^* j9 v# z+ O. t8 C
assoc #显示所有'文件扩展名'关联
: T I+ x7 |) T k; B% k2 Dassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
- T0 V5 ^; B8 ^. T$ @* i6 Sassoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8 y8 U; H& V- T% P y' O
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
3 C8 G+ \2 z' ?* ]2 `ftype #显示所有'文件类型'关联; [4 Q& {. I2 V* k
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
; Y* U9 `0 b/ ~7 T3 hassoc .txt=Word.Document.8
, m0 h% \# y4 G( P2 J+ V3 A设置.txt为word类型的文档,可以看到.txt文件的图标都变了1 Z/ R( b+ n3 D6 H1 [& D
assoc .txt=txtfile* q# W1 u4 e" `" e9 t8 D) u8 w& F
恢复.txt的正确关联
) Y$ A4 b3 F( n* F* W8 N# cftype exefile="%1" %*, }' g y( _" u$ u1 b7 N4 p
恢复 exefile 的正确关联 j6 `5 v1 z4 c& y* Y9 n+ d
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令$ |' [' U2 n- {, I! X+ L
; t' e- V F0 S$ p( d+ f% F36 pushd 和 popd
- p* r( b9 Q+ `4 R切换当前目录+ n: a. K' l8 n/ g+ D/ a
@echo off
. d3 [3 K# J, p+ P Jc: & cd & md mp3 #在 C: 建立 mp3 文件夹
; q, n* {8 f- u( M0 |: Wmd d:mp4 #在 D: 建立 mp4 文件夹
+ v& |$ M% q6 E/ D! r. kcd /d d:mp4 #更改当前目录为 d:mp4
P1 R9 j% Q9 g9 qpushd c:mp3 #保存当前目录,并切换当前目录为 c:mp38 \: @/ o6 O* c% i' n J
popd #恢复当前目录为刚才保存的 d:mp4. n) w( ~2 {3 v, O* T$ N) J8 q
( p- s: T+ X: W! c/ u' O37 for/ q" q/ U2 i- Y0 U2 P) ?6 p3 i/ U
循环命令5 K. |' J- Y" k
这个比较复杂,请对照 for/? 来看
; ?1 d1 G" J+ t/ Y7 t& d. e2 Tfor %%i in (c: d: e: f do echo %%i
1 S2 I- c( Y6 d: d0 l依次调用小括号里的每个字符串,执行 do 后面的命令
' g! g3 K8 ?& K! z7 m5 x# ]注意%%i,在批处理中 for 语句调用参数用2个%" O9 e& I" {: u/ `& D8 _
默认的字符串分隔符是"空格键","Tab键","回车键"9 `: C1 ]; m% W4 y
for %%i in (*.txt) do find "abc" %%i [8 `& Z9 x' j
对当前目录里所有的txt文件执行 find 命令
1 w- Q- s3 u( j: ofor /r . %%i in (*.txt) do find "abc" %%i! r% {. k+ b2 l% c& i' J
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行% g% j& {! M, ~( E z
for /r . %%i in (.) do echo %%~pni
6 T) x, @; @" m: t& w2 P9 g7 i9 n显示当前目录名和所有子目录名,包括路径,不包括盘符
( w9 U1 q% F3 { ]% U# H: d" |for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt; s _9 Q$ w/ \! ]2 \ _8 t
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
" h* ]/ ~9 m! Y \7 F$ lfor /l %%i in (2,1,8) do echo %%i
' g g% G3 w$ R e$ s) [' F生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1$ S) C8 {/ V2 f% _0 j
for /f %%i in ('set') do echo %%i
! G& N5 e% X, a3 R4 V) e: o对 set 命令的输出结果循环调用,每行一个7 p% C* k, ^* ?2 r2 _! Q
for /f "eol=P" %%i in ('set') do echo %%i3 h# v M# w [+ c; @
取 set 命令的输出结果,忽略以 P 开头的那几行
/ b. r1 c R! }% R7 N9 c3 T5 yfor /f %%i in (d:mp3.txt) do echo %%i: g( K$ G' |4 R
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称/ l8 M2 |) b( v+ s" w8 U
for /f "delims=" %%i in (d:mp3.txt) do echo %%i
N# C8 _1 i" O/ U( M, Y* O: m显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称0 o3 N. h# m! ^9 r
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
2 u, I; K+ ? T8 ?6 u/ i+ c对 dir 命令的结果,跳过前面5行,余下的每行取第4列; F/ ], D5 i, m3 N
每列之间的分隔符为默认的"空格"! B6 \* o& t# M( I
可以注意到 dir 命令输出的前5行是没有文件名的
, _. m# `3 k/ L7 Hfor /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
5 j: H; t1 S' s# h. N1 {echo %%a. C( T; Y. M0 |4 f) i7 x
echo %%b% F: y( e; J5 [& ]6 U$ F: T
echo %%c7 |: N( x9 R# N. o, v3 z
)
( `5 H- ?/ H4 @对 date /t 的输出结果,每行取1、2、3列
6 Z' R; s, E9 e/ C! ?第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列" A j1 B/ s: P8 T
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
' o2 o9 Q) `" Z$ n/ r6 o其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的4 V& a9 z2 }" i
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
8 C/ k' a3 q. ^, B$ S取第2列给 %%a ,其后的列都给 %%b
- X, ^+ t, C3 I1 x0 `1 j: L0 o% N2 _/ v4 ^ E) Q) D
38 subst (外部命令)# x3 I2 h# z1 \$ i
映射磁盘。 p) T7 }" V1 X1 K% E& ~; f' k
subst z: serverd #这样输入z:就可以访问serverd了2 j" M* O4 Y g! B' ~& @* X b
subst z: /d #取消该映射
8 [3 s" {0 t$ o( ^/ lsubst #显示目前所有的映时: Z. l1 ^ d) v' ^$ X
+ E0 F/ E/ }7 w/ T8 I4 e
39 xcopy (外部命令)" s' N3 Z/ p" X2 a2 a
文件拷贝
; Z% l0 [/ X4 j/ s8 A' hxcopy d:mp3 e:mp3 /s/e/i/y
4 t7 B% k, Z' v' v& |复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
$ ]2 P1 B6 {& @. J y& ?加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问: {6 V$ q4 X( L0 C, J) \
% `- [4 }* }$ X& ^0 X常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
: p6 M* \0 o5 {! L M) q- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:* f2 P2 B; E( K
5 t4 G- N6 l% p5 i" v& e; r
@echo off
& @% \5 _8 l2 J$ |% S- S. ~* Qset p=aaa/ [# c5 v0 Y' y4 T6 R9 K
if %p%==aaa (
/ O3 {0 }$ G8 u$ V. X) wecho %p%
9 z' w! A2 d, N5 E. L, fset p=bbb
% M: S- S0 V+ _echo %p%# g# ]( X e) i0 Y4 m
)
0 {, G, G5 E6 @$ ~5 Epause
截图:* |0 `: }2 p1 m- N
2.批处理.bat 文件中输出中文乱码 " V/ Y# w }( M0 T8 R; U
- 原因:记事本新建的文件,编码不是 utf-8
- 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
- 操作截图:! S) V @- ^3 H
- 效果截图:: E- V( U) I7 b Q/ X- v
2 p3 J) h* ] D
5 {, g3 Y% n7 D+ l ) A( \/ V% a d; f; _/ n
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|