|
|
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!
1 d, D& k- m7 a1 x/ q 前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效
; r! E8 d( o) q0 s4 W- h: H% W# t
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展0 a, ~. i6 f6 c/ I% {. O7 F
名为bat 目前比较常见 的批处理包含两类:
1 B' F% \" P ]2 S- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理: f7 [8 k. O4 k- l$ I2 t
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的2 Y: j" O* F' ^
命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
+ N( C F* c: u5 Y3 l 怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
) [. ]) H4 j4 L, N% G$ @ 批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set
5 I) M; }+ L. t8 E 批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||2 n- H; |3 ]4 o$ w
常用DOS命令- 文件夹管理:
: q: N& i" }8 M) @- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。* o* ^& d5 s* @9 F% P" J5 w. o7 z
- 文件管理:' K2 u- `& S D, n8 I' K
- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同. c* ?5 O P2 R5 v+ H+ j
- 网络命令:, }# K2 F4 z) T
- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表# h1 W, [3 n5 a. o6 P
- 系统管理:8 Y2 H+ n$ u: m" \ w+ m' k9 t" J% h
- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置7 ?, p; k! s0 {9 j) K
) m: ]* p! L/ I! x& Y2 J9 E
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /? 5 |2 `1 u3 _% P% D
8 P$ |* m" H- H: q: H& l$ jWindows Batch 常用命令
( x/ e% ]8 V6 z1 echo 和 @
- i/ O% w$ H0 D6 O- o0 [回显命令' }( z3 ^' F% n5 I$ o/ P
@ #关闭单行回显/ V& s# l) @# B4 g, @0 r
echo off #从下一行开始关闭回显# J: Y0 n# r# |, y5 E4 Z
@echo off #从本行开始关闭回显。一般批处理第一行都是这个
5 d' e4 G$ m1 |1 wecho on #从下一行开始打开回显0 r) X( n7 n2 ~
echo #显示当前是 echo off 状态还是 echo on 状态9 l' Q0 G- i* z
echo. #输出一个”回车换行”,空白行
8 r4 W4 {* @& n: j( r#(同echo, echo; echo+ echo[ echo] echo/ echo)6 S6 q( n2 v9 o N
( O) t0 ~% I8 C% ]' B6 D3 T
2 errorlevel7 w" f0 B6 I2 V4 ?
echo %errorlevel% k* l; D, S+ z5 N/ S5 Z; t- G( I
每个命令运行结束,可以用这个命令行格式查看返回码6 y+ Q. u2 x8 V& e
默认值为0,一般命令执行出错会设 errorlevel 为1
% i6 `- w; r' h- z- M
/ a8 O% S: [6 v) o3 dir4 o0 ~$ f: h+ }( t4 _" v9 o
显示文件夹内容
. Z. J: T/ ~. @! B6 o$ ndir #显示当前目录中的文件和子目录
. s- ^6 e0 L. q6 h0 Mdir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
6 V5 b7 E5 o3 t8 B, ndir c: /a:d #显示 C 盘当前目录中的目录5 n! B$ {& Y" h8 X; I+ l) U" J
dir c: /a:-d #显示 C 盘根目录中的文件5 T0 Q6 ^) f: v* B
dir c: /b/p #/b只显示文件名,/p分页显示
) R6 r$ Q) \& L4 X; U6 S9 rdir *.exe /s #显示当前目录和子目录里所有的.exe文件$ i' z! s* m8 V& s
& N7 G) i$ D8 J0 I' ^9 S* v# L4 cd
: j' t) `1 l( o4 l2 k$ q切换目录
1 N8 n8 H7 t! e9 I2 T+ i r& Rcd #进入根目录( C% R3 K( r( T% s& W! `/ D6 o
cd #显示当前目录" x1 }" Q# f' `, p# b9 C* ?0 D
cd /d d:sdk #可以同时更改盘符和目录( p; X# P0 {+ R2 K2 a' E5 Y
~1 B/ ?1 \# g8 V$ V5 md
- [' D+ W$ Z1 y3 Y创建目录! Z( f% V0 }' K5 ~8 B6 O) @: e6 p
md d:abc #如果 d:a 不存在,将会自动创建中级目录
/ v9 x) f. O8 K* R |#如果命令扩展名被停用,则需要键入 mkdir abc
( I: u% k$ \* j$ t$ C. R f0 M; f3 O- e
6 rd
0 U2 {+ T3 S% M删除目录
$ B/ F, [. X r; {rd abc #删除当前目录里的 abc 子目录,要求为空目录
N. `' u# A0 Brd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式) Z# f* Y' u! m
6 U- ?" ]* B" ~1 {# _+ l
7 del7 B6 U1 |. ]4 n; |6 W
删除文件
2 C, [8 O# R6 ], w8 a+ ldel d:test.txt #删除指定文件,不能是隐藏、系统、只读文件 y2 ?. g p. A0 w. [
del /q/a/f d:temp*.*
9 y+ S1 e8 B! v' q8 h3 e3 o% D删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
- {" y5 P, F6 Jdel /q/a/f/s d:temp*.*8 K. g% v* X, ~# j4 ^
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
+ ^3 s r$ V/ Z1 J
' s) m6 h( ~8 G; Z ?3 p, r/ }* ~8 ren$ |2 y1 G; Y) e" y" a4 Q
重命名命令
' u# j) ^7 O! c0 h8 _ren d:temp tmp #支持对文件夹的重命名) \0 I M+ y2 m
5 Q6 A* |, J; _0 X# R8 L% N. x: h9 cls2 L9 e! R* ~% s9 Z N2 v
清屏2 j d+ \' m; Z7 ~* g* s, n
10 type9 u$ U, p4 D4 P0 w
显示文件内容
, ~& e+ y. X2 T* h% r/ Ptype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
6 p! N' x- p( s' H9 N. \type *.txt #显示当前目录里所有.txt文件的内容$ Z6 P/ z0 b7 g+ n3 [3 E
9 _; Z) ?2 v" T5 B g9 G& k11 copy9 h5 {: F8 S: }1 Z+ j& s- p
拷贝文件% a! u2 ]* O/ p6 u4 M& M
copy c:test.txt d:test.bak
" ~2 m! O/ a8 a复制 c:test.txt 文件到 d: ,并重命名为 test.bak
9 i; j' ?5 f: g8 f; lcopy con test.txt' G* b) ?! Q b$ n& w, M
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件( S( A" ]" I7 V) _
con代表屏幕,prn代表打印机,nul代表空设备, l0 K" T$ M, [: @# E
copy 1.txt + 2.txt 3.txt
4 j$ P1 H2 p, s& C合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
- O6 j% B' F2 i如果不指定 3.txt ,则保存到 1.txt) I- g0 x" ~! _
copy test.txt +: I- o i% w- \5 e8 K4 S
复制文件到自己,实际上是修改了文件日期" F4 R' @& @4 g& j5 {8 A! Y+ S
$ j8 a6 {( E% x0 P5 t12 title
) m2 s% u$ f7 Q! T% n设置cmd窗口的标题9 x; x" ~6 [! D9 ` j
title 新标题 #可以看到cmd窗口的标题栏变了
( z* i) n$ i2 ?. N
! z" S M, [$ x0 b# U6 S( [13 ver: Q4 }* B! _; O) Y
显示系统版本
& M7 m1 K$ C* F# M2 R& C+ t: c" I& q7 j# l+ d8 ~/ ?/ Y% P
14 label 和 vol
7 z1 ]# a- t! e4 R' x* u* v设置卷标( e) Z& R) x+ N; Z$ ?% ]
vol #显示卷标
7 C; t6 a* F3 G* n6 ^5 b+ j9 Ilabel #显示卷标,同时提示输入新卷标' {* n/ G$ w& p' X3 }9 o9 N
label c:system #设置C盘的卷标为 system# f3 {5 m* R, P& @
" V& _9 J" E& u K& y, ?15 pause6 C$ U9 |6 q; k- K% F* a: W
暂停命令) f; G1 v# v+ U4 i& }/ E! Q
" q5 ^. |$ v N0 m! }5 }- K
16 rem 和 ::
1 J# ]2 q- K' V5 S/ E% ^注释命令
0 t9 u+ J/ l4 C" ?$ @注释行不执行操作
1 p6 S8 d' t0 G" `) k6 r' `) Q" z9 ~3 f
17 date 和 time( D) k) b( R' `; f, c6 T) r
日期和时间
4 ]3 ^+ Y2 r# w9 |# g: mdate #显示当前日期,并提示输入新日期,按"回车"略过输入' ]: ^/ B3 K8 ?4 T
date/t #只显示当前日期,不提示输入新日期 H* C8 w: K+ d
time #显示当前时间,并提示输入新时间,按"回车"略过输入
& y6 W* n$ a% z' Ttime/t #只显示当前时间,不提示输入新时间+ I8 y M- y8 x# s
8 Z# _( e! E5 d x$ f4 R5 t18 goto 和 :
! j. H, s# [" n0 {. U' a2 o跳转命令3 P1 d/ J* y' V5 u9 B3 x
:label #行首为:表示该行是标签行,标签行不执行操作
4 K7 F: b/ t; Pgoto label #跳转到指定的标签那一行3 U( ~8 \3 S- a/ t0 a) M
$ D. B6 F: D" p$ e2 n
19 find (外部命令)' B: o1 S7 W* g J2 b% _* [0 S
查找命令8 s+ U8 |/ a" G6 C; ^2 b1 m# Q, D
find "abc" c:test.txt
# i2 A! s% i% v9 h* }9 F在 c:test.txt 文件里查找含 abc 字符串的行
; }- T( C7 m4 j5 E% I如果找不到,将设 errorlevel 返回码为12 G$ i8 h" i% l7 E! i
find /i “abc” c:test.txt
, n* p2 H+ E1 U& y1 R! _% i查找含 abc 的行,忽略大小写
1 U1 g9 Q/ b/ D z0 ?2 {3 F% S: I2 lfind /c "abc" c:test.txt, q# Q" v, p2 d4 h" @2 B* a5 V; R
显示含 abc 的行的行数: ~5 y9 Y/ s4 b9 q6 H
$ R/ I5 c( E6 y5 j' _# C- z6 p, Q6 D
20 more (外部命令)
6 F& h2 s1 j+ I( u v6 W4 N逐屏显示
0 I% ] x3 [$ v9 I" t Amore c:test.txt #逐屏显示 c:test.txt 的文件内容
- f- o" I2 V7 ^2 k* |& Y7 E R3 g$ U6 K2 t' Z" T
21 tree2 d" K( N# \+ `4 E
显示目录结构4 `& H( |% h# ^% D4 _
tree d: #显示D盘的文件目录结构
1 s; W+ |: m& c- U: G$ T# l
5 Z N3 L* l( t: A: k4 O22 &: z( y2 {3 A7 {( G' {
顺序执行多条命令,而不管命令是否执行成功
z- }0 {( q/ Z3 C) s6 y$ y p2 @9 b
23 &&
" M/ l, C; g1 v4 y* A# F! d1 C顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令" F! w: J8 ^3 v) Q
find "ok" c:test.txt && echo 成功
, b& V4 z5 j8 {/ s; x! A如果找到了"ok"字样,就显示"成功",找不到就不显示
( D. p; o/ d) u; e; ~4 B1 E" K& v. y% x7 C8 U
24 ||0 s/ ]. I( ]6 q( [( p" P( Q. U
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
1 j. R3 J, K2 a0 i. Z3 S' A9 Afind "ok" c:test.txt || echo 不成功
# e* n1 H- I# Q' Z) v& t/ _如果找不到"ok"字样,就显示"不成功",找到了就不显示
( L4 s1 V4 C; b" L8 y# E; d+ L& D, i: v: h
25 |
" ?* f4 x( h! u' }管道命令
" B+ m0 X# z3 Tdir *.* /s/a | find /c ".exe"* e( |4 M9 v7 [# h$ o9 s6 K
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
5 v/ n: [. K/ Q f* J0 k: ~0 R该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
# ?) D1 J, W, A: K% mtype c:test.txt|more
! i8 I, [" Y; D u% C3 i! J5 y这个和 more c:test.txt 的效果是一样的
# k8 V* W) n$ ^8 O" i; z
9 P/ |3 b2 e* C5 Z* k26 > 和 >>
0 O- U- W5 C. F) K输出重定向命令
6 Y7 Y9 e( u9 g# S8 i/ o# v> 清除文件中原有的内容后再写入; W1 b9 W- j- K, i+ f: {$ P
>> 追加内容到文件末尾,而不会清除原有的内容
# I7 ?: b" E" x! M; h3 Y( w+ z主要将本来显示在屏幕上的内容输出到指定文件中
4 H) o7 H* P2 @. r' {5 Y: A& Z指定文件如果不存在,则自动生成该文件
8 y: O! }1 B. V s1 s0 _type c:test.txt >prn
- B4 ?6 a! W8 S# W' k屏幕上不显示文件内容,转向输出到打印机: `0 L# S1 T- C; z- U- h- ?- R* Q
echo hello world>con
. r" T/ p- G5 |/ u1 ?9 n在屏幕上显示hello world,实际上所有输出都是默认 >con 的% R' M0 H) C% l8 C
copy c:test.txt f: >nul
. D" u/ s* D8 N' b) e* C9 S$ i: i% l拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息4 Q" O( q* ^. l E$ a/ u% Z
copy c:test.txt f: >nul 2>nul! Q3 [) H# ~" X& e- j5 s
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息7 C$ L) ^) {8 s) _2 y
echo ^^W ^> ^W>c:test.txt; k) e- {% G" P! ]0 W% Z% w, y
生成的文件内容为 ^W > W2 `- U# [$ O: ~. ^
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
% J# E% _8 J/ d! Q' s, h7 @$ e# W4 X/ d, z5 E
27 <
+ a4 E# X4 x% y& U% ~( Y3 Z& ~从文件中获得输入信息,而不是从屏幕上 d2 u6 n9 y! }, w
一般用于 date time label 等需要等待输入的命令: K/ Q- i% U7 z7 R
@echo off5 q2 W/ F6 i; v# Y9 F4 ?: K: w8 ~
echo 2005-05-01>temp.txt+ `- \9 d8 w3 X+ I
date <temp.txt. T" ?0 K7 Q! M
del temp.txt6 s, L; ?& y( k
这样就可以不等待输入直接修改当前日期* F0 j, g# X' h
* I; I" @$ n7 E6 Q* X28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
, C4 u0 I0 H: Q& ^; r5 G0 X0 {9 D1 s命令行传递给批处理的参数4 S( y N' @' V) J5 u( i9 a# G
%0 批处理文件本身
" c) M# _$ [0 J3 F6 J( v%1 第一个参数
# X( z' N, _# ]1 j%9 第九个参数
% L# H& Z4 w) w3 E2 w1 h5 h0 J. r%* 从第一个参数开始的所有参数' _+ C+ v4 z1 t' U6 B5 d1 N6 t
批参数(%n)的替代已被增强。您可以使用以下语法:
6 d& ?# C/ D, t" S6 N- E" C, m. T* t%~1 - 删除引号(" ), 扩充 %1: h1 @" F# B* W# X1 w
%~f1 - 将 %1 扩充到一个完全合格的路径名
$ Z9 ?" Z i, G# R6 q; [ j5 X5 c$ V%~d1 - 仅将 %1 扩充到一个驱动器号) \ u; z6 `$ y9 K. Z- d3 [
%~p1 - 仅将 %1 扩充到一个路径' o, C) V4 L6 e4 x1 B
%~n1 - 仅将 %1 扩充到一个文件名
+ Y6 C6 p6 @3 F( J6 K2 ^%~x1 - 仅将 %1 扩充到一个文件扩展名
Y: A) J n& }0 u4 O$ O/ x/ C3 y%~s1 - 扩充的路径指含有短名/ U4 v; s: X/ {. C7 }7 D: _8 L
%~a1 - 将 %1 扩充到文件属性
, g* ~0 A" H. F) i% }%~t1 - 将 %1 扩充到文件的日期/时间
r1 g0 u1 }- k6 T. L' x( n1 K/ Z%~z1 - 将 %1 扩充到文件的大小
0 ]' c O2 G+ i. a- M( L/ C: Z%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %17 q! [: m8 f% E
扩充到找到的第一个完全合格的名称。如果环境- R5 o/ q& e1 z+ B" y$ Z, l7 c
变量名未被定义,或者没有找到文件,此组合键会$ V5 f0 g- j, T0 |" J
扩充到空字符串% v r* G5 Q1 \
可以组合修定符来取得多重结果:% A9 }6 L; j. a$ v: d# b$ ?
%~dp1 - 只将 %1 扩展到驱动器号和路径
- w ^/ n" n) m2 `%~nx1 - 只将 %1 扩展到文件名和扩展名5 D D. x( h+ f; I
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
9 u/ N7 h8 n' u- M8 n并扩展到找到的第一个文件的驱动器号和路径。3 Q3 S- T# n# ?$ C7 v
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。" S% {) w: Y5 Z) Y9 Q
可以参照 call/? 或 for/? 看出每个参数的含意5 t4 j* [# s& m# W' G
echo load "%%1" "%%2">c:test.txt
/ {" K9 h% v, c7 C7 m( V; ~生成的文件内容为 load "%1" "%2"
, T4 Z1 w% p8 n, H6 r* Y! v, [0 Y批处理文件里,用这个格式把命令行参数输出到文件' L5 y+ W# Q+ w% H$ u
1 f5 N9 M Z- {: g2 G1 d: v
29 if
6 Z; z1 z K) y8 W* r判断命令8 j2 E; a5 I# N8 z1 @/ X) V
if "%1"=="/a" echo 第一个参数是/a% S2 e# O) I2 N6 R: g
if /i "%1" equ "/a" echo 第一个参数是/a: A0 d4 K6 m9 W+ u" b3 r- m9 Q
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?& z, P- }- e3 W% U7 K* M
if exist c:test.bat echo 存在c:test.bat文件
% C; ]* J g1 \3 [! f) ^9 w. t8 Jif not exist c:windows (2 {& N6 E9 P6 S$ T9 l% ^) f- P W
echo 不存在c:windows文件夹
2 n% X/ f+ ?% U& ~$ w A)
' t9 [& [# |8 ]( g8 |if exist c:test.bat (
% h. K0 S3 d& G; gecho 存在c:test.bat1 S5 I( D" U7 L1 B
) else (: S8 J' S- W/ X% ~0 V
echo 不存在c:test.bat* u% N$ v' j0 G- [3 e# o5 q
)
3 L/ z) e. v1 R$ S2 j: @30 setlocal 和 endlocal
8 k4 x2 n3 s# s2 z4 R! m4 v设置”命令扩展名”和”延缓环境变量扩充”
% \, R& @3 k# }8 qSETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
9 X& X) ?1 a9 |4 nSETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"& @3 o( z. [9 Y3 Y8 a
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
2 T8 h3 ] H0 x; `SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
4 i; X1 v% d; _$ ~; K" GENDLOCAL #恢复到使用SETLOCAL语句以前的状态" S" X* d$ t* U2 b2 C; u6 S% }' i, V
“命令扩展名”默认为启用
0 q" N0 u0 y' r, y, g0 n“延缓环境变量扩充”默认为停用
$ T9 l) O7 p) l批处理结束系统会自动恢复默认值& o" |) b2 q) b4 c5 }, Z x/ D5 }
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
# M! ]4 U! W2 m序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
: ~8 ?5 j# @/ q- @ s保程序能在其它系统上正确运行
' C3 g, X( i# t; c" ?"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程! @$ N; W9 u7 y E0 k7 B1 ?
8 z' m7 I+ E# `6 P: q" ?: o
31 set
+ y# i8 M+ P" S/ Q( Z设置变量
; e2 Q6 D" m, @引用变量可在变量名前后加 % ,即 %变量名%
" `1 p1 H: A! }5 F2 bset #显示目前所有可用的变量,包括系统变量和自定义的变量+ i; j; t8 u1 v! \$ T) g6 {; k
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用6 [6 T1 z5 r* F! c( S% I; A
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1! y9 \7 X0 e4 _9 a% l2 I! O
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2" N) D0 z* h [+ Q ~
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
) o |2 O8 ^7 s7 y6 ^4 B# vecho %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb20 e5 C( R* J4 p
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2 ~5 c, ?6 y! k% q" y
echo %p:~0,3% #显示前3个字符,即aa1
* e7 o: j& N# secho %p:~-2% #显示最后面的2个字符,即b2
3 ]$ T. B; P& B7 ~echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b {) D6 I. H- q/ x2 @# K
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb21 C; o y1 B- j9 ^
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
. ?* u* v- o4 T7 W, Cecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2 ]) M1 a4 d/ |, [( L/ h6 Q+ l
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
0 v3 K# `0 ^0 n s5 Bset /a p=39 #设置p为数值型变量,值为39 j1 d' J0 E1 R+ v' s7 `
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
) ~+ m* z3 f( m, Iset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
( p. {8 S$ F0 w2 i) z+ v- t# Wset /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
$ |. q/ v7 a! H" s3 _4 _7 j; xset p= #取消p变量* D6 M( k8 V$ c4 Z8 I' M" D
set /p p=请输入
* c" Y7 n0 S3 d/ U! x屏幕上显示”请输入”,并会将输入的字符串赋值给变量p3 x: \4 n! }: u, }' ]& m
注意这条可以用来取代 choice 命令/ |' y0 b4 r I" r9 Y# f+ z/ J4 A
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
2 ?1 w$ m/ N. d. c5 J9 ?@echo off
* q( S% U4 |2 A9 t0 ]" }set p=aaa0 D3 s5 W# F4 ?
if %p%==aaa (
4 p0 q7 J' N7 x! G$ `4 q4 d6 Gecho %p%+ J- m7 @: g1 \' D, f3 }/ @
set p=bbb
4 L# K3 U7 k2 S1 |6 `$ recho %p%8 o; \5 Y, S+ u7 K
)$ {2 f' H3 e/ S* ^4 x" K# \
结果将显示
# v7 D% u9 \- T0 b, Xaaa- U- i& Q* [5 m B$ n
aaa- M7 w1 P' N6 U8 ]1 o
因为在读取 if 语句时已经将所有 %p% 替换为aaa
! t2 T3 ]+ X' N1 t: T5 {. a- w! e这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充") v3 L9 i. z1 Z/ o l- H
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
3 w% E$ a2 S2 V& T. \! u@echo off/ T9 R# A' P$ D% a- \/ q/ D+ k: T
SETLOCAL ENABLEDELAYEDEXPANSION
8 J2 T" `6 ]4 i; Mset p=aaa
2 A: ^# F6 V% a/ y, g5 i% ^if %p%==aaa (
9 J* `3 W/ y, O6 o6 O, Recho %p%) v& g9 r# I" J' y; o) Q
set p=bbb
, O/ u) i/ D3 A) @7 Wecho !p!
% Y0 u: o% ?" s% _4 }( ]7 a5 _, W)
% b' O ]( g0 `5 L$ g7 YENDLOCAL
( A5 S/ e+ h* P) Z结果将显示
- `+ p4 e4 t5 ^7 A% d/ f5 eaaa
- D- l* S- A9 [+ M- g2 Abbb( F# r- k4 `1 m' B/ K, M
还有几个动态变量,运行 set 看不到
+ r3 P& P2 h' c4 H%CD% #代表当前目录的字符串
, v* m8 M: b6 s! K' }%DATE% #当前日期- C/ O1 z2 B1 i5 q8 @
%TIME% #当前时间
( ]2 F: U% T! B: ]%RANDOM% #随机整数,介于0~32767
3 ?' ] Q& o% H$ p) V6 ^%ERRORLEVEL% #当前 ERRORLEVEL 值! F$ B2 S, A) [: z
%CMDEXTVERSION% #当前命令处理器扩展名版本号, u6 G8 h& @4 m# F! s- ]/ k
%CMDCMDLINE% #调用命令处理器的原始命令行
* D/ _1 F" d# J$ o可以用echo命令查看每个变量值,如 echo %time%
1 M+ y: \2 D7 b3 D# j" v) S& z a1 p注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
5 a9 }) b( |4 h) s5 Z- ]% I
" I5 f7 W2 _6 k! F; ~- Y6 D% u32 start
3 j3 N0 K$ ^" F: Q% a批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令3 s) f- R+ f$ M |* c( {, @
) P/ L5 ]" C+ {) B( b
33 call4 L( D# x6 Y7 k; Y+ E
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
6 Y( Z" F) j T! M3 O' m* j( j有时有的应用程序用start调用出错的,也可以call调用* o$ b) D$ Y/ V- I7 I E3 u6 F
( B, a" q& @% q" b I
34 choice (外部命令)
3 U( b2 I5 V1 _9 M选择命令, s( v& }% {# t+ T+ [
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……: o( }" W7 Z8 P) E0 h9 t. N2 {
win98里是choice.com
( I, U, q$ K9 _+ q6 |7 Mwin2000pro里没有,可以从win98里拷过来
7 C# W& r* @" V+ v8 F8 L1 M% Twin2003里是choice.exe
; S$ }2 {: Y) Dchoice /N /C y /T 5 /D y>nul
- N; T' v' G6 T* K; f! j延时5秒
l8 `" o& Q& g
( u8 E( q2 B2 o5 S8 z' w35 assoc 和 ftype5 e: m- \$ W" |$ i" c G
文件关联
" R* g/ H5 F( qassoc 设置'文件扩展名'关联,关联到'文件类型'! X M! d1 q: o( I' t
ftype 设置'文件类型'关联,关联到'执行程序和参数'; b) P$ @4 t5 U6 T
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开/ ~& x3 F% I; d8 o! D# Q
而是先判断.txt属于 txtfile '文件类型'
! l! f0 [, Z+ x$ k再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1; c0 y7 O9 U3 o/ Y- {
可以在"文件夹选项"→"文件类型"里修改这2种关联) Q* e8 d7 }* k$ N6 @. h
assoc #显示所有'文件扩展名'关联
9 i4 H; P8 s- Qassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
+ A+ S8 v6 k* G& `8 C4 P3 }assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8* s$ m) ^, M6 ~
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
; N* V4 P' l6 l6 S! ^: k1 hftype #显示所有'文件类型'关联
/ W @1 Q. n$ X/ V4 uftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
* E0 v# T* f( X, G7 _assoc .txt=Word.Document.8. }+ w" I: U" ?' s, r# P
设置.txt为word类型的文档,可以看到.txt文件的图标都变了
6 M; { l7 [5 Zassoc .txt=txtfile, J5 I2 t% o$ [+ w: W: R' M9 j
恢复.txt的正确关联
* F% ]2 D: E8 _( Q- e" ~ftype exefile="%1" %*2 h. p2 A+ U0 R3 H9 q1 {9 o8 @
恢复 exefile 的正确关联7 i' \. C w$ r; @2 F# z, U
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
8 S% {" g L. ^2 X
( R+ h8 ^/ V7 W5 |) V36 pushd 和 popd( b% O: Q# Z- _) e( K
切换当前目录
# \/ x) i4 z; Q' g: A6 r8 }1 h@echo off
! [. L6 U5 \( Vc: & cd & md mp3 #在 C: 建立 mp3 文件夹7 ~8 b4 w& |, ~. R, r
md d:mp4 #在 D: 建立 mp4 文件夹( p" d1 Y0 d9 K/ P# I: T
cd /d d:mp4 #更改当前目录为 d:mp4
0 h- ^8 ^4 v7 qpushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
* K. g% A0 y; k: k, ^; ?popd #恢复当前目录为刚才保存的 d:mp4
, j$ I3 T9 `0 B5 b" F
9 _7 G/ Q5 s4 K4 ~+ J$ l4 W2 h37 for: d" \/ K' L7 V5 r
循环命令* V3 \2 S3 l! Z" }
这个比较复杂,请对照 for/? 来看
+ E- L- r* } S" efor %%i in (c: d: e: f do echo %%i
7 S. r" P: N3 y# _依次调用小括号里的每个字符串,执行 do 后面的命令
1 P0 c1 S4 b7 x# ~, S. [0 u注意%%i,在批处理中 for 语句调用参数用2个%
; e1 X9 ^( y) W8 P默认的字符串分隔符是"空格键","Tab键","回车键"7 P0 F$ C ]5 _# W
for %%i in (*.txt) do find "abc" %%i+ ]# i; |2 }: g! H8 O7 T. m; R6 b
对当前目录里所有的txt文件执行 find 命令
, i4 q- b5 x- | a2 W: H$ A% Yfor /r . %%i in (*.txt) do find "abc" %%i
2 B0 a1 |8 k1 D7 u+ C在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
: t% g/ \' _$ @/ Ifor /r . %%i in (.) do echo %%~pni
2 S4 t c) y E" T5 a显示当前目录名和所有子目录名,包括路径,不包括盘符
$ j2 q- y& w' v9 m+ Hfor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt7 I1 D- t" J% H' p4 ^# E5 J, r
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去6 X9 X4 B7 B, \1 b. B8 E9 G
for /l %%i in (2,1,8) do echo %%i
' }+ s3 _3 h! q5 E4 K) D! q, o0 t! P生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
t4 D5 _+ d' C/ f/ ufor /f %%i in ('set') do echo %%i1 Z7 K! R* `& m4 C
对 set 命令的输出结果循环调用,每行一个
: p$ k7 @$ f& Z. q, B# ofor /f "eol=P" %%i in ('set') do echo %%i* U) q2 D! E2 ^/ V) F
取 set 命令的输出结果,忽略以 P 开头的那几行& e. T' t8 r& p, b/ m
for /f %%i in (d:mp3.txt) do echo %%i/ _! U) k) B6 W7 P' X% v
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
; e" N$ n3 \ z s4 K, Nfor /f "delims=" %%i in (d:mp3.txt) do echo %%i
3 t0 {! Q# z: d: I) T: ]显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
5 q: i) v5 T: a- y, Cfor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
4 ~. Z' G0 i8 `4 \2 g对 dir 命令的结果,跳过前面5行,余下的每行取第4列
- {, h/ z* m+ q7 X$ X5 y! K# \每列之间的分隔符为默认的"空格"
E/ z* Q; @! m5 G可以注意到 dir 命令输出的前5行是没有文件名的
" x2 x! {4 b ~% ?0 P0 }; Bfor /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
1 m- n$ K! G. J* n) e' f# _echo %%a: w' s6 x6 _6 | Q0 }/ U
echo %%b
! A" ?6 N! C, { U0 ?5 recho %%c
, P' }* O" q& N$ t' m' F: V: j4 e)) K0 W2 s2 s2 I7 `
对 date /t 的输出结果,每行取1、2、3列9 T2 S& F3 h! x! o8 w% M
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列7 G" [7 P# A6 D5 T, D0 e) {& f
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格". F5 C. x$ h9 ]) |
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
% ?: ^) r2 l- ?8 r& qfor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b9 \- J: E% T5 Q/ T7 ]; R
取第2列给 %%a ,其后的列都给 %%b( [4 i4 T4 j+ K) a3 q
) c" U5 }) n* m- U1 g: V7 @# A
38 subst (外部命令)
9 @8 V7 Y5 {+ y7 L8 w4 C4 Z% N* f" L映射磁盘。
/ y5 v+ _* e$ Q+ ksubst z: serverd #这样输入z:就可以访问serverd了
- X$ ^) y u) y1 J/ X) jsubst z: /d #取消该映射
( w6 @, Q8 ]5 A" d" z2 O+ e9 t% ?subst #显示目前所有的映时
3 c1 g9 |# g9 N% h# D* a! u$ K* C8 H1 ^! j" R( Y
39 xcopy (外部命令)
5 J8 N5 U, e; e文件拷贝
[7 ]/ N' e/ ^3 v2 n$ Qxcopy d:mp3 e:mp3 /s/e/i/y+ Q: a0 ?# `8 x" b
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
( D0 I2 g* J9 Q. o8 ?加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问, l* ?; Y! z/ P
5 n \( i% O" B7 E) f' Y2 [
常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
4 c, g3 P5 a" p$ ?" Z# O- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:+ E9 G+ `- Z/ ]. ?
" z% M+ l. o* G1 }( z
@echo off, O0 n# |$ y% ~, y5 X1 i2 b$ R3 e
set p=aaa
4 D4 i* t* Y$ ?+ z0 `if %p%==aaa (
+ i5 [. s5 }3 Aecho %p%
+ v+ x- _: p' Q/ F. F' C# B& N! b* ^set p=bbb
9 X0 G1 [: v E% c: c9 R( G3 X/ xecho %p%
5 B, |. O5 O, g9 u( K) w)
* a7 D( o% T6 T* Y+ |$ F' ?$ L: v, rpause
截图:' U9 M& D6 {, C1 I/ _
2.批处理.bat 文件中输出中文乱码 + j3 y& P: }1 `3 i
- 原因:记事本新建的文件,编码不是 utf-8
- 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
- 操作截图:
( D7 p6 \0 Y4 P, N, }* w - 效果截图:
. p$ }6 o& u: F/ U0 q
! e k/ W8 N$ B% F3 h# q' E ' X; |) d& R2 A# l- c8 o9 r
& B1 x6 _5 _& R: a" B' z |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|