扫一扫,微信登陆

 青浦修电脑 青浦笔记本维修 青浦手机维修 青浦电器维修

搜索
查看: 2014|回复: 0

Windows批处理(cmd/bat)常用命令教程

[复制链接]

307

主题

335

帖子

1899

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1899
QQ
发表于 2021-6-25 19:48:12 | 显示全部楼层 |阅读模式
Windows批处理(cmd/bat)常用命令教程
简单详细,建议收藏
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
  • 2.批处理.bat 文件中输出中文乱码
  • 解决方法在文章末尾!
    ; o5 B. J) K# w7 r7 E8 ^& K' @2 [
前言
  • 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效/ G' k1 y  ~$ w
在Windows中善用批处理可以简化很多重复工作
什么是批处理?
  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展/ b" k( h/ f& c  M
    名为bat
  • 目前比较常见 的批处理包含两类:
      M! i& j( w7 P/ O$ m( w* B
    • DOS批处理和PS批处理。
    • PS批处理是基于强大的图片编辑软件
    • Photoshop的,用来批量处理图片的脚本;
    • 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
    • DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
      % A3 a- ^' E, F$ p& K& p2 q6 S" _, {
  • 批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的' w# k" M6 Y3 X  i" h
    命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行
  • 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
    4 H' `) W. R* L: G& E, w4 D
怎么创建批处理文件?
  • 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
  • 一般情况下,每条命令占据一行
  • 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
  • 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
    4 e, w, l% b) o" l/ S
批处理命令简介
  • echo
  • rem
  • pause
  • call
  • start
  • goto
  • set" a% F: p/ J1 p$ _5 h2 h, q, ]
批处理常用命令总结批处理符号简介
  • 回显屏蔽 @
  • 重定向1 >与>>
  • 重定向2 <
  • 管道符号 |
  • 转义符 ^
  • 逻辑命令符包括:&、&&、||& h* U9 F: t- q& ~+ \8 U3 L- q
常用DOS命令
  • 文件夹管理:+ ^- S  \4 V/ {+ f
    • cd 显示当前目录名或改变当前目录。
    • md 创建目录。
    • rd 删除一个目录。
    • dir 显示目录中的文件和子目录列表。
    • tree 以图形显示驱动器或路径的文件夹结构。
    • path 为可执行文件显示或设置一个搜索路径。
    • xcopy 复制文件和目录树。# r, y1 r9 z- S
  • 文件管理:
    $ N$ y3 m. P7 O% w, Y
    • type 显示文本文件的内容。
    • copy 将一份或多份文件复制到另一个位置。
    • del 删除一个或数个文件。
    • move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
    • ren 重命名文件。
    • replace 替换文件。
    • attrib 显示或更改文件属性。
    • find 搜索字符串。
    • fc 比较两个文件或两个文件集并显示它们之间的不同! e% \! T* ]$ Y( V
  • 网络命令:) o; `  f- x5 T0 I; M+ T8 T+ j  ?
    • ping 进行网络连接测试、名称解析
    • ftp 文件传输
    • net 网络命令集及用户管理
    • telnet 远程登陆
    • ipconfig显示、修改TCP/IP设置
    • msg 给用户发送消息
    • arp 显示、修改局域网的IP地址-物理地址映射列表
      . Z% k! f( w0 d# \. }
  • 系统管理:1 g3 E; M: N4 {% J6 d
    • at 安排在特定日期和时间运行命令和程序
    • shutdown立即或定时关机或重启
    • tskill 结束进程
    • taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
    • tasklist显示进程列表(Windows XP Home Edition中没有)
    • sc 系统服务设置与控制
    • reg 注册表控制台工具
    • powercfg控制系统上的电源设置& F, U# _3 ^8 i8 O! }6 a# e0 j) c
    ) }$ K, }! i. Y1 N" v) G* m
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?

+ q1 q4 b. D( F5 d1 E
; l9 b7 g9 a& X( g* `Windows Batch 常用命令
$ D8 e1 [0 i/ k4 L# z8 U1 echo 和 @
% t# W9 W% c- c0 }. n- J回显命令* C3 _8 f, M  W3 v4 D+ w
@  #关闭单行回显2 j# y5 Y( x' h, O( J) ^6 s. }& l
echo off  #从下一行开始关闭回显8 @) @" E) }% ]5 [# M* k3 T9 {
@echo off  #从本行开始关闭回显。一般批处理第一行都是这个: L7 t. H& t/ |& x% c
echo on #从下一行开始打开回显) X% S: F% |0 w! F. @7 B
echo #显示当前是 echo off 状态还是 echo on 状态9 G+ E4 [0 d- @& e7 v. s7 X' G
echo. #输出一个”回车换行”,空白行
" `' ?$ _) x) w  W4 U#(同echo, echo; echo+ echo[ echo] echo/ echo)' l7 W( P, _/ B4 c" u% A) C
& y* o& D8 z+ b+ ]# D4 R# P
2 errorlevel  |! Q& B- [9 K6 t" T
echo %errorlevel%4 }/ k% }8 R, k: `1 }! b& n7 h
每个命令运行结束,可以用这个命令行格式查看返回码
  z* [+ w7 _3 y, W% [' t默认值为0,一般命令执行出错会设 errorlevel 为1
. M9 [% q$ P6 j5 [+ U: a" V+ a
# @3 {/ M) J$ ]3 dir: @7 p; P! {. Y5 i5 D* Z
显示文件夹内容
" {7 Z! X; a5 Ndir #显示当前目录中的文件和子目录+ p+ ^5 q2 ^, ^( y5 D7 H( l5 l
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件; k% R! _+ a6 M: R3 \
dir c: /a:d #显示 C 盘当前目录中的目录8 g$ m4 e5 o% Z, m! _# P/ s/ \
dir c: /a:-d #显示 C 盘根目录中的文件
: R$ \. w( ^2 Mdir c: /b/p #/b只显示文件名,/p分页显示' _% H; B+ ~* D
dir *.exe /s #显示当前目录和子目录里所有的.exe文件
* ?" C! d. F5 Q3 f2 K+ d- s( T& P' C( r4 ?* m9 z% R% a( G
4 cd8 Q6 S+ ~* o) o, A8 G; P. h
切换目录
% F- s- `* k; C- d  J& Ccd #进入根目录6 j3 a7 _, {# b9 R5 y/ X, s
cd #显示当前目录# ]3 I7 Y- v8 v9 t, e' {! p
cd /d d:sdk #可以同时更改盘符和目录
2 X8 W; T8 _. k6 @
: T  V: W" A! U* N6 Z# y  r5 md+ `- V4 J+ F: r, Y7 Q
创建目录' Y' {# O) L2 t
md d:abc #如果 d:a 不存在,将会自动创建中级目录
4 x3 d% S1 S4 U  O; ?5 P# U0 @#如果命令扩展名被停用,则需要键入 mkdir abc
0 O  Z7 x, n/ I# {, l" ?2 M0 a5 u! n' ~1 J- D4 Z9 S0 a( ?
6 rd
. [' R6 Q" q! a, h删除目录
9 E- ~+ u- C8 J' ]; i+ e: \rd abc #删除当前目录里的 abc 子目录,要求为空目录
" y) F" X/ z( a* ?. V. vrd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式* S6 w/ ~; H: {% Y0 }2 g4 d

5 F5 U! Y, f6 i. b3 x3 {7 del+ q, o$ N8 i8 ~* R
删除文件
! B8 r5 F+ e" L6 bdel d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
6 m# X; j0 L  D4 ], r$ Odel /q/a/f d:temp*.*& X8 f+ n0 s: w( @" P
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录% ^7 @8 N1 y0 c0 j
del /q/a/f/s d:temp*.*5 ^( w* b3 y# @4 v9 x9 Y
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
, V! F' ~9 V& L9 Q6 s+ y1 R6 A" A, p. F% z+ Q- F% V2 M+ i- B7 h
8 ren0 G+ I# G6 x2 D: r/ D' G
重命名命令0 V+ I+ v0 ~( R0 u* y9 W& h3 E
ren d:temp tmp #支持对文件夹的重命名
$ x( F" U/ O5 d
- l$ y2 k/ j, Y* f% q, K9 cls; a% d: z" _) J/ P* z; D6 ?
清屏8 r# `7 F' ]( Y7 K- H1 i; m
10 type; H: Y& ^) e/ Z
显示文件内容
& s8 i$ @0 {2 ]- |$ ~+ [, z9 Vtype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码6 o9 m: |3 u0 f
type *.txt #显示当前目录里所有.txt文件的内容% ?$ D* _5 Z' w' ?/ v; x2 Y
* m. ?: p5 _2 K' x: l# [  h
11 copy* u6 d( A' q1 R) `
拷贝文件* q' S2 Q. I' s, v7 l! i
copy c:test.txt d:test.bak7 D! i0 D. H+ ]# D
复制 c:test.txt 文件到 d: ,并重命名为 test.bak$ i  D; f- P& r& V9 k
copy con test.txt" N! T3 ?/ P; P5 ]7 W$ p" X& x
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
, E4 X( I6 S" g" z, j* U) w& mcon代表屏幕,prn代表打印机,nul代表空设备
$ _: T5 o8 u- Y; d/ [4 Scopy 1.txt + 2.txt 3.txt' s( F5 i" ^3 p9 P6 N
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
; `+ J% i! a) W# W, W8 B, t如果不指定 3.txt ,则保存到 1.txt
- F* V. `+ ]$ Y+ C' k+ T& Y- Gcopy test.txt +  V- c4 m) l  [9 |) B+ V
复制文件到自己,实际上是修改了文件日期8 ~6 ?: Z6 G5 [) X- E

% u6 V2 z9 |4 X4 v  H12 title( T. U2 h3 @" O) S4 O
设置cmd窗口的标题& J% ^6 j" O- X0 p. [
title 新标题 #可以看到cmd窗口的标题栏变了
! b4 V  a- k  s* @0 j( d2 V6 e8 z; n' H; V( ], {/ v4 m2 f
13 ver1 I" j( u0 W- _
显示系统版本! q1 ^# \) F, `/ j3 @0 X

0 e& ^* V. B% M; Y- r. ]& u14 label 和 vol
$ V- x: q  j! q# D- L设置卷标
( k( p/ U- Y0 Y& ]3 x  _vol #显示卷标
, n) e& X! R' N. s5 X4 Vlabel #显示卷标,同时提示输入新卷标6 Y% A9 [; ^6 [- P/ s
label c:system #设置C盘的卷标为 system/ T+ `9 M" x. G* O2 A" ~
% U# `6 Z( \6 B5 X6 l( v* B
15 pause' y, f& H8 u2 a4 r- j6 I" t" N
暂停命令
( P" l+ ^7 u. b  @6 F* ^, P4 w9 G& F3 ?+ ~3 H5 [% Q. v9 X3 W
16 rem 和 ::, W# c6 E0 \' ]- J6 I- a( ?& q  t# V
注释命令
: e, F3 e' O! P% @; q/ R( u注释行不执行操作  n# j; r4 t9 H2 x0 R
& ]- R( V) x8 B" i( h3 ~
17 date 和 time
. L, ?' n' V5 }8 W/ l日期和时间; f2 X2 K. H, p, Q2 ?: P
date #显示当前日期,并提示输入新日期,按"回车"略过输入
* E8 u! q- m$ b/ ^* Idate/t #只显示当前日期,不提示输入新日期, ]2 T' [2 q( _/ D+ P
time #显示当前时间,并提示输入新时间,按"回车"略过输入
* A# W% u5 @5 M; r; qtime/t #只显示当前时间,不提示输入新时间
9 c: h3 T6 h( Y* O& ?' e4 d0 X4 p
18 goto 和 :
- @  F3 |. i  s跳转命令3 ~- w: h0 A" ~' B: {$ N: k1 q7 u
:label #行首为:表示该行是标签行,标签行不执行操作
$ V. e3 Z1 u3 l6 d, P! ggoto label #跳转到指定的标签那一行
& S: ]) l5 G  m' s7 s! q3 o. [+ r+ g# b; `
19 find (外部命令)
$ \5 x; b. h4 m( D3 A查找命令
8 O+ j8 O) q& bfind "abc" c:test.txt
% \% j' p5 T' s在 c:test.txt 文件里查找含 abc 字符串的行" ]  x; S1 g; q8 S8 x; w9 z- Y
如果找不到,将设 errorlevel 返回码为1% s0 o. z- M, W6 R$ h
find /i “abc” c:test.txt
+ w) N) `! m* S+ N查找含 abc 的行,忽略大小写  U* F& C1 i0 {; Z; z
find /c "abc" c:test.txt' [( V) ~) ~9 O% {
显示含 abc 的行的行数9 v8 ?& C( c. U3 |5 \! j% [; s

- d" D& V( x9 F20 more (外部命令)
# E- r9 n; u$ h1 K% F* t逐屏显示
+ c1 E& e8 `' v4 \& Nmore c:test.txt #逐屏显示 c:test.txt 的文件内容
$ L1 h( U, X7 c& E) n+ M$ R$ W+ y5 f: e1 j- ^) z$ _4 S0 x1 f
21 tree/ u& H9 p; _- j
显示目录结构
5 S) S+ K. _, }' r& h5 i3 a- Ptree d: #显示D盘的文件目录结构
% o( k+ @& z, S. c( L
" K7 x8 ?4 K9 h5 o22 &
; O- u  d3 `. D5 \; O2 Z顺序执行多条命令,而不管命令是否执行成功
& V; m& z" P0 n, ~) ]8 V% e3 C+ l! W# |  U& @
23 &&! K2 h6 a) r' m: j
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令6 ^2 S+ U5 K' P2 @- z$ w- N) o
find "ok" c:test.txt && echo 成功
+ Y2 G+ F, g+ R  F如果找到了"ok"字样,就显示"成功",找不到就不显示
$ n' x" W/ s1 E4 I8 @* W
* ~' w! g8 C3 n24 ||
7 `' }% l3 A! m4 y& X! ]顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令# H; ^; S: Q- a- K4 b! L
find "ok" c:test.txt || echo 不成功  K, n0 P# w. F2 q' f5 p" P  F: x
如果找不到"ok"字样,就显示"不成功",找到了就不显示
  Q3 ^  j0 i. A: X, c3 z
6 I# w9 @6 ]/ j+ ]25 |
5 R" C3 [5 p- Y管道命令
( D# |* M1 T9 i' K! }dir *.* /s/a | find /c ".exe"! X: \4 J7 z! R/ u, a, H
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
9 b$ L! t; z, E) C" s2 a该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
0 R( A$ ^+ c8 y. qtype c:test.txt|more
$ K, k$ _& Q" z这个和 more c:test.txt 的效果是一样的
$ h6 P+ n7 B, ?8 B( `. W
. o0 J4 d+ z$ ~- v26 > 和 >>) f3 C: ]0 M7 V0 I3 d; L) q
输出重定向命令* `( N- X: [, X! m& @! |/ ]
> 清除文件中原有的内容后再写入3 J0 o! }% T* _+ [
>> 追加内容到文件末尾,而不会清除原有的内容
- f9 R$ U$ J: a2 ~) \主要将本来显示在屏幕上的内容输出到指定文件中  A. C2 x2 J, U9 b4 _9 C" J& t8 S9 c
指定文件如果不存在,则自动生成该文件+ i- S% O1 v+ p$ L& l8 w
type c:test.txt >prn
2 |$ o# a1 f: N- D$ S屏幕上不显示文件内容,转向输出到打印机/ Z  G! Q( c& P; ]
echo hello world>con
, c3 ~$ f9 E8 b( i/ l! ]/ ~在屏幕上显示hello world,实际上所有输出都是默认 >con 的) K, ^. |% A3 N2 }
copy c:test.txt f: >nul
1 G% o  H% I! Z$ f+ j2 U1 P拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
& k  l( n$ J  Y* j2 U/ p, D1 Pcopy c:test.txt f: >nul 2>nul
3 P. g, V5 A8 {( n9 x$ l不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
; F; I5 D& C" d0 k) z. Decho ^^W ^> ^W>c:test.txt! h* U1 @! G( m% J
生成的文件内容为 ^W > W  s; Z0 Q) O( t0 G- A
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号  r+ Z6 X! Q% b2 I9 i7 T
6 }( v+ |# ?2 G1 t
27 <
( x6 p& h$ ]8 Y# |5 v从文件中获得输入信息,而不是从屏幕上* e% J9 F3 t& ?  v
一般用于 date time label 等需要等待输入的命令8 a* i% Y5 W% D9 O9 P
@echo off  _6 ]- H+ c/ U% D) @4 u- x
echo 2005-05-01>temp.txt
0 j5 q$ R  x4 v- q+ `7 k) w: q% q, hdate <temp.txt; g5 X4 c! [) B; o' o+ R$ J
del temp.txt1 s! L, V( n% w6 k) r) r
这样就可以不等待输入直接修改当前日期
0 \/ e- q( ]+ {& v3 i5 h0 y3 K- V" j  v5 X; [( G7 F2 |+ X
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*' {3 Q( q; ^0 Q2 T4 q" {
命令行传递给批处理的参数
4 @& x  G# H# F) K+ U+ U%0 批处理文件本身4 T; B* q+ y0 H
%1 第一个参数
- h/ e7 {+ y; o; M) t%9 第九个参数
- d3 J6 K1 G; K5 u* Z+ [: l%* 从第一个参数开始的所有参数! n. R% U6 R( u. A  K3 ?" t$ A, K
批参数(%n)的替代已被增强。您可以使用以下语法:! }  V$ |; G' b7 q7 |3 U2 ]; L( p
%~1 - 删除引号(" ), 扩充 %18 U  ^4 ?% T* H' E6 m
%~f1 - 将 %1 扩充到一个完全合格的路径名
( `1 d& r- g- w" T; _, Q%~d1 - 仅将 %1 扩充到一个驱动器号
/ w, U. ^- `& J% A2 }9 E%~p1 - 仅将 %1 扩充到一个路径3 N; C, [' r5 ]8 @  x/ t& X0 S1 f
%~n1 - 仅将 %1 扩充到一个文件名" B  W: P4 F8 `$ h9 T
%~x1 - 仅将 %1 扩充到一个文件扩展名  Z3 j0 H: B4 L
%~s1 - 扩充的路径指含有短名
6 ^/ y. ?5 l* r% e0 s%~a1 - 将 %1 扩充到文件属性
. l& N: K" u% F$ g" Q4 S6 r%~t1 - 将 %1 扩充到文件的日期/时间% u0 z# S" d8 w( a/ b- r
%~z1 - 将 %1 扩充到文件的大小
3 ^  Z) c" v+ _  H: c# c+ D. S%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1) z( S) O9 _& |2 \% X4 P
扩充到找到的第一个完全合格的名称。如果环境- w, h+ V+ g0 I( ^5 n& E; |% ~1 b
变量名未被定义,或者没有找到文件,此组合键会* e. K# x  `. [. {
扩充到空字符串2 V! @& Q7 Q  a$ a! d5 Q
可以组合修定符来取得多重结果:3 z0 @7 `) s' N$ @* l
%~dp1 - 只将 %1 扩展到驱动器号和路径0 B4 R7 t- K4 j5 }3 m) A
%~nx1 - 只将 %1 扩展到文件名和扩展名$ Z" L& w! F7 q8 I4 Z) m
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
& s& d# Y/ A+ Z6 E" r并扩展到找到的第一个文件的驱动器号和路径。, Z5 T+ B" y+ ]3 ]
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
* j# O- P4 {, L4 }: |7 e8 v可以参照 call/? 或 for/? 看出每个参数的含意2 N* ~8 o$ [& f4 X
echo load "%%1" "%%2">c:test.txt; w7 Z0 e* C5 V& `6 r" A' a9 u
生成的文件内容为 load "%1"  "%2"
/ }% r3 }5 ]/ l* K6 ~批处理文件里,用这个格式把命令行参数输出到文件
3 K! ^& g& E& A* t( l( C0 H* V% }6 l+ B! H2 W/ t! F% W6 o7 C
29 if# s) c+ f! I1 o& {4 E# K' R
判断命令+ Q; O5 [7 e6 [4 Z% n6 x/ r. f
if "%1"=="/a" echo 第一个参数是/a
; t- s- _. \, g  k0 }# M6 \4 Zif /i "%1" equ "/a" echo 第一个参数是/a
% Z! B6 U3 f7 N; N: v/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
$ O# ?+ q7 _$ Aif exist c:test.bat echo 存在c:test.bat文件9 K- i2 ^% Z" s9 `
if not exist c:windows (% {7 t% t$ V5 t$ V' e8 ?
echo 不存在c:windows文件夹; C4 l6 H! `3 Q: h
)
9 j; L* j( B' a  ^& I' b5 @+ ]if exist c:test.bat (
* U3 |7 s3 }) M) J0 k- i' vecho 存在c:test.bat3 W( C& }1 t% i4 [: O$ P3 i
) else (
" ^9 _/ @7 @( p( n8 xecho 不存在c:test.bat
3 |; {# m  g" C)
6 K# {5 i8 s0 e9 O# d  H7 a30 setlocal 和 endlocal. ^% d: Y$ C9 S4 E7 ^' X
设置”命令扩展名”和”延缓环境变量扩充”0 n, j/ [5 S0 H  X; }
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"4 w# Q! A: q* i4 ]8 e, `3 x
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"6 V- x% c8 }) J
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充", K+ T, R/ l. f3 u4 B1 h$ C
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充", |( {+ A4 G0 f" F- a
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态& y7 G# T1 M3 R( F, k$ u  I
“命令扩展名”默认为启用, H4 ^% P3 l+ u& G' f- g. ]4 R
“延缓环境变量扩充”默认为停用& ^/ I4 G3 G$ i) M0 O0 V; h5 O! O
批处理结束系统会自动恢复默认值
( f! l, d* t. B9 K2 C( t可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
4 j& n, q0 z! v序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
2 E8 z* B9 i) V保程序能在其它系统上正确运行
5 c8 H' a- {: w# a"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程7 S1 H! [7 g- {( h6 i
4 s, i& [; Y8 {( K
31 set# y1 f7 R/ @; R1 C# n1 N
设置变量* |* k9 \* k) Q9 p- }
引用变量可在变量名前后加 % ,即 %变量名%
9 o2 ]- `+ g) Nset #显示目前所有可用的变量,包括系统变量和自定义的变量
) h% @2 z# A) Y9 gecho %SystemDrive% #显示系统盘盘符。系统变量可以直接引用; T& |% @6 V# r  V/ b
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
8 |* T: L6 u. x  H* [) m( n! oset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb20 n7 ^* W$ g, |- x: b
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2( @- C* E/ r0 K- u) `7 Y: |/ n* d( ^
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
- y& E4 l% f$ D- k) w9 k: x2 q& D5 vecho %p:~6,3% #显示第6个字符以后的3个字符,即aa2
4 T& E6 j8 N  mecho %p:~0,3% #显示前3个字符,即aa1  ]- ^+ I' ?0 t  R+ @3 z2 R
echo %p:~-2% #显示最后面的2个字符,即b2( p% {. r' c5 E" Z
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b# o4 C% E$ N: H# _! D
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb24 U$ P2 \+ B/ x  c1 k% s
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2( F; K+ \. @2 }! `- I
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
/ i  R& G2 p! N# A6 t6 V& B5 h! dset p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
1 _* D5 Q) l2 ]0 ^set /a p=39 #设置p为数值型变量,值为39( I; g2 H$ A7 G" M
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3# _, y4 d) N6 X  [, c/ F1 p
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用0 u1 a, e$ |" E! y8 z! A
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?% [7 p; j9 M/ W) j+ _' k+ r2 w6 t
set p= #取消p变量- |" U5 K+ F- p: R7 H0 v2 q
set /p p=请输入) _7 o3 w; [% A
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p' x( z& P& {4 M# {& w' N
注意这条可以用来取代 choice 命令
. \% M) S' |8 O- ~注意变量在 if 和 for 的复合语句里是一次性全部替换的,如6 n& [( H% x* c) E$ d
@echo off( w* k  Q" t, _( E0 b. |
set p=aaa
$ @; F8 v, E/ ]if %p%==aaa (; r1 @# O. \7 ?. k
echo %p%
( j2 t; n( e, nset p=bbb
/ N' M: ~/ t' Y6 ]/ \2 gecho %p%
% w. P# t* X. _+ [" _)# l" g. q* C& O5 R0 E* E( ]7 u+ E# _
结果将显示8 a3 k! E6 ?; v" H% Q# n
aaa
: D; c# \0 {) c5 ]aaa
  S" f2 m# H1 r; N因为在读取 if 语句时已经将所有 %p% 替换为aaa
4 x: _: X+ {& ~# K这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
* I5 O7 ?% |4 c- X/ U可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
1 Q- M2 C3 }: g. j4 t! E$ Q@echo off! F- e. E9 E# C, I
SETLOCAL ENABLEDELAYEDEXPANSION# h7 `+ s9 i2 e0 B5 {( Q1 F4 e+ F$ i
set p=aaa. T9 ?: o4 X5 @4 E2 c
if %p%==aaa (
; @; }2 r, a" n, G1 {) b4 Y5 Eecho %p%
# ?+ v- @8 y, L0 sset p=bbb$ _8 d% `# F% @0 C
echo !p!# I3 L6 N% y# e; M8 Q
)
1 g+ t, x" U% i4 @$ ~ENDLOCAL
! V" H+ W- c% r结果将显示
+ \! N) R  _4 Y% j  U; j# vaaa' X  D$ O2 h. c2 e
bbb$ y, ?# z! j. U9 d; l
还有几个动态变量,运行 set 看不到+ g8 e4 h" i+ z7 w
%CD% #代表当前目录的字符串! \* y% h, V( ~; D. Z
%DATE% #当前日期
+ D7 \# W5 T6 }! q9 ~%TIME% #当前时间
" c! o5 [, }6 J+ r" U%RANDOM% #随机整数,介于0~32767# p  R1 H  \- ~
%ERRORLEVEL% #当前 ERRORLEVEL 值
/ C# Y  y& U6 \1 U) t- h6 J2 }%CMDEXTVERSION% #当前命令处理器扩展名版本号6 \* U; g1 Q$ G4 r/ G
%CMDCMDLINE% #调用命令处理器的原始命令行
* `+ Q1 ^: E. l% B7 k: B1 [% X/ Y可以用echo命令查看每个变量值,如 echo %time%! M( c) J" o5 M+ N7 g+ a. W
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到9 [* R* @: F% I9 X% q3 S1 }  Q6 h
4 p% J# x* R0 {  q4 x
32 start
- D5 B6 @( Z" N% C$ i$ T- s: O+ t批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令! `% V! K- {5 |4 ~; ?4 b3 m) H8 m/ b6 q
$ a( t' P- ]+ G9 F! D; k
33 call0 N2 S. W9 \9 }7 h# G
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
5 P0 _0 N- f9 c( L2 _. ]3 o有时有的应用程序用start调用出错的,也可以call调用2 T+ x2 V4 f" E5 k0 A5 n
0 i4 S6 q: O  _
34 choice (外部命令)
2 ~$ e. l2 i9 x9 t+ I& f* E选择命令
4 i; b/ |8 {- n7 ^1 x让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
. _/ Z* C  D* g$ Twin98里是choice.com
) I" t0 Z, `4 {  ywin2000pro里没有,可以从win98里拷过来
- Z/ C1 J$ a' b' K; d; Q7 Cwin2003里是choice.exe: }  N/ Q- t0 E$ n
choice /N /C y /T 5 /D y>nul, f$ }6 m  Q* i7 \& o0 [( e
延时5秒5 D) g4 T' G1 J, f. `

4 R% M- }) K; t35 assoc 和 ftype
) o) C/ q2 G5 I2 x' W  y文件关联
1 \( V: k. V8 X6 h% Bassoc 设置'文件扩展名'关联,关联到'文件类型': n2 ?# V, F, Q5 `! ~( t5 Y  R
ftype 设置'文件类型'关联,关联到'执行程序和参数'
6 X- D; J4 H; o当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
3 h3 v4 Y/ y2 I. r4 s/ x6 M4 i而是先判断.txt属于 txtfile '文件类型'
& e( Y( {; r& l6 a1 F再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1* |' r' L# B' ~  }; \
可以在"文件夹选项"→"文件类型"里修改这2种关联
  W" g$ Y7 s0 L' B) Wassoc #显示所有'文件扩展名'关联1 v$ }) o) i- _# S! h: N
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile% H9 x/ z8 b% J
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
7 h3 I  I" K; N" P" |assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile6 X  Z& c0 a" K9 I6 w  L
ftype #显示所有'文件类型'关联. m6 H7 B: @6 B& e0 c' u3 Z8 M
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
5 r7 o. G7 r, S9 F- Kassoc .txt=Word.Document.8/ s+ z" F0 O. x3 B) A
设置.txt为word类型的文档,可以看到.txt文件的图标都变了
0 m  s% ~) x. P; e7 B/ B; S  Xassoc .txt=txtfile: W& a7 @" L8 b! X: N1 l$ V6 J" v5 S
恢复.txt的正确关联
2 O  T  C0 l  D2 f5 ^; V" T: \ftype exefile="%1" %*" N! h+ Z4 A1 F% h' `% b5 Y
恢复 exefile 的正确关联/ {5 y7 Y5 @5 s; Y4 ^6 p% n3 c
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令/ P3 }! h5 b/ ]0 B

6 M& C3 o8 c: ^, L1 E36 pushd 和 popd" l! U* h' f+ v% V: E
切换当前目录
) \- @# U  S* u9 ]( x@echo off* B& M4 q9 Z, ?: g" X) Z, k/ A
c: & cd & md mp3 #在 C: 建立 mp3 文件夹
  B$ B2 ]2 o+ T# T& s5 Fmd d:mp4 #在 D: 建立 mp4 文件夹* P1 d, b7 y3 D% h
cd /d d:mp4 #更改当前目录为 d:mp4
' F- m6 Y- D9 {7 i6 qpushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
3 l2 N) U9 {" C8 R6 b+ fpopd #恢复当前目录为刚才保存的 d:mp4! \2 A. _+ x5 [/ e% `( w' G( `

+ ]8 y! ?5 R' B8 d7 n; |' G37 for, M& c2 H. W8 w; V
循环命令8 O$ C1 Z; Y( \( Q: W
这个比较复杂,请对照 for/? 来看
( u4 O( [  I2 Ofor %%i in (c: d: e: f do echo %%i6 k2 z/ h1 s) Q/ g6 `
依次调用小括号里的每个字符串,执行 do 后面的命令+ A# C' ~( W. Q5 T
注意%%i,在批处理中 for 语句调用参数用2个%) Q* U" n4 ~4 T# @2 t. Y8 x; E
默认的字符串分隔符是"空格键","Tab键","回车键"
5 w- l5 f& j, w, T3 U9 Bfor %%i in (*.txt) do find "abc" %%i
# |$ F, i3 Q: E# ~1 t' @9 a5 {) j对当前目录里所有的txt文件执行 find 命令
) m6 s& L; |8 u0 q9 Zfor /r . %%i in (*.txt) do find "abc" %%i& t) b$ v6 R( R6 v& f# {% s
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行9 K) D2 n# `8 |! E3 |3 o! n
for /r . %%i in (.) do echo %%~pni1 t3 e6 p- g5 d" x: u( F
显示当前目录名和所有子目录名,包括路径,不包括盘符( B' w2 y& j0 W( C
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt7 w* k! W1 |: M% d4 u" V# }
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去! C$ x/ p1 Z' G( b
for /l %%i in (2,1,8) do echo %%i
9 H; n! E9 {5 x5 n' k( U- W! G+ C" e生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1* h& I) {- I, z1 ]( l3 T
for /f %%i in ('set') do echo %%i
0 z  V4 b9 z3 h7 S对 set 命令的输出结果循环调用,每行一个
, e1 J  P- o! d( e. |& }9 jfor /f "eol=P" %%i in ('set') do echo %%i
+ R1 s2 F5 ^% f1 R" t取 set 命令的输出结果,忽略以 P 开头的那几行# n& ]( L6 P1 x' B+ R( d- f( g* _
for /f %%i in (d:mp3.txt) do echo %%i7 d8 U9 r* u* \9 p
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称7 i7 v: v$ B1 @6 p# B: C. J+ k
for /f "delims=" %%i in (d:mp3.txt) do echo %%i2 b8 B9 l/ n. e! a; Q9 Z  k
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称8 q8 w' G+ K# F
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
% E. M/ j* D( v  q3 v+ ?" A* o- }对 dir 命令的结果,跳过前面5行,余下的每行取第4列6 X$ V& O+ U9 d7 p
每列之间的分隔符为默认的"空格"' u; y# m1 ~4 ]  n5 N* X* X
可以注意到 dir 命令输出的前5行是没有文件名的
$ x8 q% Q% }2 t6 M0 k9 s+ ufor /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (7 v* |: X) W4 p3 X
echo %%a
9 Y  N( z6 v$ d" W* u- H3 iecho %%b
7 F* n" S3 M( D* Kecho %%c* I, c' x% O& T/ X5 v% U, _
)& E1 o( d  j2 T+ K4 d
对 date /t 的输出结果,每行取1、2、3列% p; d* ~4 J+ p( v. ^! P8 r
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
* R; `7 {) f6 a5 i分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
- }) k' t9 y5 h其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
& U3 t# Z- P# J7 u0 D  Gfor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
" E9 K! m* b+ ~  x: K' t/ W取第2列给 %%a ,其后的列都给 %%b, y8 h! Y; k! p, O: T# z

2 z( @3 w4 V0 L6 s3 T38 subst (外部命令)* M. _3 R8 `$ L! O3 a6 E
映射磁盘。" h# \$ ]- P, k( v
subst z: serverd #这样输入z:就可以访问serverd了8 [) ?* l, k6 H+ l: z# W$ u, y; D
subst z: /d #取消该映射  s" i. H# d5 W0 I1 ?( r0 G1 I
subst #显示目前所有的映时
) X7 P5 y2 T5 b: k' U. _, l9 R+ O% k- V% r5 \  ?8 f
39 xcopy (外部命令)$ \# N2 H  g0 H( n' n
文件拷贝
+ e3 g, h' s/ Q. X* _. u! J0 xxcopy d:mp3 e:mp3 /s/e/i/y! D7 i  o9 v+ K* n( r- l
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件( ]4 z; S, n! E3 x) o- n
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
! t! V* h6 [, M8 Q5 o4 E  B: H; u; D, @& u* W+ @. [: s
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退5 a, X' m+ D/ O- G6 p0 O1 }
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:
      ; Y) ?1 ]3 K8 V8 A

    6 V7 i, |+ p. {3 O/ J2 |
@echo off+ v. o- h  {& w
set p=aaa7 ]& w7 R0 k* t5 Y& X( _, A( T& j
if %p%==aaa (8 g  ~$ ~6 Q, q
echo %p%+ a9 K6 ?) @" X6 W" N8 ^
set p=bbb
8 K+ m0 o/ R: ?$ |echo %p%
/ P3 Q, W4 o1 b' v$ a) Q: h- Y  i)
& }, J0 L! t' \; apause
  • 截图:; L3 ^( b5 r+ ^4 g2 q
  • 2.批处理.bat 文件中输出中文乱码
      ^, Q: o" h& J" [$ r& |/ t
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:9 ]8 J5 u2 p% W6 p6 @. `
    • 效果截图:# m' z1 F9 a( Z' J7 i

      ( ~3 _2 I$ e! H+ S5 j" w; s
    $ P1 D( z. x# {% @" v4 V4 Z, m5 @
0 k9 z5 }/ w6 R1 X2 W8 P

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
青浦海洋数码电脑城
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2001-2013 Comsenz Inc.Powered by Discuz!X3.4( 沪ICP备18024137号 )
快速回复 返回顶部 返回列表