扫一扫,微信登陆

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

搜索
查看: 1710|回复: 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 文件中输出中文乱码
  • 解决方法在文章末尾!2 b& A6 p2 n4 d0 K% c( N
前言
  • 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效
    9 M* O6 K$ q, D- Q  h8 `
在Windows中善用批处理可以简化很多重复工作
什么是批处理?
  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
    " z, y! O7 ?, Q. E% _3 |- B名为bat
  • 目前比较常见 的批处理包含两类:

    1 t- n" ?; o8 K
    • DOS批处理和PS批处理。
    • PS批处理是基于强大的图片编辑软件
    • Photoshop的,用来批量处理图片的脚本;
    • 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
    • DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
      ' W& E/ g# ?. ?; `* ~
  • 批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的2 S$ {% L. o0 r& m# @5 ^* n
    命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行
  • 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件

    8 ^+ b$ \4 ?3 v9 `+ G& E$ @/ G+ w: \
怎么创建批处理文件?
  • 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
  • 一般情况下,每条命令占据一行
  • 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
  • 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
    - T, u- L4 N3 V8 T4 |6 p
批处理命令简介
  • echo
  • rem
  • pause
  • call
  • start
  • goto
  • set
    . A+ _2 G2 V; |. c. X
批处理常用命令总结批处理符号简介
  • 回显屏蔽 @
  • 重定向1 >与>>
  • 重定向2 <
  • 管道符号 |
  • 转义符 ^
  • 逻辑命令符包括:&、&&、||* g0 x! Q) t2 J! S- y
常用DOS命令
  • 文件夹管理:% F  u+ G7 f) F. f" {4 a; G
    • cd 显示当前目录名或改变当前目录。
    • md 创建目录。
    • rd 删除一个目录。
    • dir 显示目录中的文件和子目录列表。
    • tree 以图形显示驱动器或路径的文件夹结构。
    • path 为可执行文件显示或设置一个搜索路径。
    • xcopy 复制文件和目录树。
      , u% I1 q  e$ l
  • 文件管理:
    2 c. U7 r6 K$ q1 \
    • type 显示文本文件的内容。
    • copy 将一份或多份文件复制到另一个位置。
    • del 删除一个或数个文件。
    • move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
    • ren 重命名文件。
    • replace 替换文件。
    • attrib 显示或更改文件属性。
    • find 搜索字符串。
    • fc 比较两个文件或两个文件集并显示它们之间的不同% D. b# }2 c2 a, x  n: a
  • 网络命令:, y, c$ Y$ u& h2 q
    • ping 进行网络连接测试、名称解析
    • ftp 文件传输
    • net 网络命令集及用户管理
    • telnet 远程登陆
    • ipconfig显示、修改TCP/IP设置
    • msg 给用户发送消息
    • arp 显示、修改局域网的IP地址-物理地址映射列表- O4 }( a4 E& I; i
  • 系统管理:4 @. E  d7 T% A+ \; s  L( v1 N- I9 f
    • at 安排在特定日期和时间运行命令和程序
    • shutdown立即或定时关机或重启
    • tskill 结束进程
    • taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
    • tasklist显示进程列表(Windows XP Home Edition中没有)
    • sc 系统服务设置与控制
    • reg 注册表控制台工具
    • powercfg控制系统上的电源设置/ h5 h7 |. o* X

    , X3 E6 k2 F; A
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?

$ H. u, f0 N/ s" w& [
+ o& Z& f/ o' p1 `, ?Windows Batch 常用命令
! k8 ^) ^: F* B/ W4 a  y1 echo 和 @2 k, l1 A: l" ]* J7 F+ g0 d
回显命令8 z# M. A6 Q$ Q( c
@  #关闭单行回显9 T6 o  u2 k* E- R7 |
echo off  #从下一行开始关闭回显3 Q1 L" M- }0 m6 A. ], l
@echo off  #从本行开始关闭回显。一般批处理第一行都是这个# z; w' O7 M/ D/ m# b
echo on #从下一行开始打开回显
( k9 L+ d+ R* D# e- }3 }echo #显示当前是 echo off 状态还是 echo on 状态
6 X% {) ~% C* d$ pecho. #输出一个”回车换行”,空白行
- l( d2 g) e% L- m4 e#(同echo, echo; echo+ echo[ echo] echo/ echo)
- q% |& J3 s2 Y. @# u+ B  f0 L! P' b- Y! b% [- F; G
2 errorlevel' p4 J; {$ n: \
echo %errorlevel%3 F7 ]! S' W% v. l
每个命令运行结束,可以用这个命令行格式查看返回码" Q$ x- b& _/ C2 v- E
默认值为0,一般命令执行出错会设 errorlevel 为1( d5 b, q, k# |& ]

9 H" K% C, R; f- @& e3 B2 ^3 dir
, L  B3 ]4 C4 F) A  @9 R( n% U显示文件夹内容* Q8 Q: A+ r& e' O
dir #显示当前目录中的文件和子目录& P5 Z  J$ \; k1 x: R
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
' i% q0 u5 f+ P* g+ |6 B4 K3 Rdir c: /a:d #显示 C 盘当前目录中的目录
! C9 P/ m1 k5 h6 J) c! S! rdir c: /a:-d #显示 C 盘根目录中的文件) C+ b! ?: P: b% X# N2 w4 m; ~
dir c: /b/p #/b只显示文件名,/p分页显示
% Z& W% s2 z7 k  K9 z, W  Qdir *.exe /s #显示当前目录和子目录里所有的.exe文件
2 M! i; t8 d' w( D% S) @
! K, {: I  o; G8 F) a4 cd  P6 ?1 e' V" {, l$ F$ \1 ]0 {
切换目录" F9 l6 U. |4 \8 ]& X( s
cd #进入根目录
( l* ]. d9 H7 k8 ?$ j; R( o  G! \3 Y4 Acd #显示当前目录
; d6 `8 k, B! Scd /d d:sdk #可以同时更改盘符和目录. ^/ ?: \7 n$ p- `' U; o

6 Q. t) ^: Y7 D5 W& B2 V5 md
- y" e$ }7 P8 q$ n6 x: E创建目录% q+ C- f, o( f0 y( L
md d:abc #如果 d:a 不存在,将会自动创建中级目录2 c* x' i' y7 k1 ]+ d
#如果命令扩展名被停用,则需要键入 mkdir abc. Q# s/ G4 f4 E1 n/ |- C5 T( j

9 J5 o. i  k/ v2 y6 rd4 a" Y7 T: N: P9 v0 s3 Y, w# P  I
删除目录/ z: @( i& F0 _2 V! I
rd abc #删除当前目录里的 abc 子目录,要求为空目录
7 R3 M5 a- B: H+ k) `. T# erd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
8 a4 _+ v+ E- b& l8 t8 q
' k. n3 i9 E2 R& |: K7 del
# C) y% E% A3 s( H删除文件
$ I- i' A& o4 K! Sdel d:test.txt #删除指定文件,不能是隐藏、系统、只读文件0 o6 G& q( C6 l7 i
del /q/a/f d:temp*.*4 `3 I$ |! c& }) k  G; b* w
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录! H0 }  p( n  E; s% Q
del /q/a/f/s d:temp*.*+ H9 Y3 K# r: n
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录# n# P; e1 v; p

; k2 b9 w% V$ k$ k8 L; S$ @8 ren- u# X3 i! {6 j9 D
重命名命令
3 r! J4 g5 f- jren d:temp tmp #支持对文件夹的重命名; p1 N7 z, P- F6 f
: i7 {" p' q; B
9 cls
4 z% R2 N' v2 o6 q2 C3 K& ~8 ?# T1 q清屏
2 z* K6 O7 E2 u0 k: @' \' J8 P" S10 type) V( H& X. s4 I; G5 l. {
显示文件内容
% J1 L9 f/ C, N( K7 y/ _6 otype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
6 R0 [. O" y9 t  ztype *.txt #显示当前目录里所有.txt文件的内容
, v; c. J: C) m
; m+ g& _: Q  d, K0 L" W! ?6 u11 copy
$ l3 Q, w( @! V: c1 p; Q+ o$ o拷贝文件
$ y* a& j! b- rcopy c:test.txt d:test.bak8 q( R# Y# F" P$ K- y
复制 c:test.txt 文件到 d: ,并重命名为 test.bak9 [9 P2 w" D8 _/ m
copy con test.txt
# x; b" ^$ x% B' i从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
6 I3 c6 u; H( h/ b( {4 h7 Z1 |con代表屏幕,prn代表打印机,nul代表空设备1 W0 L$ f- P! I6 k
copy 1.txt + 2.txt 3.txt! x5 `" n& s" b; J  U2 {0 E, `& o
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件1 A8 ?. m7 y6 ~
如果不指定 3.txt ,则保存到 1.txt! y  u) `, S& j1 L3 Q9 j
copy test.txt +( ^; C8 ~/ B% N% X% ^
复制文件到自己,实际上是修改了文件日期- N/ J8 y6 X( P* |6 G6 @  H
2 D" O: F, B7 p  C5 \
12 title
6 d- a  r: K) p* _设置cmd窗口的标题
( d, V9 B( p- A2 e; Q( D$ jtitle 新标题 #可以看到cmd窗口的标题栏变了& y0 U0 t, q* W: W/ F$ ]

8 @5 M% @# _/ X: \6 S2 i9 o13 ver1 k  F! n& {. V/ A
显示系统版本& M/ N$ d+ o" a$ `
' v7 ~& N, U% P$ K$ g$ q
14 label 和 vol
+ F- h; ]& x$ p& d& G; ~- o设置卷标
; P4 k! m( u4 f+ N  w; avol #显示卷标
. N) _1 I4 Z) M2 o% y2 Plabel #显示卷标,同时提示输入新卷标# z7 \, U  y- n, s1 X' o
label c:system #设置C盘的卷标为 system5 ~) H6 ]/ u( H7 w' o0 H4 J

$ Y  {3 y4 I6 C9 _15 pause- P- v8 E- }0 [& ~; T% k- I
暂停命令: |0 }$ a+ h' r) _

" N  u3 P2 u$ `2 A+ g/ T4 Y) W16 rem 和 ::4 ?, K/ s* M7 T# \
注释命令  K. N3 V9 b9 ^
注释行不执行操作+ [* V6 O/ [" A9 g0 P& c
% F3 c6 B# l/ u; H3 O5 y
17 date 和 time
- e, d. I. I4 w: o$ ?日期和时间5 L! s1 w0 f- n! q, J" o3 K
date #显示当前日期,并提示输入新日期,按"回车"略过输入
# g& {# Q( v* q' C; ?date/t #只显示当前日期,不提示输入新日期! Y' z+ v2 W) {
time #显示当前时间,并提示输入新时间,按"回车"略过输入
3 P' m% I3 Y2 _5 v' W4 t+ w: [time/t #只显示当前时间,不提示输入新时间& g4 M* U3 i1 h' G  s5 {2 a: V
2 o5 O$ X. I$ b4 E9 y
18 goto 和 :
. n+ i' V: V- k跳转命令
( P. q. @7 S! r) R:label #行首为:表示该行是标签行,标签行不执行操作$ a- g( q% B& y* n6 L6 s
goto label #跳转到指定的标签那一行2 @, q+ ?' V. c& h/ R
5 k- L- O: `$ n0 r  j
19 find (外部命令)- {# t. L: d: u+ n' T$ n5 Y& I: {
查找命令" I; L! k9 c, |  ^
find "abc" c:test.txt0 y4 U, S) c5 D7 e
在 c:test.txt 文件里查找含 abc 字符串的行
. {* [/ G  B3 e; _* q如果找不到,将设 errorlevel 返回码为1
, j0 K& o6 \! d3 M/ wfind /i “abc” c:test.txt# k9 F: ~  z0 ]& Z
查找含 abc 的行,忽略大小写
. u' b  r9 T' o) Qfind /c "abc" c:test.txt( J% \( H4 b' H( {
显示含 abc 的行的行数/ X* o% x8 A) }+ q5 S
6 e. h2 X' T" ~# g
20 more (外部命令)3 l6 ?+ Z) d- q1 d0 j
逐屏显示- D% h2 |+ w' h* n5 c  r# b9 G- k& N
more c:test.txt #逐屏显示 c:test.txt 的文件内容  e, M4 J( a( D; Y# w

' a3 v% G, [4 U21 tree' U: _# n+ {* T. r: |! q
显示目录结构
% }7 f6 \) c1 R% K& vtree d: #显示D盘的文件目录结构1 ]7 M- [) G- P% k- a% `
% ?: j: `+ |" S; O$ t- v. R8 Y$ o
22 &; V) x% R7 R9 D( v
顺序执行多条命令,而不管命令是否执行成功5 I* _; [* U) H
- c2 [* b" s% w& v4 ^: A3 O, G9 @
23 &&
4 y0 r+ `) e) k( k顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令. O* A' Y: \- p
find "ok" c:test.txt && echo 成功
4 ~4 {9 Z2 b! I& A如果找到了"ok"字样,就显示"成功",找不到就不显示/ E! a; m( q/ _0 Y
9 P3 e& a# l9 m8 c! i, k) H' X# y
24 ||
0 U8 ?2 r" o- p0 M0 B顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
  b$ f$ b% v, Ofind "ok" c:test.txt || echo 不成功4 J, ~5 y' G. }! p
如果找不到"ok"字样,就显示"不成功",找到了就不显示, b+ T7 F( D/ l" x: @
# {8 J  g3 R3 r8 }
25 |8 m- _8 {1 L5 z* `& D5 K5 H8 y
管道命令! ^8 f$ J$ w$ @- ~9 s
dir *.* /s/a | find /c ".exe"1 y  e8 P& i( V) U+ b
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令5 `; B9 h, D* y+ d( P
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数4 m2 Y, j; N6 U# j
type c:test.txt|more
7 j" K3 N4 u- r" Y这个和 more c:test.txt 的效果是一样的
& t0 ?" N' G( |: Z: L* W
2 ?6 j' U: s, Y9 }5 I26 > 和 >>
" w" r( [$ `7 q输出重定向命令! E7 ~5 Z8 S3 I, ^( Z' v
> 清除文件中原有的内容后再写入/ t  t* \& U/ z* P0 T3 X
>> 追加内容到文件末尾,而不会清除原有的内容4 D  k- ^  n4 v: n1 v+ ?6 q* i
主要将本来显示在屏幕上的内容输出到指定文件中
8 J9 Q; m4 n% Y8 Z2 r- v% e指定文件如果不存在,则自动生成该文件
7 ^- q# K6 t0 z% v( Z% Ctype c:test.txt >prn
: K. W: _6 f" W6 f& ~6 i% U屏幕上不显示文件内容,转向输出到打印机1 s- C8 `6 |2 S( H
echo hello world>con
& I+ K- U) }* c! I4 E, {在屏幕上显示hello world,实际上所有输出都是默认 >con 的8 E1 S( ]5 F7 E9 ~& _4 i: O
copy c:test.txt f: >nul' G& F' v, ^' p9 n
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
) ]) b& {0 X0 s- U4 h, P: }- Zcopy c:test.txt f: >nul 2>nul
; E* V/ o) e7 L( J, y不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息- }/ d/ M! M, e. K: t. V7 R$ M: H/ z
echo ^^W ^> ^W>c:test.txt
& F) B% H5 a- ~5 N0 C9 d生成的文件内容为 ^W > W
! D9 G, W6 _( A^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号! B0 {" O% e# A$ p% L0 z5 e0 b

2 k# {4 j, R6 ?+ k+ n( a( H27 <5 b3 d6 n! V% {
从文件中获得输入信息,而不是从屏幕上
) a/ y4 m$ D. S  c一般用于 date time label 等需要等待输入的命令; r# M* w& Z) l# X
@echo off
3 M% R3 P. N) O& t" v' A! Techo 2005-05-01>temp.txt3 w( R5 r* h! }" a
date <temp.txt
# U, O) r; c. B# Edel temp.txt
) k$ n% `/ \3 g这样就可以不等待输入直接修改当前日期4 l3 P' J+ Y5 V% T

( a' t6 f& P" P3 u& b* A% G9 `28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
2 i; e& M8 Y; m. m. Y, d" j9 b命令行传递给批处理的参数$ U" l2 g' s! w9 }6 u
%0 批处理文件本身% A5 P( [( K% F" _
%1 第一个参数: N! h% z+ C8 z$ h& F  y
%9 第九个参数5 @, P2 i4 O. Y3 n: f: R
%* 从第一个参数开始的所有参数5 E( }8 t/ g0 v
批参数(%n)的替代已被增强。您可以使用以下语法:/ G8 z1 p9 S! ~$ @& Z$ m) e
%~1 - 删除引号(" ), 扩充 %1$ W& n. Q/ z; n$ V
%~f1 - 将 %1 扩充到一个完全合格的路径名( H2 l, f0 F# @/ ?9 }5 c& Z- F
%~d1 - 仅将 %1 扩充到一个驱动器号, n7 q& U- L# X
%~p1 - 仅将 %1 扩充到一个路径) a! o7 q; K3 W
%~n1 - 仅将 %1 扩充到一个文件名! |3 p: J5 A% _6 v& P3 h' S  p
%~x1 - 仅将 %1 扩充到一个文件扩展名" @3 w  R. t/ o# n& b  r5 c, o
%~s1 - 扩充的路径指含有短名+ P9 x6 h9 U/ C( M' y
%~a1 - 将 %1 扩充到文件属性
5 b5 S) ^" C3 H6 g2 ~$ i9 X%~t1 - 将 %1 扩充到文件的日期/时间# f; H9 D2 F; ~5 k1 A
%~z1 - 将 %1 扩充到文件的大小
8 A& a0 x! x+ N" e$ d" H3 u%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1$ `) s* o' \: M) C$ s0 b
扩充到找到的第一个完全合格的名称。如果环境& T4 O4 {' g" [+ u9 `1 F' }
变量名未被定义,或者没有找到文件,此组合键会$ D. _* {$ j0 _; X8 N; ]
扩充到空字符串4 o5 H/ u  T, t* O% s* a
可以组合修定符来取得多重结果:
) m* p) o) k) M8 q' I2 X%~dp1 - 只将 %1 扩展到驱动器号和路径! f" P; n* B+ j% o
%~nx1 - 只将 %1 扩展到文件名和扩展名. x- Z0 q7 H) `+ C% _4 `, C
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
8 a0 U" }* s' D并扩展到找到的第一个文件的驱动器号和路径。
0 [/ h  e6 S. Z1 t%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。5 k9 t# g0 ^3 G
可以参照 call/? 或 for/? 看出每个参数的含意! O. V" ?# o7 W# E" [! [- ?7 Y
echo load "%%1" "%%2">c:test.txt7 a; w) w7 B  G: ^$ W
生成的文件内容为 load "%1"  "%2"6 j+ k4 s0 Z* N* P8 v
批处理文件里,用这个格式把命令行参数输出到文件& t' [1 y; w) l

2 g, y1 [: G" I2 U  r29 if
6 a9 t6 _' I3 F, f) N& R判断命令+ \1 `% \- t9 J6 l6 \6 J
if "%1"=="/a" echo 第一个参数是/a) G6 u4 n9 ~  M( ~# f
if /i "%1" equ "/a" echo 第一个参数是/a
1 ?# J- J) O! R/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?$ E6 T) \* Y. [) n0 x
if exist c:test.bat echo 存在c:test.bat文件1 _! D- p4 \5 B7 \: f2 ?. M5 s8 m
if not exist c:windows (4 R  C2 K) j: t$ R
echo 不存在c:windows文件夹7 g4 P3 ]# r% s+ ?0 ^; K4 y
)1 _1 R; }* z5 k1 o, w
if exist c:test.bat (: v8 b1 j7 x4 Y  N
echo 存在c:test.bat
) o4 @3 X& q& @4 _* u5 Z) else (* ?  \' F6 E& f$ h- Z& C, e
echo 不存在c:test.bat
) @! \' i& w4 v& q( [)
4 l* Y) F8 A+ @. @& e30 setlocal 和 endlocal
+ M' O' N! j: L2 ?: t# ^设置”命令扩展名”和”延缓环境变量扩充”
5 D. E2 m6 G8 c2 fSETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"& s4 O$ ~- R3 `' c  t  R
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
6 C7 F' X; I+ J( jSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"1 Q, O" P# ?* r5 O; y0 x6 J( d
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
, J- H% c  `5 a/ kENDLOCAL #恢复到使用SETLOCAL语句以前的状态3 L/ c9 ?' p& H5 P) o0 X; j/ m
“命令扩展名”默认为启用
) t- _. D3 x- y' P8 u“延缓环境变量扩充”默认为停用! H3 ~8 F( |; Q+ E1 ^4 }. t8 J% ?  m
批处理结束系统会自动恢复默认值
- R# W% ^! t7 y* O' Q% U8 ]可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程. Y9 Y" U& s4 e: j
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
; K" q3 R  J( S0 Q( f# Z保程序能在其它系统上正确运行
  Z2 r, y- X, y$ }  r5 A"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
1 D. h5 B! F3 x( D0 `, S$ `& A% }9 R0 ^1 L" U
31 set! d0 C, j* B0 {) v2 \' o( p
设置变量
: y) e1 y; ^+ L& w2 S6 M7 U4 e/ x引用变量可在变量名前后加 % ,即 %变量名%
6 s9 \) ^/ r3 @0 v: J, x% K) J& {set #显示目前所有可用的变量,包括系统变量和自定义的变量
, M9 w0 B# ^) v  l1 M& ]: @echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用$ t: r! _; W% z/ X# [
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1# i: U0 V. j/ _$ L" Q  s
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
  L- U1 y/ I2 I  h2 W. }, y3 g5 Recho %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
6 p# ]- X+ r( l! U. J/ N$ J$ decho %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2# w% ~2 e* U9 H
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa21 x1 j; ]4 `" [9 E- E4 ?  z' [
echo %p:~0,3% #显示前3个字符,即aa1
9 [& a/ G. }) fecho %p:~-2% #显示最后面的2个字符,即b2
- V- Q  Q0 l2 e2 Z9 E4 Cecho %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b: N; z# s1 h3 ]
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
7 V* c0 x# c& @. b  t& ?: mecho %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
2 h# T  H* x- H% wecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb22 s! j2 U4 Q3 O
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb27 _5 J4 q/ m7 Q. ~" T. W$ ?
set /a p=39 #设置p为数值型变量,值为39
$ M7 E0 p0 R5 j0 c0 O8 `$ _set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
; G, C) O  i( d8 Z& i& Dset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用: f( _  ^! Y6 T
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?0 S: F& l$ F& C4 A" ^9 z7 l, |% }1 R
set p= #取消p变量
2 N' ^6 G0 m. b' C  S4 \set /p p=请输入
; X/ r+ K8 P: ?1 Y* s' @屏幕上显示”请输入”,并会将输入的字符串赋值给变量p' k& V+ ]# _, {
注意这条可以用来取代 choice 命令& ~+ _( k! ]! [. y9 E
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如6 w' Q: E' }  Z+ g5 h
@echo off
+ ^- D/ M2 ]7 Z+ V+ mset p=aaa, k$ l: P# z; h8 O
if %p%==aaa (& I" _7 z( Y0 U  X: j
echo %p%% E) `& p! ^& ?( L$ o
set p=bbb& L& k* w" V" g+ h0 n
echo %p%
) H/ H2 R1 Q# w7 P" K+ h)/ U- R) |( z% F$ A% m
结果将显示
+ E+ _; ^9 [) Z% O; K& _6 y( i: _aaa3 d: _: T3 B8 L  |
aaa/ Z' F3 a; U8 L- c; a( m- i2 y- c
因为在读取 if 语句时已经将所有 %p% 替换为aaa
$ s% W4 y% I  L7 }) \3 l这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
8 |" P- Q; ~5 \# k* x# \可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
1 H6 E' }$ p- {; C" P+ _5 t$ c7 }% O9 \@echo off( X2 j% P) O. Z" Q6 E
SETLOCAL ENABLEDELAYEDEXPANSION5 `& F- Z" B: _! m/ M' {* I
set p=aaa% a5 D" z# p, \3 {, r; C8 T
if %p%==aaa (
" X" x! ~  x6 F5 z8 recho %p%
  b2 m$ i" C9 c( x: iset p=bbb
( k8 [* A- G6 {. h; e: Vecho !p!
2 h( \1 H- L! w6 ~. l& ^)
# O/ y+ c+ M0 s! u! b8 mENDLOCAL
; b# u& m4 ]1 i6 T, g: W6 M$ S结果将显示
0 A: f; z& H2 a3 Z2 paaa8 c7 b! Z9 q* U! [! ]
bbb& `' J# t3 c* v6 J1 J' M/ c
还有几个动态变量,运行 set 看不到: J9 m2 ]2 p2 {. g7 ^# L
%CD% #代表当前目录的字符串
, w* x5 ~5 |( ^- z+ y%DATE% #当前日期  F3 g- l+ f. ^
%TIME% #当前时间( m, r1 e, O% Y8 A1 R8 `
%RANDOM% #随机整数,介于0~327672 s  p* e7 [# C  R) v
%ERRORLEVEL% #当前 ERRORLEVEL 值
' A+ J" D; X: _2 S% h4 O%CMDEXTVERSION% #当前命令处理器扩展名版本号/ |- ?: c( H  f, E* A7 y
%CMDCMDLINE% #调用命令处理器的原始命令行
* }1 u+ W# Q1 o: _0 x$ G' O可以用echo命令查看每个变量值,如 echo %time%
1 p: H, B, U$ R* ?# n/ p注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
( K' w4 N' ?0 ?1 b+ b1 y
+ ^5 p6 P' U$ D32 start
0 H" H: f  U2 `4 N& Z7 J/ b# n批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
+ k) F% U- p2 A* ~  ^3 L4 O1 |4 j4 T" X% H4 D0 ~
33 call
: l) x1 A3 u) ?. ]' p. c, A批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
- C/ W: H3 A, a' H- O3 n1 Z有时有的应用程序用start调用出错的,也可以call调用
4 H# b. C1 f8 u* J  O
; g0 p0 t5 G1 o- W34 choice (外部命令)
9 v# `' Y" j& h选择命令! j' E6 Z( E! C  v2 V
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……- {! O2 [# }& ?8 K
win98里是choice.com
" Z9 J  g% X0 @' ?/ A& z( U- Jwin2000pro里没有,可以从win98里拷过来' H8 ?. N% H7 n
win2003里是choice.exe# g0 p# k7 ^0 n+ |0 S) S2 J
choice /N /C y /T 5 /D y>nul
% J" A- h+ A  Q7 l延时5秒
# N! t" U/ @1 H% i" C& i# i! \, k9 {0 J; d3 s3 Y) I0 d2 E  I
35 assoc 和 ftype5 b& t, k% v" K6 u
文件关联; n; U4 C) P' P* \" L; C! F
assoc 设置'文件扩展名'关联,关联到'文件类型'
. u1 ?" e; ^8 G1 @4 j# xftype 设置'文件类型'关联,关联到'执行程序和参数'+ v, u! P  l9 n1 h  C0 @% Z
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
; F. U& @8 O- B5 q- [% d而是先判断.txt属于 txtfile '文件类型'. c9 [: K2 D2 z: F4 R# z
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
( q- S2 k4 L, t7 I. ~& L可以在"文件夹选项"→"文件类型"里修改这2种关联
1 \3 _( }. }) C5 xassoc #显示所有'文件扩展名'关联
7 m- b% O0 H, e/ J3 C& Sassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
; V" R3 H9 L) V5 B& R1 j, D6 Qassoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8! B* G2 {1 B: G& u- i# N* v$ m
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
3 G* R( M& ]  v- B8 c* ~& w" G4 xftype #显示所有'文件类型'关联" z$ N0 o0 q  `6 G% f
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
% y7 }9 T! F  f0 ~+ I3 Jassoc .txt=Word.Document.8, v% {% z; w: O! k0 Y. I
设置.txt为word类型的文档,可以看到.txt文件的图标都变了* ?4 O* j7 i7 g% w! C# R9 a
assoc .txt=txtfile7 Z( \- {$ p+ a* T' e% g: a% h
恢复.txt的正确关联) ^* f* m* M/ Z3 b
ftype exefile="%1" %*: e! g6 I  h; t) B; O1 _1 u) c- h
恢复 exefile 的正确关联
4 @- m1 l6 v# u' F# i! v如果该关联已经被破坏,可以运行 command.com ,再输入这条命令, l4 n. ~4 y1 S2 i

- q$ U! N7 M% Y: s& m3 G) h# f36 pushd 和 popd8 w3 ?2 d+ z2 _' n& J
切换当前目录6 n/ \, H7 q6 t+ i8 B0 S( h& h+ n
@echo off
  ~6 }) _! m9 `3 v' O$ \c: & cd & md mp3 #在 C: 建立 mp3 文件夹8 d/ V. k  b: q, `! q4 T& n" f
md d:mp4 #在 D: 建立 mp4 文件夹* T, t- w& Y7 q2 N# ], u. b
cd /d d:mp4 #更改当前目录为 d:mp4
6 q; |# B) Y0 T+ D" C. M9 ^: Npushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3+ M5 o5 u, S  X) r0 H" J
popd #恢复当前目录为刚才保存的 d:mp4. U, d+ }; ^& T, g* k& d, b
; u- F$ z( r# v
37 for
) @- t9 K( ]0 k0 c+ \$ V2 r6 w循环命令3 Z, p3 M% C  V' }
这个比较复杂,请对照 for/? 来看/ d. {( |5 W. N% |. z
for %%i in (c: d: e: f do echo %%i
2 D4 F6 e$ o, G: e依次调用小括号里的每个字符串,执行 do 后面的命令
! o. A8 f2 ~3 X( I" @. p注意%%i,在批处理中 for 语句调用参数用2个%6 U& A  L8 N0 m: k
默认的字符串分隔符是"空格键","Tab键","回车键"
# I2 m: J* g: Ofor %%i in (*.txt) do find "abc" %%i
9 y. i, N+ w6 u! J1 L# K$ _8 m对当前目录里所有的txt文件执行 find 命令
  ]: N: s/ g, H+ C  E9 a% @# ?- @for /r . %%i in (*.txt) do find "abc" %%i$ ~# b9 E- W' R3 h# I/ c' e5 k; ?
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行, G0 v2 V4 d/ x% ]
for /r . %%i in (.) do echo %%~pni( F" H; U: P& @! Z4 S9 D! n
显示当前目录名和所有子目录名,包括路径,不包括盘符* ?+ T; M0 b4 f. a  S; `* b
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
  R' T6 @9 j4 w" s# M/ F) u把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去) \" }0 `9 d$ o, M2 e6 ?
for /l %%i in (2,1,8) do echo %%i2 z) F1 w) o, M( V! }. g- n5 X8 U6 Q5 [3 U
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加13 H* C. r' ~; j% e* O. Y
for /f %%i in ('set') do echo %%i
6 p% Q+ D9 g0 @' W& `对 set 命令的输出结果循环调用,每行一个- H' j* y$ O9 K' b3 q, [; N7 x/ x
for /f "eol=P" %%i in ('set') do echo %%i. I6 }$ E6 s1 H' g/ Z  F! Q
取 set 命令的输出结果,忽略以 P 开头的那几行! M* b4 o- [7 c  [) D! w/ S
for /f %%i in (d:mp3.txt) do echo %%i& y( L0 I( h$ |- e, f  f
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
. {: q3 L3 B% A8 S/ z' Jfor /f "delims=" %%i in (d:mp3.txt) do echo %%i% f9 g3 j* ?, C6 }# M: Q4 Q
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称- a8 ^. \( p' d( j
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
* C! I# j  |- Q; N4 v9 P# h, C对 dir 命令的结果,跳过前面5行,余下的每行取第4列6 Q9 e# S+ M. [# J8 J
每列之间的分隔符为默认的"空格"! C# [8 x& O$ a3 o
可以注意到 dir 命令输出的前5行是没有文件名的9 r0 @) ^9 B7 l( A
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
7 X+ K& l- p: R( r+ s6 jecho %%a
, H2 i9 v5 r2 c, F# kecho %%b( g. [9 u" M8 x1 v& X6 x
echo %%c
, A  d! H0 w. v7 J4 c! M  f+ Q$ L)+ W' Y& s1 H! c" \: }6 w
对 date /t 的输出结果,每行取1、2、3列. J8 Q" D) L2 v% Z! b4 k9 B
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列7 K, i. O: h: o/ s$ @2 }
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"$ O2 A4 {. N; p$ W  V) `5 T! r
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
4 r- ~) T2 {; F/ F$ e. ~for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
7 u- l4 K. z! [  [& B8 {% `; ?& G取第2列给 %%a ,其后的列都给 %%b
! {: |8 k, ], d  B$ m$ L) c" O, n9 ]+ F& v( X3 L8 l
38 subst (外部命令)3 c; k! x: B+ S! O
映射磁盘。
9 s5 }- y- T& J0 y' J4 s4 l, isubst z: serverd #这样输入z:就可以访问serverd了3 R9 c' {' f8 q1 P, o
subst z: /d #取消该映射
  h: A1 \8 @; y2 Zsubst #显示目前所有的映时) T) f* v/ ~% c: b( U- z" T8 w

+ s3 M5 Q* ~' q& g+ x. O4 I39 xcopy (外部命令), m3 L( t: b! C& f- G! @+ ^0 d% g
文件拷贝
7 H/ r1 N  e2 B5 Nxcopy d:mp3 e:mp3 /s/e/i/y
9 P; P$ t' }9 [# R% R9 g复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
& j3 Y2 u2 w0 C' B+ @9 M( t: F加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问6 g# J" i5 g2 U7 G9 W3 {
1 }& e! e+ h- f. `) j
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退8 l4 E0 W! y* a$ h
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:5 l8 j, J1 f! O4 ?' ^7 a
    1 i: ^9 Y3 X$ F2 M6 b5 t/ j5 |
@echo off
- t: J6 u* X& i' G7 P5 @3 x+ Aset p=aaa
% m( C9 K- G) f" g# gif %p%==aaa (7 l4 H- O) p" N- F6 W- `
echo %p%
. w, [6 u' ]  z: i- f/ r! k' wset p=bbb
0 [! {8 e8 i3 e1 o: uecho %p%6 ^7 Y  w% [1 I4 u3 h9 l
)
) \* X4 x5 Y: q, I# F% Y! m9 ]% W: Upause
  • 截图:) l1 p/ ]: i  Y- |6 \8 o' J
  • 2.批处理.bat 文件中输出中文乱码
    0 L9 a$ Y$ M* D$ C- }1 w! x8 u
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:7 |2 ]- G1 K8 r  A+ M) j' ]  o4 J
    • 效果截图:
      7 X4 |" l- |# N/ W/ Z. D6 s+ A9 _: `: p1 K8 O
    1 H5 b$ ~" V$ R7 D
" X9 s* U  e- ?* b/ ^9 ]

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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