|
|
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!
X6 T8 F7 t0 r1 _8 {5 H; \ 前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效% R7 x5 L" C1 V/ i: @( o
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
' n$ ^' C ]$ F名为bat 目前比较常见 的批处理包含两类: 2 M1 k- k4 L8 y( k6 z
- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理) D; ^# J/ D* E& V5 x' q9 f/ }
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
( g$ R" Y, \" ?; k命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件 [+ _8 }/ |% N0 U) _- o3 I
怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出8 M. \$ v8 P$ S! w# ?7 K2 L
批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set
, V$ J8 S* S: b! z# a 批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||: O( _' a9 l* E0 U9 g S( a
常用DOS命令- 文件夹管理:
" j8 U6 w- g3 N Z) @# g- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。, ]. B, u0 ~! D- P; S
- 文件管理:: ^ x0 y% I. o$ c
- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同' Z3 C5 f- W3 [/ E$ c# x7 @9 P
- 网络命令:5 z/ a& \( G4 e s# }! r- X" V5 A
- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表
$ R( S; x8 ]& q$ r
- 系统管理:* d' l c/ }( T. @+ Q' P. F' G c
- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置. P$ f( o: w; S, J; L
8 P; }) k; L( o' g, {
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /? 9 g+ y% I' G) B; K+ a r% G) H
' k! }( I! ~& Z/ p c( C- j- D
Windows Batch 常用命令
1 A1 J2 ^) A6 L' I) j4 f: @1 echo 和 @$ e+ X7 q; E' Y: q' s
回显命令
1 |! x( `) Q |$ q6 K+ t8 g@ #关闭单行回显9 N q+ X9 O1 E" }% {* I
echo off #从下一行开始关闭回显& {' y) q, l6 o6 m: Z
@echo off #从本行开始关闭回显。一般批处理第一行都是这个
7 v* d) v7 ` secho on #从下一行开始打开回显
. G. ^- z( O' r/ ?( B5 iecho #显示当前是 echo off 状态还是 echo on 状态
; u+ }3 B3 y4 `echo. #输出一个”回车换行”,空白行
" ~* s! r: K- p; v, `#(同echo, echo; echo+ echo[ echo] echo/ echo)- _1 q [! I, l5 J" K3 l- B
) e: o$ b% J( r% @7 l4 I$ @2 errorlevel
' R' I9 z+ J) aecho %errorlevel%( {) [% X" w# |* }" o0 U. d7 _, y, G0 q
每个命令运行结束,可以用这个命令行格式查看返回码
' H& E4 e( F2 @/ ]0 a- g6 q, |默认值为0,一般命令执行出错会设 errorlevel 为1
, q$ y+ q" N; c% x# [/ p1 v* g/ Q: |$ }; \
3 dir
3 I0 [7 k: T" J) V5 X& }2 d/ b显示文件夹内容
# B% F1 [+ C4 `$ i# odir #显示当前目录中的文件和子目录
% S, l4 I$ B9 h4 t5 h0 o8 O- i8 |dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件( U1 W% ^7 s9 h* ?, B3 n8 `
dir c: /a:d #显示 C 盘当前目录中的目录
5 k4 ]; r0 F, Q" Y6 ^$ f9 D5 K/ f Cdir c: /a:-d #显示 C 盘根目录中的文件4 }) h, C$ t+ w7 p; s; D2 i
dir c: /b/p #/b只显示文件名,/p分页显示
' y) Q Y! s' u8 u4 l- X- Ldir *.exe /s #显示当前目录和子目录里所有的.exe文件
( R( N8 [8 j# T+ d. a7 O) H
. U6 q: N2 q. A9 b& ^4 cd
1 T8 z; E9 F+ Y7 e切换目录
! n9 z2 S" }' }2 hcd #进入根目录
; A( p4 [% d7 |" {8 Ncd #显示当前目录" H& U0 A4 g- _4 g' s3 t* z
cd /d d:sdk #可以同时更改盘符和目录
) O( e+ `5 r3 B& |! Z% T2 ]
% g7 u% b1 F9 ^ N8 \- D5 md
, Q! C% \1 ?9 C g. C" W创建目录! C- c5 n4 n, b; s! A
md d:abc #如果 d:a 不存在,将会自动创建中级目录
: M7 T& u" d$ o& Q! w6 H2 ?0 Z2 M#如果命令扩展名被停用,则需要键入 mkdir abc. ^4 S; _. t5 R* N
) ]# z$ W4 D, D" G7 Q6 I* }6 rd, C( t( w( M( G, g
删除目录( f3 l6 d& F/ u7 x
rd abc #删除当前目录里的 abc 子目录,要求为空目录, W0 O, S1 \" A# n
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式; `2 y+ S1 o9 d W/ z0 q
( E; b5 {: f! v6 D6 X+ Z6 C
7 del+ I# K6 A: C# v1 K& ?, r
删除文件( W( e6 \" Z" [/ d: Q- L
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件+ F4 {! g; d! G! S$ ~
del /q/a/f d:temp*.*' r' ]! A, |- O" W! c* n$ ?
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
$ c5 {2 z0 y4 Z- e- c, S6 @! Pdel /q/a/f/s d:temp*.*5 g5 W6 m3 \; q# E
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
, e! ^6 F) F+ D; n+ }; e! X& c& U
8 ren
% w) v) B: V( N3 h8 {' i8 z重命名命令5 s9 N7 I: P* z2 a
ren d:temp tmp #支持对文件夹的重命名9 B; t: Z. t4 o6 @7 w3 z
7 m3 W9 o( ?$ w! G: ] h
9 cls
6 m. e# c B3 x* v/ b' z清屏
: c9 E/ p0 n3 w3 G% @9 [10 type
# p s$ C1 u: q. C# g# d" U显示文件内容0 i( A8 W0 {( c# L7 g" [$ k6 k
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
# j2 F# l2 Z- ?; I+ r% {8 f6 S7 dtype *.txt #显示当前目录里所有.txt文件的内容
0 Q, ? V# X* k( ~" K6 ~
8 u& A: A% o5 T/ \1 O11 copy
/ z' }2 [( q R2 _拷贝文件
' x/ o' J5 G) o- [! fcopy c:test.txt d:test.bak# p. V- e' C) e, B- R
复制 c:test.txt 文件到 d: ,并重命名为 test.bak
" c# G# U$ U ~3 ?: @4 ncopy con test.txt% j( [+ V% K3 u5 k7 \$ `
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
! Y5 u/ w1 H# Y, n* ]& V% A g3 d* {5 Scon代表屏幕,prn代表打印机,nul代表空设备
& `! g0 }* J' W) Dcopy 1.txt + 2.txt 3.txt7 x* I8 j3 i; { N9 v, k( N( F
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
) I* F* k( v. K/ e w如果不指定 3.txt ,则保存到 1.txt
1 ]7 S1 D& ~. ]$ qcopy test.txt +$ u" x' [3 F& ^1 m' s
复制文件到自己,实际上是修改了文件日期( T2 ^2 K7 q- b1 b2 @2 e: {
; |% l! q# ~' n# O+ K p12 title
( g' w5 M: v6 T, l# t( Y# ?' O2 t设置cmd窗口的标题
$ f$ Q3 F, M# \4 X2 j- Z$ }2 mtitle 新标题 #可以看到cmd窗口的标题栏变了9 q2 y# Y. i2 p- }) P
2 d' b; m+ d+ S! T7 a" |
13 ver; s9 J# W4 ? B: l* t' |: L- p& _+ w
显示系统版本' r2 M2 y+ W6 v) f+ j
7 d0 J7 e1 J; F1 X$ q( r; z) B14 label 和 vol' }0 M- B7 m {) n% h7 K& [
设置卷标7 g6 B' ^/ a3 v/ \ P
vol #显示卷标
5 W) C1 v( S% U) \; klabel #显示卷标,同时提示输入新卷标
% ]/ O$ G) |" \label c:system #设置C盘的卷标为 system0 R6 y7 f) z' D6 N
! D# R+ v: `- u
15 pause
% R ^( V6 Q# {% Y8 M- |; j* y7 l暂停命令9 r6 {5 n/ e& \6 ~3 q- O5 D) r+ C1 T
9 g, L0 U' N" K, q$ B! q2 C16 rem 和 ::
' w8 D, h, h0 n4 B# |: Q- Q4 m9 x注释命令
! g: E* _6 A# E7 X3 z注释行不执行操作4 P) ~3 [8 p3 J: I9 W+ w
: R7 ?4 u+ J7 V2 y* H17 date 和 time8 j5 s6 i2 y v0 I3 w
日期和时间
7 E. @/ |. I d0 ^ F# O/ Bdate #显示当前日期,并提示输入新日期,按"回车"略过输入
8 I+ g: y7 o- k/ Bdate/t #只显示当前日期,不提示输入新日期
T4 d. W( e; Etime #显示当前时间,并提示输入新时间,按"回车"略过输入
# L; M" P: ^; ]/ Ktime/t #只显示当前时间,不提示输入新时间) e8 d+ N, B: e8 {% p1 {
% n P2 r6 Y+ d; k ?5 v5 ?6 U
18 goto 和 :3 N) ~, S7 a' o s% U, z
跳转命令% V& H: D2 m L( q
:label #行首为:表示该行是标签行,标签行不执行操作3 Y, U: q, V9 J7 t$ V
goto label #跳转到指定的标签那一行: V3 V P; U/ _+ f
* k {* J( {3 J' } B$ R3 i
19 find (外部命令). ?5 S# ~. ^) R& _9 M
查找命令 g: |6 V$ c6 T# Y! c$ l
find "abc" c:test.txt! E- `' r3 ]- F7 Q4 o
在 c:test.txt 文件里查找含 abc 字符串的行
3 J: [& x! X' |0 P3 G, U; d7 M如果找不到,将设 errorlevel 返回码为1; L7 x- j; u+ w+ z2 |
find /i “abc” c:test.txt
( H. l/ j N' D查找含 abc 的行,忽略大小写9 j! s, c0 E1 w* z8 r
find /c "abc" c:test.txt
, m$ W' Y, V# B4 H( W7 h# M显示含 abc 的行的行数" `& [! y" ], l) A* c
1 h" H1 F* T e8 T
20 more (外部命令)
7 g3 x9 A; ?. h# M. D( O$ v逐屏显示
% o, }' q+ K/ l& L6 Hmore c:test.txt #逐屏显示 c:test.txt 的文件内容
& W+ _# C) _! U# q( R7 w
4 F' o, t; }3 }, t9 F1 K21 tree
/ [. f$ L% e5 S! S0 s2 E3 y6 o显示目录结构. a7 H- A `% E5 C% E
tree d: #显示D盘的文件目录结构
) `5 ?. `0 b' Z- k4 a4 S4 B( n+ v* y! ~2 H
22 &
. @+ Y' I- a! k9 n顺序执行多条命令,而不管命令是否执行成功( T7 {1 t9 {( K! ^9 d
- n; @6 S8 h2 b" \
23 &&
0 D7 K1 d; r0 D0 Q, \* o- Q2 i顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
$ C9 n4 _: v" n; `. i5 d# Hfind "ok" c:test.txt && echo 成功
! G& p' i( Q) G( A; N如果找到了"ok"字样,就显示"成功",找不到就不显示
9 S) @9 {$ i# y- A% i" ]; H* o; U7 O2 J+ O* [3 n
24 ||* ^" c9 S% D; L* o( g1 z
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
0 Q7 N* A# I7 ~' r# F* mfind "ok" c:test.txt || echo 不成功( G8 A: R# o* X9 x
如果找不到"ok"字样,就显示"不成功",找到了就不显示+ ` c1 ~3 D. _$ X4 U- L) E
' {. {. Q+ \9 A" C25 |: [2 `+ G: @: ~7 P6 B0 F
管道命令
Z6 q1 f/ o; A, P4 _7 y4 udir *.* /s/a | find /c ".exe"1 R, W; J, Q/ x
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令1 i: J, z9 ^0 B/ R5 d. p6 d/ y
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
; v0 Y& L, c$ |0 Q7 ?type c:test.txt|more
5 ?2 K7 z* d& p+ v5 R这个和 more c:test.txt 的效果是一样的
0 ~) g1 J$ `' S- k d4 o* o9 W5 y& Q- J* E( x
26 > 和 >>: y8 z+ q1 G1 ]$ a
输出重定向命令
+ s) J9 h! ?1 L5 B8 e9 F0 }8 w> 清除文件中原有的内容后再写入0 b6 }0 V: R% F0 Z( }# n
>> 追加内容到文件末尾,而不会清除原有的内容% H9 G2 e; k3 V0 c* f6 n- N
主要将本来显示在屏幕上的内容输出到指定文件中7 W( K+ Y, g a! Y
指定文件如果不存在,则自动生成该文件" G. `! R, o% |" S& C4 k
type c:test.txt >prn% }5 l) x- ]& q) ~" m/ ?3 V
屏幕上不显示文件内容,转向输出到打印机
7 N, e, G6 x( _/ }- K9 wecho hello world>con) A, ~1 `$ W1 ^) D
在屏幕上显示hello world,实际上所有输出都是默认 >con 的
1 @0 o9 _$ d/ G7 Scopy c:test.txt f: >nul
! \: R* ?+ g. W: ?$ R拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
+ j5 k1 c; m& S% scopy c:test.txt f: >nul 2>nul
6 T3 m2 q7 q- t! T不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息& j6 e5 a) k6 ?: R
echo ^^W ^> ^W>c:test.txt' v/ D" J9 h& o9 q! O& y
生成的文件内容为 ^W > W. O) B/ J+ T9 q/ h# b
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
; k6 x$ r3 P) ?/ u6 e
, U" G1 @ j2 T. |1 G27 </ ^- q* f! v! U- v8 t+ b! p1 {
从文件中获得输入信息,而不是从屏幕上* ^& O: K! i( E
一般用于 date time label 等需要等待输入的命令1 ^$ [: y3 l: t
@echo off
4 f, \# P; A; B6 p3 {8 [, N( ~8 Techo 2005-05-01>temp.txt* b! m/ ~' s v* }. N
date <temp.txt* ^3 u* Y* J. Y- ~9 S
del temp.txt8 j4 m# J5 y$ i) o* U* Z' k
这样就可以不等待输入直接修改当前日期) d2 J+ K* n/ w3 r! i, f; @( ~
; Z) C; @$ _! V% T28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
$ M7 V8 E8 N3 _3 Y) J命令行传递给批处理的参数
" {1 l1 V3 L7 ?1 G$ B%0 批处理文件本身
7 m( Z7 ]) y3 f, ?8 ]* p%1 第一个参数/ P5 a5 w, W3 k' j
%9 第九个参数0 L6 Z7 t. U4 ?3 K6 Y
%* 从第一个参数开始的所有参数
: H: u% \% x2 B! f& [批参数(%n)的替代已被增强。您可以使用以下语法:
* X' n- W7 n. v1 j* D( [" G%~1 - 删除引号(" ), 扩充 %1' P- r* s7 o- p8 `5 o, E- h
%~f1 - 将 %1 扩充到一个完全合格的路径名
3 r$ M3 ~4 P; [' y$ k' _3 X N%~d1 - 仅将 %1 扩充到一个驱动器号1 [. d. k0 O( T7 p+ E
%~p1 - 仅将 %1 扩充到一个路径& C3 b$ z% m2 N+ o: T0 `' v' D
%~n1 - 仅将 %1 扩充到一个文件名# q1 t, E9 N& ], } {
%~x1 - 仅将 %1 扩充到一个文件扩展名
* q* W, ?' x& L' t%~s1 - 扩充的路径指含有短名
1 E4 I1 V9 x& S3 T%~a1 - 将 %1 扩充到文件属性
9 R2 E" f5 O8 s0 \. X%~t1 - 将 %1 扩充到文件的日期/时间" X" B/ r3 X; d+ C3 K7 D
%~z1 - 将 %1 扩充到文件的大小
8 `, k) C9 ^+ |' v' y" W. u%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
& }6 E, Y# ?" F$ l$ b7 f扩充到找到的第一个完全合格的名称。如果环境4 ^& j% D4 F! b) ~4 |
变量名未被定义,或者没有找到文件,此组合键会
' t! I' p1 X" P1 {$ N扩充到空字符串: d+ V" {9 D5 C+ m' Y: r; ]0 h
可以组合修定符来取得多重结果:
( L7 L( m( S* z% ]%~dp1 - 只将 %1 扩展到驱动器号和路径
8 [( e1 B# y9 \% Z) c5 W! s%~nx1 - 只将 %1 扩展到文件名和扩展名
% a- Q0 d$ |: K' F2 y2 d" J%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
$ ~2 a9 [$ g6 b2 t; U6 D) J2 F并扩展到找到的第一个文件的驱动器号和路径。- f- i4 P1 a& q7 `$ u; a
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。* i9 k7 b5 B6 K( c# v
可以参照 call/? 或 for/? 看出每个参数的含意( L$ s9 G0 s' Z% a* \5 P
echo load "%%1" "%%2">c:test.txt' E: b- R9 I& u6 U' [
生成的文件内容为 load "%1" "%2"- ^' b$ j7 L0 }& B4 A
批处理文件里,用这个格式把命令行参数输出到文件$ C: G0 }9 ~( A- a. O& T
% g5 m# q M% B! D29 if
& c2 r% `' Q: k h. |3 T& F判断命令; X5 i O7 n0 i, {2 }0 }
if "%1"=="/a" echo 第一个参数是/a; Y* S* g2 W7 {, F' R5 H
if /i "%1" equ "/a" echo 第一个参数是/a. v% v, W( H5 r, I$ {; @
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
2 P6 a+ ` T6 Y8 y8 fif exist c:test.bat echo 存在c:test.bat文件
! s$ G7 g$ ]4 u; t3 B1 C2 Iif not exist c:windows (4 L' P$ n0 J+ z
echo 不存在c:windows文件夹
m p- G- t. f)+ S" @ E& U( s
if exist c:test.bat (
& B6 k" T, D% x# X+ A. Wecho 存在c:test.bat
9 L7 U2 k. p% C- V+ h4 b* ]0 Z/ |) else (+ ?" Y: D- R. J% u3 z q9 T- y$ Q
echo 不存在c:test.bat7 O! w4 x2 s8 @, i4 b
)4 K' u( G9 p3 E6 ]3 h. ]) m
30 setlocal 和 endlocal
. G* N) c. J1 d, C6 z设置”命令扩展名”和”延缓环境变量扩充”/ F0 Q) s$ @( o- D
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
/ h2 m/ t( e2 D% I+ C# LSETLOCAL DISABLEEXTENSIONS #停用"命令扩展名" b% ~9 V6 k% m, x8 g6 K/ p
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"+ \& P. q# l$ v+ q, J# s
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
: N' k G q7 P' g9 `4 E! lENDLOCAL #恢复到使用SETLOCAL语句以前的状态. A6 A* x r8 p& U
“命令扩展名”默认为启用
$ Z E. W8 a' V W7 U( @0 v“延缓环境变量扩充”默认为停用! U% |; \5 }+ K2 `, W% ^
批处理结束系统会自动恢复默认值
]" c, @5 Y* F' d4 K9 j1 R: V可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程& _/ ?* ~# T( n
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确0 O' j4 P6 s8 i @$ a
保程序能在其它系统上正确运行
) s [3 k P9 R5 |"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
, B( h& G2 a! b |/ P9 ^. j7 R1 n8 y7 @3 F
31 set2 f9 r0 W2 }% Y
设置变量
) j+ t# p; x q引用变量可在变量名前后加 % ,即 %变量名%/ v% a( C. B$ J6 n( K4 Y
set #显示目前所有可用的变量,包括系统变量和自定义的变量
( I2 y/ ]( W5 k+ o* Decho %SystemDrive% #显示系统盘盘符。系统变量可以直接引用9 F* U# v3 E6 c+ L( i Y# e9 q) B
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
; F1 r3 A7 O& K2 {4 @" J5 |set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
1 I* t( [* N7 becho %p% #显示变量p代表的字符串,即aa1bb1aa2bb2 @5 ^! n, V$ Q. T. [6 t
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2. y" R& w! I" X3 h
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2
. R$ q2 e4 @' S1 U) q9 v0 n$ b7 Zecho %p:~0,3% #显示前3个字符,即aa14 D1 |4 F( C5 K! I6 J3 n
echo %p:~-2% #显示最后面的2个字符,即b2
8 u$ p7 H3 r- x3 X* @7 p5 aecho %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b/ M$ p s! S5 s: m/ `3 V- \* {
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2" ~9 [0 [+ U2 \/ ~; R
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
x! m" e, U! h% W+ Xecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2! B c. u3 f4 [8 ?! B3 m5 K
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
4 ]7 a3 H0 Y/ V. b+ Sset /a p=39 #设置p为数值型变量,值为39
; e- K( h! Q) S8 M; oset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=37 ^1 u; g( b3 C5 a
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
' D h9 `( G! K$ W# Hset /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
4 K+ |' ]8 r2 k9 dset p= #取消p变量
" _' _- l2 n+ C+ @set /p p=请输入
" a- W: N2 B# U, X4 \屏幕上显示”请输入”,并会将输入的字符串赋值给变量p w5 [' ]) R+ L5 l3 u/ N# I
注意这条可以用来取代 choice 命令
2 S( b, O* Y7 }注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
! O2 b8 q* _; f* h6 H9 h3 u4 W@echo off( ^" F0 x1 k7 V1 }) S1 s
set p=aaa! S' S5 c9 g% x; x
if %p%==aaa (/ j9 B& ^0 p4 d3 K; r+ m: P
echo %p%
5 Z: R- F3 [4 [2 \2 o1 q1 \$ Mset p=bbb
$ T. l7 O1 {$ ^2 L5 L- [echo %p%* N" R5 y* R4 z# x
)
$ O' u, r5 _" A结果将显示3 o* N- n4 |8 Q3 b u7 d5 S5 _
aaa
z- _6 R- I9 n% c9 ?/ Oaaa
2 a" y5 g! f: s e+ g# g1 e因为在读取 if 语句时已经将所有 %p% 替换为aaa% x" u$ ?2 A7 d( E
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
& X. N& K: D: v8 J可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!/ V" H, a$ J# a: C
@echo off
! |6 a$ F! S) ]9 V# z8 wSETLOCAL ENABLEDELAYEDEXPANSION
$ Q) ?- K/ M i3 K+ e" g! ?set p=aaa* j9 b5 x1 ]7 d4 }$ V& G2 p9 |% H
if %p%==aaa (
0 h! C1 l L# uecho %p%* S) B' s* o) c& L& A4 H9 ~
set p=bbb6 N" S" N: Z! o9 R/ g
echo !p!! x9 u! D! q) W8 q
)
- G, V ]/ Z* W- @3 [& }5 h5 T' nENDLOCAL
, ^" A2 O# A0 V结果将显示
9 z/ `: @! Z6 i5 d8 uaaa7 q; o$ ?$ k' [0 z/ g- [
bbb
7 ^" A* m" u5 w G还有几个动态变量,运行 set 看不到# q& N0 R' s- e- G2 @
%CD% #代表当前目录的字符串( p# G; o& U1 G
%DATE% #当前日期$ |) @9 h$ P0 z/ L, }) o# }
%TIME% #当前时间
# g1 _7 N0 r. f$ W%RANDOM% #随机整数,介于0~32767: l! J! n1 E8 C( R' ^
%ERRORLEVEL% #当前 ERRORLEVEL 值! e9 {8 O, O, O/ j" G" r
%CMDEXTVERSION% #当前命令处理器扩展名版本号! Y1 _: H- y: P1 J
%CMDCMDLINE% #调用命令处理器的原始命令行7 x! x1 ]' d% Y
可以用echo命令查看每个变量值,如 echo %time%0 [. V2 i# D4 r4 e6 f# t4 s b) |
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到# }) ?" l; }4 h+ F- r& q ]
# i4 K$ U, P w2 y4 ]7 q32 start
3 R7 W& ~+ ]+ D5 P& @6 I批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令9 c) c1 _! J, U+ Y! S' X% M! f$ a- c
$ I. [& G1 ]# _. K* J! s33 call( |! |, T3 c& r1 D6 b& E- {1 U. X
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
8 O- W( s( v( C( G/ L7 R! ]( e2 Z有时有的应用程序用start调用出错的,也可以call调用
) q$ B1 ?' N" V9 p8 `
: ?: y/ X5 U& J34 choice (外部命令)
2 a2 [: T5 j, T. C m/ |; w选择命令
/ G t2 x$ k' ~6 u+ J# Y" C让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……, x3 U$ [4 m$ s- {% K* ~ O
win98里是choice.com) x! i8 s9 s8 @$ v
win2000pro里没有,可以从win98里拷过来
# `! T! O! U0 j/ ~( @2 gwin2003里是choice.exe
7 M9 ]3 \$ Y% u4 wchoice /N /C y /T 5 /D y>nul
+ f" D& |7 I2 Y% ^/ q# n延时5秒
4 q% r. R, v6 N* l8 _" M3 B; n$ C, x! V1 P) i
35 assoc 和 ftype
( m2 A& A* U. x文件关联
8 o1 G4 W$ a6 y6 F; v8 p& d fassoc 设置'文件扩展名'关联,关联到'文件类型', y: P) S1 ~2 ]& z) v* z/ Y
ftype 设置'文件类型'关联,关联到'执行程序和参数'
) C8 P* w+ |5 a4 O当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开! I0 b$ ?$ Q! Q# K% D& d* o
而是先判断.txt属于 txtfile '文件类型'
% K# D ^! J/ R0 U再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
# [, n0 f* O- B9 i, ^可以在"文件夹选项"→"文件类型"里修改这2种关联3 G) m" c) x3 @- ]9 G) c
assoc #显示所有'文件扩展名'关联
; }- y. x3 J; w0 ?" vassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile" P; m1 {8 S/ ? H/ r# g5 N
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.88 z0 S3 ~. I& I
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile* g/ z& s2 b, ?
ftype #显示所有'文件类型'关联: n! Z- H! z0 | R) ^
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*- b8 P( \' L: e# j
assoc .txt=Word.Document.8
4 L- v: V0 H; C# A* N; _设置.txt为word类型的文档,可以看到.txt文件的图标都变了
" y v2 F! W7 @3 ^assoc .txt=txtfile
6 z. a$ h6 N0 P2 k) d恢复.txt的正确关联
; V0 {5 `+ n% R# B: s5 Gftype exefile="%1" %*
; r& ?8 _3 [( H$ @4 i, f恢复 exefile 的正确关联
: W+ l, B6 a* E" ?/ @3 O" }如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
! o, T* A( L# K+ i2 e( ?! |8 U& g3 O( l) X7 {
36 pushd 和 popd
6 G. S, z, ^+ ]( e, `切换当前目录
4 a4 I! d6 x% A. ?$ o' O' f z@echo off, c) D4 G( ]: A2 A
c: & cd & md mp3 #在 C: 建立 mp3 文件夹! d5 c! Z: L V' t1 N
md d:mp4 #在 D: 建立 mp4 文件夹
8 k7 D, N0 i2 l9 G" f) jcd /d d:mp4 #更改当前目录为 d:mp4
0 o. ?8 e: n# y- t- b% m- ^& ?) epushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
7 m) L2 q( v |; d: j% mpopd #恢复当前目录为刚才保存的 d:mp4% E% u& L) v8 d* e$ Q- s
. U# I: A/ k6 d( ^6 B. W2 v* q! F37 for* s- g2 b. h1 B5 b$ Q5 {. S
循环命令4 Y \& k+ q# |6 x6 ]" ?0 ~
这个比较复杂,请对照 for/? 来看2 G' s$ `4 i+ X' A9 N; I |
for %%i in (c: d: e: f do echo %%i
6 i) ]$ X! s/ d, T C7 f依次调用小括号里的每个字符串,执行 do 后面的命令/ g9 [ Q. z! @. W9 j
注意%%i,在批处理中 for 语句调用参数用2个%
' Q$ S4 U4 E; S0 n8 u& X0 \+ S' [默认的字符串分隔符是"空格键","Tab键","回车键"
$ U# Q) i' ~# i' i4 m( O4 Vfor %%i in (*.txt) do find "abc" %%i3 Z) K, Z) ^( j5 V3 P: |
对当前目录里所有的txt文件执行 find 命令# t& f0 E. a" V6 f" B
for /r . %%i in (*.txt) do find "abc" %%i0 ^% J& Q- O) [: I: A/ f
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行' C7 w5 D- ?3 o. v
for /r . %%i in (.) do echo %%~pni
! W; X9 P# b7 g3 \$ ?显示当前目录名和所有子目录名,包括路径,不包括盘符
, W5 M3 ~, O h# Kfor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt; g& C! z4 M$ B m" a2 L3 ^
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
8 n0 M7 R9 A4 a2 r) h! sfor /l %%i in (2,1,8) do echo %%i% _$ k8 O, K8 r
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
7 J# H* s7 k# Hfor /f %%i in ('set') do echo %%i" n& V. ^1 E+ {1 M2 [8 k8 e3 F% Y. k9 _
对 set 命令的输出结果循环调用,每行一个7 V- w+ B b) \3 x2 U0 z9 s. J
for /f "eol=P" %%i in ('set') do echo %%i
. F/ Z8 e. Y4 v) n取 set 命令的输出结果,忽略以 P 开头的那几行5 u! n! j; U- P% m0 T
for /f %%i in (d:mp3.txt) do echo %%i# j @$ Y0 y. t6 R: _# s; x
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称: y7 P" u& S6 n/ B
for /f "delims=" %%i in (d:mp3.txt) do echo %%i B( K9 G! E3 s; S: J
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
" m G4 u! [* j0 h3 }* ~8 Ofor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a _: j9 ]& R) q
对 dir 命令的结果,跳过前面5行,余下的每行取第4列% I6 T3 o. [( T$ [1 X
每列之间的分隔符为默认的"空格"
% _( n {. l: e2 w可以注意到 dir 命令输出的前5行是没有文件名的
8 K8 H$ s. |& L& N& S2 ]1 T) kfor /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
7 ^' `: ^( P0 p( Eecho %%a
" o Z( `. Q1 u6 h cecho %%b* `7 \+ p7 p# O8 Z
echo %%c
9 Q% P3 N" g2 r7 P% J)
: ?- z- L! d$ ?& ]* S, E) {! k2 @对 date /t 的输出结果,每行取1、2、3列! Y B7 Z5 A: P! ?! d4 A2 k
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
6 Y# S: E! i& ]- g. {分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"0 I' X! H* S F z: \6 e: }* V
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
. c! z! _7 j6 U$ D% Zfor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b: O) _2 g+ z, k2 q0 Z# ^/ C% l
取第2列给 %%a ,其后的列都给 %%b
( B# K6 a, l2 N6 a% ~ N$ V2 l1 T4 m: x
38 subst (外部命令)" p7 ?0 l1 L$ ?. y& _ M$ X1 E: G
映射磁盘。
; d# Y/ k% \" a8 ysubst z: serverd #这样输入z:就可以访问serverd了# V: s L T# Q" ~6 |7 B
subst z: /d #取消该映射
% S$ q% s5 {0 |7 R, U7 _: z) Osubst #显示目前所有的映时
5 ~* S" P* p$ q& f' I3 O3 B3 \8 Q0 J7 L) T' w- H
39 xcopy (外部命令)
& G& w# ^" Z0 B: l+ W文件拷贝
1 p8 d; ^- k, M; B& }+ s4 ]& Bxcopy d:mp3 e:mp3 /s/e/i/y
2 p- a7 M& }5 s- O* r7 W复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
+ L% u+ g. A5 L, d/ I4 P! i加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
9 \4 D \- J6 {9 L9 `& G" H1 N4 \* m: u3 G7 a+ O$ W: D
常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
1 J" m% ?8 S1 g* V" v2 j2 d2 x- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:( d) ^9 Q' D& ]7 T1 h
" S- K5 F+ \3 u
@echo off# Y/ S4 |/ G% ^( E) B5 L% p: {
set p=aaa- }6 {7 Q X; n) J
if %p%==aaa (& W9 U, }" h# [' u$ f; d
echo %p%* x% f' p8 a# R* j& V: d1 i
set p=bbb
, w* q4 c4 J: J3 hecho %p%( B' M& Y8 N+ n& G
)
" u% X% N- A1 ~8 Vpause
; r% w' E: c' |3 d* R# H |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|