|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!0 s1 p' i; d# D+ V( J T
前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效' S% M% T: u. i7 K# R
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
; j% Z; D! O$ a, u4 }4 e D3 Q名为bat 目前比较常见 的批处理包含两类:
. g( H) y3 b! w- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
8 G P+ {- O& ~& F( @3 }
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
( s/ K, E, b g y命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件 * b1 f- k3 e0 X
怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
7 _ n. F! ~' x* D- V' c' \0 | 批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set
2 R5 w# B& W0 h. {: `0 }! X. | 批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||
; w$ w) H1 Q# H% [' p* Z 常用DOS命令- 文件夹管理:% e5 I4 h+ P, ?$ T& Q+ h5 T+ o
- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。
' F5 f* |5 q. Q( y/ m+ _
- 文件管理:
! a# L+ J1 i3 E6 [; p# u5 m8 l- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同* I. s: V! Z# v" s0 M/ Z9 K
- 网络命令:- K' E' y- {2 ]4 l
- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表" x6 ~5 L8 X' t; F, o
- 系统管理:! p8 V# B! o# _- ]& x+ a8 e$ G
- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置& N/ l, P' F' ^
. M# v/ K0 W4 h% `. X
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
6 g4 o, C& Y. ?, m/ K* W+ j7 D. ?4 {' K& @9 ~1 ?1 D b
Windows Batch 常用命令2 k* {4 G9 j, s' T# W+ C- O: [
1 echo 和 @! q$ U' e) Q& H" A& _
回显命令
) R/ c1 s+ \" Y# y) P9 b3 k@ #关闭单行回显
+ Z/ V2 o: o* Jecho off #从下一行开始关闭回显8 `$ p6 P2 Q6 [4 Q
@echo off #从本行开始关闭回显。一般批处理第一行都是这个
! ?% c) b% `! A. Y1 h2 Z( S: zecho on #从下一行开始打开回显* b9 o5 ^0 n% A+ Y' [) s; M8 V
echo #显示当前是 echo off 状态还是 echo on 状态1 u! |4 M# x$ l2 k: R3 s) X; r% d2 ?) x
echo. #输出一个”回车换行”,空白行% h! j/ C6 I. ]( h, S
#(同echo, echo; echo+ echo[ echo] echo/ echo)
- r, ]* v9 W( g/ z' ^/ b2 B8 Q& E4 |( a6 c% ^" k# x
2 errorlevel
3 ^: i [6 x% v: hecho %errorlevel%* _. D, ?; B5 v
每个命令运行结束,可以用这个命令行格式查看返回码" O! K! F& D' Y }& q
默认值为0,一般命令执行出错会设 errorlevel 为1
+ \8 X) `' \5 }; {% S- d
, R2 l/ S# C. z; j3 dir
+ F- _% q" w u显示文件夹内容
9 A1 p4 ?3 u* F6 k1 I5 Z7 j7 qdir #显示当前目录中的文件和子目录1 e. x8 k* |$ _, G( t3 ?4 o
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
8 G: I: D; ^) e) L4 @5 x* w! cdir c: /a:d #显示 C 盘当前目录中的目录
" n6 U3 A3 L Vdir c: /a:-d #显示 C 盘根目录中的文件
' R) H& T; l. B1 G4 ^6 _ qdir c: /b/p #/b只显示文件名,/p分页显示
: z v' w1 l/ _) g1 \dir *.exe /s #显示当前目录和子目录里所有的.exe文件
5 _4 o$ t' ?8 \! j- X7 R3 G! P' x
4 cd
% _5 x% U' f2 Z' K3 u% @! T切换目录+ O. g2 I- K2 _
cd #进入根目录( f4 F: E, G0 O
cd #显示当前目录
A9 i0 e# Z) X9 Y! H- \1 s7 A8 q+ Ocd /d d:sdk #可以同时更改盘符和目录
% d+ [) D: o ~, X2 y
2 @4 r' L( Z# N# b" o8 P) K5 md
/ a' H% Y$ L4 A创建目录
_* Q+ ]1 Q& }, omd d:abc #如果 d:a 不存在,将会自动创建中级目录
' O B g( D4 Q5 F+ I#如果命令扩展名被停用,则需要键入 mkdir abc
/ o! e: d% }9 j+ g. b
" X) [. A/ L! H2 S1 q! r% v6 ?6 rd
^/ i+ q1 j) F3 r/ [6 E4 s' N删除目录- C: U5 ` d0 M8 C. K5 Q
rd abc #删除当前目录里的 abc 子目录,要求为空目录# {! Z4 U& ]* U, w8 }5 x
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式4 {3 Z8 G# l$ T8 S3 W+ O& i" J+ g ?
! i# _; {( ]: }) b1 T* C! T$ u
7 del. D; B. Y+ p/ S1 p! v' ~, x: Z
删除文件
& D3 b8 A; W+ \' B8 ^& O7 u) _. `del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件5 D$ x" \0 q7 k! A# q- J4 `
del /q/a/f d:temp*.*
# v( p. A" H( x2 H1 n- G% z删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
4 _4 i& ~& O! x+ p/ p: M3 {del /q/a/f/s d:temp*.*5 ]2 r& ~) `% z- \* }* J6 Q6 S0 T
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录, L ~" n$ N7 I7 y0 h6 ?% S
/ p" S* g7 O! ~; E
8 ren& m3 E0 p- L% Z: R9 ?
重命名命令9 x3 z5 {& H2 W6 w
ren d:temp tmp #支持对文件夹的重命名
+ w3 Z& [' s& @7 m. k# R0 D- e! V9 ~2 v
9 cls
3 R6 @& T* v# [/ c清屏
6 X5 c7 ~' F, g% l) y- {) \6 B10 type
/ P) w5 X1 {% j* {9 L5 y显示文件内容8 g1 ~6 m+ M; m* o# s5 p, W
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码7 `$ W$ G! u3 D G
type *.txt #显示当前目录里所有.txt文件的内容: W0 @) e, h, ^: | G; w2 ~
Y% A+ {# K- m3 L/ D( K X3 Q
11 copy) s9 n' f9 R8 B* |
拷贝文件
R4 x$ V, b8 Gcopy c:test.txt d:test.bak2 v E ]) B" c. r: ^7 h
复制 c:test.txt 文件到 d: ,并重命名为 test.bak
2 F" L; m1 G8 r% }' F8 s- Z+ Zcopy con test.txt
2 }4 _: m+ k1 g2 E. K# P. D从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件7 q2 ^: Q( l& f% e" B
con代表屏幕,prn代表打印机,nul代表空设备0 J& u( z; E- `/ W' {
copy 1.txt + 2.txt 3.txt1 L$ ~4 n$ {% p( k6 H( Z
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件2 u* ?* S3 n$ j
如果不指定 3.txt ,则保存到 1.txt& v; O! [* f0 s% \6 V
copy test.txt +
; ]6 e/ m6 |4 x复制文件到自己,实际上是修改了文件日期# z9 @7 R. F$ r$ K* q6 N+ C( C$ }
. c: T B* Q* A' _" U2 }12 title. B) u. W8 _: U; C2 Y4 t
设置cmd窗口的标题! [' b3 _+ V. q
title 新标题 #可以看到cmd窗口的标题栏变了
8 M, i; K% L& F" ]9 A. r* x) E! U9 c) G7 u# T9 _ x4 I3 {+ s" t
13 ver! n b5 M8 T: m0 `* Q
显示系统版本1 _. o& D% j8 e6 v0 {! ]$ Y
, e' G8 V o1 S& l" i" O) E, U14 label 和 vol
. n$ X; M! \8 t; i设置卷标
( x4 h; H& x1 b: ovol #显示卷标
( u5 w* }: [7 B plabel #显示卷标,同时提示输入新卷标
; d, W2 W/ p4 S6 Rlabel c:system #设置C盘的卷标为 system
+ a( k5 t6 Y9 B1 ? G! G
6 Y( Q$ b" D7 \, I9 L6 O15 pause
0 L5 Z' C! }6 e; y$ c5 M暂停命令
% z& P9 [! \$ F7 \2 d$ d1 G. f, P* Z% w
16 rem 和 ::
^2 p7 A. V3 Q9 g0 T注释命令
) f/ f& J' f- h. x4 q& L* T注释行不执行操作
; d7 {% z5 j9 t4 A% s. o3 a1 J' D5 j! _; L, C
17 date 和 time
3 Q3 P7 ~+ r$ W) H8 r7 X日期和时间
1 r" ? w/ u, B) b( Z& Y* w5 edate #显示当前日期,并提示输入新日期,按"回车"略过输入
3 X/ Q4 a+ c% r: M( M" qdate/t #只显示当前日期,不提示输入新日期: R5 K; j" |% K
time #显示当前时间,并提示输入新时间,按"回车"略过输入- H5 E# c* y( q: d9 ?
time/t #只显示当前时间,不提示输入新时间$ c$ ^9 E- w9 }3 d: d& z) Y
* [5 X9 e! T7 `$ V r8 d+ ?( C M3 n18 goto 和 :
+ d& b3 R7 U9 g- X跳转命令
( ^" b) \( b; E& S3 p& h# |:label #行首为:表示该行是标签行,标签行不执行操作4 a: H' J8 W% c9 S
goto label #跳转到指定的标签那一行: Q4 v( s" h8 |( E
( H" @; _: a7 m9 Y/ o' W19 find (外部命令)
$ ` v0 z! d' C查找命令; g3 r7 u4 E/ ]' e, N9 [
find "abc" c:test.txt
" y& c: V1 w4 |3 Z0 l# A1 ^在 c:test.txt 文件里查找含 abc 字符串的行
: U, R+ y0 O9 h( T" G2 z如果找不到,将设 errorlevel 返回码为1
q$ D: V' U. n. u# g1 {find /i “abc” c:test.txt
& G/ x# Y* H5 u查找含 abc 的行,忽略大小写
$ A& w+ J$ w) i. J5 ]2 |find /c "abc" c:test.txt
: C; L0 v+ B5 X& s显示含 abc 的行的行数0 h A/ F( k6 j; W
) i% a z" I9 s J20 more (外部命令)0 H$ ]5 w/ o; m
逐屏显示
- B) \1 I* Y: r% H& z( ], _0 K# m( |& Zmore c:test.txt #逐屏显示 c:test.txt 的文件内容
' g. Q' V; U4 x/ t& x1 k v6 F$ @. U# `' y: j" ^" g
21 tree# Y; N2 O! g) |. E' r
显示目录结构
# D; s4 a& y# l% L8 Etree d: #显示D盘的文件目录结构
" F. f! V7 M' \
; D' O5 L$ ^( x3 L& U* b22 &% }+ y# g. C7 c2 _: t1 y
顺序执行多条命令,而不管命令是否执行成功& W W2 X( u% w% Y
; I# I( Y. `2 H" N' M% z4 [) m
23 &&" c: ~% y1 D8 q! Y0 N
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令# J3 g; l$ P8 T5 ^/ x
find "ok" c:test.txt && echo 成功
2 J$ K5 Q7 H. R7 l) ^- G如果找到了"ok"字样,就显示"成功",找不到就不显示
7 }# ~# f. J8 ?; R6 w
% s/ n! ?0 _1 n3 ~5 _24 ||2 @' h3 w: J ]3 ]5 T+ p6 y t, U" i
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
% y" D, X7 f: W& dfind "ok" c:test.txt || echo 不成功
6 i* x5 e( q0 W5 x; _如果找不到"ok"字样,就显示"不成功",找到了就不显示
7 {! G' z% b9 r2 N( K- R1 I
6 Z: G7 |; E0 d1 U- g6 l25 |9 p9 x( {+ c0 o& g/ w5 P6 T
管道命令
0 {4 a# h+ F8 u1 m, bdir *.* /s/a | find /c ".exe": H- C) r E/ r0 b" G
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令* R0 ^3 l( ^2 N, \5 G
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数4 ?1 U* Q1 p8 Q# D6 A. j
type c:test.txt|more. N( V, P% u8 J- b. o/ r+ V
这个和 more c:test.txt 的效果是一样的
* V* c7 q# L9 ?$ ~ T& D3 P
0 K$ i: ^4 A0 ~$ B. x! w' `26 > 和 >>
1 O; V! I! |) v5 U. |输出重定向命令
& f+ L, f+ {' {7 i+ N! {> 清除文件中原有的内容后再写入
, H6 v2 D m/ f. U$ V>> 追加内容到文件末尾,而不会清除原有的内容
9 G Y8 d/ t$ {主要将本来显示在屏幕上的内容输出到指定文件中
% X8 I0 m$ z2 s& T$ g+ [指定文件如果不存在,则自动生成该文件
4 W9 l) j3 G J' ?type c:test.txt >prn2 N6 ^, `' _/ \ z' P
屏幕上不显示文件内容,转向输出到打印机8 p* ]) R( K0 v: Q5 ?4 j8 V3 t
echo hello world>con- k4 s/ ]' q1 v5 \9 [3 F; c
在屏幕上显示hello world,实际上所有输出都是默认 >con 的3 ]+ e5 q1 [; s! q2 @! O: r
copy c:test.txt f: >nul
5 v$ I/ `9 r( h1 z2 R) F拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
+ P% e8 h6 N* v5 L( E3 U; n8 gcopy c:test.txt f: >nul 2>nul
' E2 F2 V l P: X8 g不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息' }& ]% A' R- s/ Z0 z$ c
echo ^^W ^> ^W>c:test.txt
. k1 X$ M9 u' M0 q生成的文件内容为 ^W > W! `4 M! p5 I8 P( I+ h* u& g& C
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
7 z2 T3 P4 @3 v4 L. ^( f8 s+ g3 u* f; t4 t0 V' m# D) Y {8 Y& B5 Z
27 <
& ~5 S- m9 g. b9 k; u# W% h3 E. m从文件中获得输入信息,而不是从屏幕上
! U# \2 Z3 V* M一般用于 date time label 等需要等待输入的命令5 l Y( r: l" P
@echo off
! t1 m1 i4 X7 v5 Mecho 2005-05-01>temp.txt
; V* n, C+ j5 q& n$ h4 w7 L# K- X ldate <temp.txt
" \. E) W" ^: c/ Edel temp.txt
, E& w& a, `2 G- I- F这样就可以不等待输入直接修改当前日期0 d; [4 i4 v4 l: t; u$ P
/ p8 B, ]# s/ H9 ~ L; h. Q4 C2 Z/ x1 {
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*4 o0 ?) h0 a+ o) p2 T2 h ^" t
命令行传递给批处理的参数! z! ]& h6 P4 R* [6 Z5 f/ G
%0 批处理文件本身1 ^- {9 b5 ^2 H4 c4 q I. m
%1 第一个参数
% d) J- S$ y3 t& U8 U) d8 o%9 第九个参数
3 Z" ~' H* n( j. l! M# ]" V%* 从第一个参数开始的所有参数2 V2 y6 ?4 u4 D, ] z6 w
批参数(%n)的替代已被增强。您可以使用以下语法:' R! I% e$ {: |8 g/ X6 [ R7 c
%~1 - 删除引号(" ), 扩充 %1
" ~0 n5 U" Q- ]& a9 j%~f1 - 将 %1 扩充到一个完全合格的路径名! i5 J8 z" D" I
%~d1 - 仅将 %1 扩充到一个驱动器号
+ ?' T+ O' v* g3 B%~p1 - 仅将 %1 扩充到一个路径
: y# r x4 T' W" K$ m$ O%~n1 - 仅将 %1 扩充到一个文件名9 O7 j9 c+ L( X4 Z6 I' i. p j( M u0 h
%~x1 - 仅将 %1 扩充到一个文件扩展名7 U1 O) V; {, O0 S' ?
%~s1 - 扩充的路径指含有短名6 N1 r+ ], T. A' Z
%~a1 - 将 %1 扩充到文件属性5 V; {7 Y7 W3 v$ x3 `8 ^
%~t1 - 将 %1 扩充到文件的日期/时间
( T* E8 S* o( E6 d3 b5 S%~z1 - 将 %1 扩充到文件的大小
) q( a/ @' ^& q2 c. u%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
- @' H [, A1 X扩充到找到的第一个完全合格的名称。如果环境8 o3 w# N0 m8 S6 `
变量名未被定义,或者没有找到文件,此组合键会
2 T" r) [$ F! Y: R; Y2 b扩充到空字符串
. d4 w" R3 p4 R' u4 @% e可以组合修定符来取得多重结果:; }: L" w; a; P% R# ?; A5 O" Y
%~dp1 - 只将 %1 扩展到驱动器号和路径9 |6 t: F; u! C, r& l7 e4 i# _
%~nx1 - 只将 %1 扩展到文件名和扩展名, H, z/ c/ R; s8 c# t1 Y
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,5 U, e1 `+ x5 o+ ]# O' u
并扩展到找到的第一个文件的驱动器号和路径。
( k5 B7 t4 f8 D# U%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
7 k2 i* m+ d+ m( m可以参照 call/? 或 for/? 看出每个参数的含意8 `1 n% l3 R1 I% P1 H* _0 ?- u, e
echo load "%%1" "%%2">c:test.txt
) \( t6 E) E( t# c6 r* r& z生成的文件内容为 load "%1" "%2"
1 ~ k7 w+ Y+ E+ R. B' T, K; u( E批处理文件里,用这个格式把命令行参数输出到文件4 j% T& R1 E4 e D! b; ^
/ `6 H) s& a: z9 ?
29 if; }+ d& d4 J' O) G" r# z" |
判断命令
; q$ _# U, }+ ]1 V& `/ Wif "%1"=="/a" echo 第一个参数是/a C- v7 {+ X5 H, y+ q O, E8 ]
if /i "%1" equ "/a" echo 第一个参数是/a7 p8 u) _ N/ K1 E6 K6 `
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
8 R, m: m3 L0 v* ?) b* wif exist c:test.bat echo 存在c:test.bat文件" C1 K A: ~) y' b- ^! s( @8 R
if not exist c:windows (/ |% a& |8 h/ S0 d( [
echo 不存在c:windows文件夹
+ Z9 K+ v; O& P; r' A)
5 R* w2 ?+ C/ l( f8 a$ J" xif exist c:test.bat (6 j# x5 O) |* J, w
echo 存在c:test.bat
) ?; E2 N2 h/ L9 |% u) [0 z" U2 j) else (
( K0 r: `) [: I& z Zecho 不存在c:test.bat
; Z2 `! W8 E7 c+ ?; ^, P$ B)' X. `$ e R( l" q" |8 j! W1 W9 V
30 setlocal 和 endlocal
9 Y U$ A7 J1 ?8 w% p0 E设置”命令扩展名”和”延缓环境变量扩充”/ g" Z8 F& I: ~% ~3 ?1 D
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"3 A5 Z3 K, W1 g; J: B
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"- a% Y# e, K$ \0 s6 ~# a5 f" R3 `
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
4 y+ T- r$ A) E/ ASETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
7 j" H8 @" j% c: O! BENDLOCAL #恢复到使用SETLOCAL语句以前的状态1 f! E" R1 R9 F" i3 ?7 ?
“命令扩展名”默认为启用& B _8 Q+ [/ e+ l. W
“延缓环境变量扩充”默认为停用: ?* [; ` S4 ~& n! ?/ j
批处理结束系统会自动恢复默认值
9 k* q& z5 _, K0 e可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
- s8 q5 S8 J, ]8 u% g5 w序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确3 j9 R8 o. i& D6 ~* I* t
保程序能在其它系统上正确运行
2 V1 P0 k! y; X6 K"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
" C2 ~6 S5 c7 y% q
; h6 |- s4 W; R% O7 P! D31 set
$ O$ }: K8 E8 E% c# H# B* {8 Q, r设置变量
0 E/ V5 K" C- H U$ v引用变量可在变量名前后加 % ,即 %变量名%- O% a- n P- D2 | W2 Z& \
set #显示目前所有可用的变量,包括系统变量和自定义的变量* `2 F1 l' E$ j( Q0 O& L
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用- u+ @' ?" c) K0 n* t9 d' [$ w
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1+ R, d- `. o" ]3 D4 M
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
/ y7 v0 l. C0 L% \4 c* }; C6 iecho %p% #显示变量p代表的字符串,即aa1bb1aa2bb2; b6 Q& u, U8 ^9 O* g9 p- E
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2# \* K/ Y6 g3 J
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2
1 V, `5 p* s6 M& }9 A7 I# z* Iecho %p:~0,3% #显示前3个字符,即aa1
y/ a& S n+ m! P2 f) becho %p:~-2% #显示最后面的2个字符,即b2
- ~7 n3 z0 y+ g O3 Q I+ Qecho %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
) {- h- H5 m" M. o% x C' Iecho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
' L3 N; y9 C0 J0 kecho %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2' ?$ s6 d1 h2 O
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb20 H6 C- K+ Y, l) J$ p7 Z
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb27 \- U7 p, @" O7 `3 v8 u
set /a p=39 #设置p为数值型变量,值为39$ f6 ]% p3 j- x# `5 v- K
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=38 {* I( ~/ N3 v
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用; ?- e3 H# N, [. w5 F) B- \
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
( G( w2 }! q2 [/ {5 C& h/ kset p= #取消p变量
' l4 E* D: ~. ?1 m# A" i9 t9 mset /p p=请输入
* Z; V. V& T' @: K- x屏幕上显示”请输入”,并会将输入的字符串赋值给变量p5 e9 ~! f; F" Z Z0 h- Y! k. W
注意这条可以用来取代 choice 命令
% U9 J' r6 v( y注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
9 \# Q0 H( m: _- b@echo off
0 C: M5 d9 }# h7 @8 }/ Zset p=aaa& _7 m. L: S' S- k/ d. S+ ^
if %p%==aaa (# K# }! `1 Y+ r1 t( L
echo %p%2 a( v7 N0 o4 \5 W! A
set p=bbb1 L! O. k# E& ~5 L" P* G' E
echo %p%
8 W% n& R D3 a o5 n0 G5 R0 D$ L)
; [9 H( c( @0 K; t结果将显示! c! ~; v6 @9 @# w% d
aaa
' \ X a4 i/ d" z2 Eaaa
) }* m! X. Z8 z, n6 Q7 M因为在读取 if 语句时已经将所有 %p% 替换为aaa$ s q( ?) f) z* _+ A
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"4 w0 @. S% {% F+ _( d1 I: S, \
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!; m, [/ L0 J* M! e
@echo off+ Y: O: c: H3 G; ?
SETLOCAL ENABLEDELAYEDEXPANSION
, b4 Y- I8 U, F9 Fset p=aaa: S: l0 i* T' Z8 R+ f7 J2 H5 w
if %p%==aaa (0 H& J0 g5 H% E8 Z" X5 e8 k0 r0 U
echo %p%
1 d$ K9 |+ w; ~5 S5 l5 E) Z* x% fset p=bbb% d! s, p; j' M7 T
echo !p!
: C, R+ A! N7 t# n)
* i, V% O. L% H2 a: @ENDLOCAL' ~& N1 g, f' @& M" K: E
结果将显示
* v6 j* l9 r% _: l" ~* y: yaaa$ a; H% ]2 p4 F$ Y
bbb
0 A; n) M$ c& A2 k& b7 v还有几个动态变量,运行 set 看不到
* r9 ^+ J$ ~/ Q4 j8 M4 n! ~/ F7 ?7 k( P%CD% #代表当前目录的字符串- f3 |5 h: B; Y% H. Z# C
%DATE% #当前日期
( \6 W' a0 Y! V4 F: A2 y# Z%TIME% #当前时间! ]- t: g$ I$ s# d3 h0 |2 |
%RANDOM% #随机整数,介于0~32767, n) Y. l6 E- @! R! _
%ERRORLEVEL% #当前 ERRORLEVEL 值" a1 b! `% H( ^
%CMDEXTVERSION% #当前命令处理器扩展名版本号
% P6 X: I, ]& G' H" h4 U. M/ W%CMDCMDLINE% #调用命令处理器的原始命令行
3 q0 d4 N% G5 r# p可以用echo命令查看每个变量值,如 echo %time%, M) d: t) ^: t4 Q4 N* o! F
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
8 R- P g6 K: ?" M& @
/ m' c, L( u/ C- G( G% L+ z32 start
$ ~$ D& F7 j8 c" k批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令( u# d9 I4 w! n3 N0 V1 Q
: _& U& N* K/ M1 }# D! R
33 call
. [, Z' W% N5 {; R* w+ o, \6 I批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
! d4 Y f* S; ^- S9 z有时有的应用程序用start调用出错的,也可以call调用2 l. ^3 x/ m3 _& b; V2 I% M
, p) l$ L9 y$ q' K
34 choice (外部命令)
$ Y. e) o, f8 q选择命令
- A( r. F- [+ z: e2 ^让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……. b1 T& I- V3 {
win98里是choice.com
! J/ S' P/ H8 n7 o& Awin2000pro里没有,可以从win98里拷过来
3 `1 C4 i; `! \- `win2003里是choice.exe v6 X- T a5 R; x# Z
choice /N /C y /T 5 /D y>nul) E( Q: u1 h7 i q' F0 a. F8 t
延时5秒
0 f, @. ~7 q9 f0 A6 s: P( A5 p4 t5 s a$ D* z
35 assoc 和 ftype' \4 @" _! s& T6 C4 x9 o" C9 u
文件关联) y t0 [4 a7 j
assoc 设置'文件扩展名'关联,关联到'文件类型', b! Z2 l$ l' ]3 c
ftype 设置'文件类型'关联,关联到'执行程序和参数'
2 L9 \9 L2 K6 B) p1 o当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开- U. V( y: n/ J- d6 n A0 T3 [+ k
而是先判断.txt属于 txtfile '文件类型'' n" m& F( p/ W+ B1 T% T
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1* z+ d+ ^. B! k" h0 N
可以在"文件夹选项"→"文件类型"里修改这2种关联
/ `5 k: n" s* F2 }/ Zassoc #显示所有'文件扩展名'关联# K3 G% [* U4 l4 q) Y6 K; O& H* r
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
- ~4 G( D. S7 y; H; ?assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
2 f& F4 M, S( p' }5 nassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile/ d9 S7 ?) ]8 Y' o) T7 G, V
ftype #显示所有'文件类型'关联
% ~5 H" a* N6 ?. P0 l( h8 @ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*& l8 D* D7 Y. L5 F6 N5 Y5 `0 _
assoc .txt=Word.Document.8
8 Z! w+ a# y8 O- A设置.txt为word类型的文档,可以看到.txt文件的图标都变了! p$ T( @' w0 L# z! f0 V
assoc .txt=txtfile: ?: q$ T }, n. A Z. B
恢复.txt的正确关联
' I4 e! I% H6 H. x. S6 cftype exefile="%1" %*+ z: z5 q9 I- J
恢复 exefile 的正确关联8 u' E7 v0 Z$ W; A5 ?
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
( B: d" O! j$ ~- f4 d5 |) b z* S" m# }$ i* u$ G5 u
36 pushd 和 popd: v: P, X) D. a' K" h
切换当前目录
% }# n; `0 z1 j* r@echo off
1 A/ }6 Y8 k4 j! B4 a- H; e2 \+ |c: & cd & md mp3 #在 C: 建立 mp3 文件夹' M& P L. x+ ^0 |: @/ @- t
md d:mp4 #在 D: 建立 mp4 文件夹# ~3 m+ l9 a7 v) c4 B9 {# x: V ?
cd /d d:mp4 #更改当前目录为 d:mp4! e( ?8 k# o( u4 b& D
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3! r- Q8 Z3 u" d2 U
popd #恢复当前目录为刚才保存的 d:mp4
8 _0 W- c5 V- X& H& v! r* R7 c& C" y; x* n5 o* T: B
37 for' u: I8 w# P6 l% `0 f' p& u& \+ ~0 o
循环命令
% o$ s* A F/ g1 v; Y) q' Z. C这个比较复杂,请对照 for/? 来看8 U7 b9 f$ w+ w+ d+ }% @7 @
for %%i in (c: d: e: f do echo %%i" j6 _8 Z) \0 E! \& e* f7 v
依次调用小括号里的每个字符串,执行 do 后面的命令
7 u) q9 t: ^3 \# ~0 M注意%%i,在批处理中 for 语句调用参数用2个%
0 K+ x @& c3 Z- O. Q. c默认的字符串分隔符是"空格键","Tab键","回车键"
. x* Q& i$ z+ ofor %%i in (*.txt) do find "abc" %%i
, p2 L: _1 T& n6 c对当前目录里所有的txt文件执行 find 命令
# q/ g3 W' p4 V% p6 Lfor /r . %%i in (*.txt) do find "abc" %%i
2 V2 \3 h$ z1 L( h3 q/ K' [在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行' l: {6 r& `( U" n' N+ i9 ?4 }7 i" q& w
for /r . %%i in (.) do echo %%~pni0 N3 }% l2 `2 [3 S$ H' l
显示当前目录名和所有子目录名,包括路径,不包括盘符# G/ I, e" o% S T% r
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
* F5 ]9 F+ r L0 l2 \: U, T/ n- f把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
C# f* |: z1 c7 rfor /l %%i in (2,1,8) do echo %%i
! z' k2 H* r. Q生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
3 f4 n0 l4 @" Z3 hfor /f %%i in ('set') do echo %%i
, O% \. f$ i7 d7 P M对 set 命令的输出结果循环调用,每行一个
/ Q2 e, u" [; a5 v: I$ [for /f "eol=P" %%i in ('set') do echo %%i
3 z% \) e" M8 m5 `) H* b- s$ a; K& Q取 set 命令的输出结果,忽略以 P 开头的那几行- Q: l# i" p2 U- M: |
for /f %%i in (d:mp3.txt) do echo %%i; p3 ~, K6 I5 a% O% v$ L+ e# b% B& T
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
: v* g, v0 N; Zfor /f "delims=" %%i in (d:mp3.txt) do echo %%i
$ u( U3 S1 b" ]2 k) }2 g显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
# X! z! j- u# L, v H! Lfor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a8 {) M" l* [2 g9 [# X7 j4 J3 E
对 dir 命令的结果,跳过前面5行,余下的每行取第4列1 U: `4 p4 _% U6 c J8 _/ O$ E+ `
每列之间的分隔符为默认的"空格"9 e3 o1 S/ W. U2 O
可以注意到 dir 命令输出的前5行是没有文件名的. a& ?2 ?; f2 H9 W( f8 {
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
7 g) Y) c! F" V- \" ^; k5 h% K" y& s/ zecho %%a/ `; K( [3 a& E* a1 m$ \, N
echo %%b& z. g) i' H5 w- n; b1 b; I
echo %%c7 h# {3 i- O$ e" r, l$ [& o
)8 }- ]" x- i5 j( C! P/ O
对 date /t 的输出结果,每行取1、2、3列: U9 w$ r/ v l. K
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列& Y, C e8 H* g
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
, @ n+ n' b* ~. P M- X1 X5 z! A0 E其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的' i4 S" q! N7 E% e
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b/ B* x$ _" o8 G" m: o' Q+ r$ s
取第2列给 %%a ,其后的列都给 %%b
. O/ h4 l( A2 d5 T
2 S, c& \/ J+ ?" D38 subst (外部命令)
3 L! s+ ?- Y( I3 H1 Y2 P. |& G映射磁盘。
2 p4 U2 H c8 P, Y- fsubst z: serverd #这样输入z:就可以访问serverd了
" E& E* U) Y( r: msubst z: /d #取消该映射* y7 w5 @' B5 l8 E+ l
subst #显示目前所有的映时
+ j8 v$ P) |% k `( x- u( F7 J2 h# l' N* M0 m+ k
39 xcopy (外部命令)9 I# R1 k% x* J/ p
文件拷贝2 `! c. A4 [8 {" V
xcopy d:mp3 e:mp3 /s/e/i/y/ _; C' }( D* Y8 m
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
7 S0 w9 |* u' h8 V加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
( o! G7 b# E+ \4 m( ~% |$ ^
5 F4 Y- X; _# w) j. w常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退* {* j6 b9 _# I2 W9 O r
- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:9 |) I: p+ l8 E& a1 |
9 f8 i) [5 D1 i7 q. ]
@echo off
$ E; R6 j2 c, ]& V; Yset p=aaa) V) E J/ M% G+ p2 E
if %p%==aaa (" o' q5 U2 F* k4 _
echo %p%7 u( F2 S3 ^2 }( f' T
set p=bbb& N4 [& e) q5 i7 w0 |( F( R" ]
echo %p%
3 S6 _! x3 `, b! x/ w)7 c) F5 Q' g, B9 X
pause
截图:5 U7 G7 ~5 \9 h
2.批处理.bat 文件中输出中文乱码 . H u7 k, G; X5 c$ M
- 原因:记事本新建的文件,编码不是 utf-8
- 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
- 操作截图:
3 I! D( y* T; B3 u - 效果截图:3 B3 \0 x% h, k
p1 S) _9 Y+ [1 U- u! ^+ R
8 d3 o6 F8 r! N+ t1 O7 c
- S2 ]- s! N( n% S w8 m5 v
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|