扫一扫,微信登陆

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

搜索
查看: 2104|回复: 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 文件中输出中文乱码
  • 解决方法在文章末尾!) r' _( B" u. u! _; \2 p+ B5 |
前言
  • 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效# t( X( Q4 @8 ~0 o
在Windows中善用批处理可以简化很多重复工作
什么是批处理?
  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
    6 k! r. r- W3 c) E$ g$ d; g3 T名为bat
  • 目前比较常见 的批处理包含两类:
    2 E" |  [: _7 D- {1 E
    • DOS批处理和PS批处理。
    • PS批处理是基于强大的图片编辑软件
    • Photoshop的,用来批量处理图片的脚本;
    • 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
    • DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理# h. l! Q/ T1 J6 e
  • 批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
    2 J9 e/ {0 l' {命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行
  • 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件

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

  Z) v# L$ U. Y  \( J- k* V- E) `) \: s( P3 @7 n# m
Windows Batch 常用命令
7 u4 b) o* t- t2 K8 {7 L1 echo 和 @
7 R  T  T2 {9 _回显命令" \7 |8 X" x! Z; a
@  #关闭单行回显5 y& ]2 G/ J0 J4 ]' k# B5 l
echo off  #从下一行开始关闭回显* k% a: r3 S: r. r2 [& _6 l, A% ^
@echo off  #从本行开始关闭回显。一般批处理第一行都是这个# [+ h8 @2 }* z* y. d6 t
echo on #从下一行开始打开回显
- r( v1 b5 n6 K5 m2 cecho #显示当前是 echo off 状态还是 echo on 状态
$ l* ^; X2 E1 z. K! ^& t  z3 |echo. #输出一个”回车换行”,空白行
- d* K; P) [: s#(同echo, echo; echo+ echo[ echo] echo/ echo)
9 @  d2 _% \: U0 d9 m  t) r! z5 Q9 |& l' j( O5 S  i8 r
2 errorlevel5 i: }3 N/ {! _
echo %errorlevel%7 q  p1 A/ c) ~, {6 a. n
每个命令运行结束,可以用这个命令行格式查看返回码2 Y3 e3 I4 M, c% g+ Y) n' B
默认值为0,一般命令执行出错会设 errorlevel 为1
, |4 o. K& F( |$ C* x* b, j% P: C
3 dir4 R  e; R/ l5 y2 t! m& O
显示文件夹内容" x. A* e& j# g
dir #显示当前目录中的文件和子目录
# O) G* [$ s6 J4 ^% _dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
+ P$ {+ K+ H* Gdir c: /a:d #显示 C 盘当前目录中的目录
* z; u9 r2 y9 N. x: udir c: /a:-d #显示 C 盘根目录中的文件. v) Z6 P, m/ b) }# ~
dir c: /b/p #/b只显示文件名,/p分页显示
% M9 Y& q5 `. e4 B! _( Y' d1 _dir *.exe /s #显示当前目录和子目录里所有的.exe文件
/ V0 e7 V$ ]: q3 j- ^. p& ~
" ~) ?7 g: l% L, Y4 cd
6 k) C0 I5 {, x$ t切换目录) E9 q# |9 {5 q0 i% s6 c* G6 d, J
cd #进入根目录
' b/ r) H% v; Z4 \6 y" dcd #显示当前目录
+ X8 _- w3 Z+ e  P7 y7 B0 jcd /d d:sdk #可以同时更改盘符和目录( v# P8 B9 I3 d) [

' S; u8 O, [6 z5 W( c5 ?0 w9 Q) ~- F4 x5 md3 R# G' m% ]3 U+ h0 {2 A
创建目录9 H) P* k2 F2 q' t" }
md d:abc #如果 d:a 不存在,将会自动创建中级目录
1 s0 H5 \  ^" k  c8 R/ ?- i#如果命令扩展名被停用,则需要键入 mkdir abc
# M# m( S2 V* W. L0 }( v' \6 S! \# W; A# \; v. O
6 rd3 ?8 J/ ^; s. P0 s
删除目录% O5 P/ f: d2 y9 E' Y
rd abc #删除当前目录里的 abc 子目录,要求为空目录
5 |* I% d  F1 y) N* l! u5 xrd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
  }9 ?4 ~' F) g$ ^
% _6 N2 ^) v) B6 j9 n. ~6 b7 del
5 _1 @! z0 l* W/ x删除文件! u: I/ S- l( e/ U& K* A0 C
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
  I! H* I: Y* R% Cdel /q/a/f d:temp*.*1 d% P$ M1 T: r9 s  P
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
, T! }6 D' ?  z( P# y( V( x: x* rdel /q/a/f/s d:temp*.*
+ _4 [  o8 J) e. ^' [+ b; @删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录' H: C/ A" R3 X+ E
# c4 Y( V+ Y% M" G/ W0 D% x& ]
8 ren- S8 k5 s2 `" a/ S' v2 J+ t5 m; m
重命名命令
/ ~# y' \( f7 D- r0 F( D7 hren d:temp tmp #支持对文件夹的重命名2 W1 t! C/ N3 A- ]5 L

. |  l, _% s& x$ O9 cls
: B* Q* F6 A. X清屏
( d- r3 p; s% x3 w! J1 \" l10 type, P$ Y) S# W8 L- A+ V: \* ^
显示文件内容
/ H: p! I6 _0 f1 E2 u9 gtype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
5 D4 l' j9 ?. V0 O6 w$ Z9 M) b! L" htype *.txt #显示当前目录里所有.txt文件的内容
9 u; o3 E$ V7 Y
" h( {$ T4 [  q" W( [0 u11 copy- }$ Y; d  Y8 O; V% o
拷贝文件; }+ s' \* T# q
copy c:test.txt d:test.bak) I% d1 _4 M+ ^5 |5 Q
复制 c:test.txt 文件到 d: ,并重命名为 test.bak
4 \: U- D/ M2 n, }0 @- H! ^copy con test.txt
. T0 e* g& N8 e+ Y从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件/ x8 D4 X0 [( c0 z
con代表屏幕,prn代表打印机,nul代表空设备
/ _* P7 h- D& u4 k- I6 ?/ G! ncopy 1.txt + 2.txt 3.txt; h2 Q: A; r8 N7 e: \+ y7 P) W9 J, n$ g* D
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
3 k7 n& h; ]. M' y9 O7 M  `- F如果不指定 3.txt ,则保存到 1.txt/ E6 X. z* ^4 D' N
copy test.txt +) Y$ j7 A/ @- ~7 r$ R4 S
复制文件到自己,实际上是修改了文件日期
' ]9 z6 P  d2 v& C+ e% V
6 o5 |0 {4 d7 C) Z4 ~12 title
8 ?3 a! T# o4 o5 G! ?/ G设置cmd窗口的标题6 n) u8 P: w+ V$ N# `
title 新标题 #可以看到cmd窗口的标题栏变了
# z6 d+ K3 `5 I5 G% ^" F* z) V7 Z6 _4 D' z
13 ver
2 N, V6 o6 L, Q. ?) n显示系统版本. c% k* C. W7 s* |' J& a. D! j: U

& c1 C  ^& _  ~1 B) U0 x14 label 和 vol! J2 {5 V- A( ]
设置卷标
( v8 k; [1 V/ [4 tvol #显示卷标
) J# \* A1 W. V+ b! B1 alabel #显示卷标,同时提示输入新卷标
( [) Y/ R0 ?- l' Alabel c:system #设置C盘的卷标为 system. e- l) P7 `2 J2 c6 ~/ C9 {( i
$ y# t9 H) s3 o9 D5 ]/ T8 h
15 pause- H, H1 _9 z, l' u
暂停命令
( \3 k# h8 [* i# f6 D) O- v& L1 [6 p/ X- V8 V& [$ v* y$ p
16 rem 和 ::
- T# v5 k' d' g* `注释命令
& S  Y# O# H3 t4 ^; _5 a* c注释行不执行操作2 b/ g6 m  y# o9 ?* C

- w; b2 _% B, H& D7 {: ^# }17 date 和 time
& }6 \5 H7 |& z日期和时间
& O# V8 Y& e, U- X" @date #显示当前日期,并提示输入新日期,按"回车"略过输入
' E4 F2 q0 q$ A8 ~date/t #只显示当前日期,不提示输入新日期
1 B0 z5 P% C# }# s- e: K; Atime #显示当前时间,并提示输入新时间,按"回车"略过输入: a& }+ g2 ^- n: S% M5 t
time/t #只显示当前时间,不提示输入新时间9 e5 p, E  \3 i2 t- w, k

: F% V) f7 i! `) ?5 F2 f- X" ^3 n18 goto 和 :1 n4 r$ q. B$ ?+ }2 `0 d' l% G
跳转命令
0 E, U3 M7 C. F:label #行首为:表示该行是标签行,标签行不执行操作1 D) G* [, j% q( G9 [
goto label #跳转到指定的标签那一行) T7 B& N# l2 ]6 Y' x# t
% j1 r" i( |: ~* P" p3 b
19 find (外部命令)
4 [0 H4 O1 g1 i/ i3 H  j" I, E" v* |8 N查找命令
  o* W3 r2 w( G4 l$ X4 qfind "abc" c:test.txt
' J" a7 k/ u- Y" v; [. X+ ?* E5 q在 c:test.txt 文件里查找含 abc 字符串的行
& ^; H( q# \0 F( p# Y6 z如果找不到,将设 errorlevel 返回码为19 [  M$ Z8 G2 r! b. F9 m& d
find /i “abc” c:test.txt. J; r: R0 H$ y  H) [% H+ g2 L  U
查找含 abc 的行,忽略大小写# p5 K. C% k0 P& q
find /c "abc" c:test.txt2 U2 ]; m1 t; Z1 g& B, ~
显示含 abc 的行的行数
; ^& g- z, W9 N, W5 _4 ?, B# k; m' `" b7 C
20 more (外部命令): T! b: o  R1 Q7 u$ K# T
逐屏显示6 u% T! w. X  X+ T* u
more c:test.txt #逐屏显示 c:test.txt 的文件内容
" E" q3 P% v% ^4 p* d
/ a9 u# j( I# g2 v* |4 \: g  Z21 tree
. ^! _% O% f; V: U5 t显示目录结构
& L1 B9 b0 a; ztree d: #显示D盘的文件目录结构. q9 f7 ~6 ~# i5 Q! a8 X; a9 N# D+ x

7 f$ @, W: p4 w6 V8 s% B7 y$ [22 &
$ y! X) `2 _1 ], f  I% q顺序执行多条命令,而不管命令是否执行成功% U5 e* t9 a0 m& g' R& K
# q% d2 d/ d5 J. a& _
23 &&
9 S& K1 J. C- v. j$ |# p% a顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令! K! q- g& Z1 [' s( b/ Q$ R' `
find "ok" c:test.txt && echo 成功/ h3 P# |5 p4 P" x" d
如果找到了"ok"字样,就显示"成功",找不到就不显示7 p" N) Y# L2 G
' g2 _% K) a+ o* i
24 ||+ q+ [  t/ f: N6 N8 {+ |& s
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
7 E" ]5 c% T% w+ N6 a) cfind "ok" c:test.txt || echo 不成功, J6 O( R( R" Y# b$ t  k
如果找不到"ok"字样,就显示"不成功",找到了就不显示  d, F$ q2 N) o& T$ F+ ~

3 l- R5 @) Y% [25 |
. i2 \& s, n$ W8 U$ t$ W管道命令
( a9 ]9 K7 \6 w9 V- Q# Wdir *.* /s/a | find /c ".exe"; @1 J7 l# @1 P# V0 f/ x
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令( C  ?& t/ q# ], W
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
4 U* q7 Y/ ]/ X# M& utype c:test.txt|more+ i" B. p) a/ L6 ~2 b8 j- b
这个和 more c:test.txt 的效果是一样的9 M& r/ [, F& X2 ]

  e- ?7 X) Z+ B0 Q- I8 t; v9 W26 > 和 >>
9 j/ |+ t. U3 S1 K输出重定向命令
+ C' J& i* d0 M* @> 清除文件中原有的内容后再写入
9 h; ]9 u$ S# u# {) P. V>> 追加内容到文件末尾,而不会清除原有的内容
4 Q+ J0 o; v9 \6 ]7 J主要将本来显示在屏幕上的内容输出到指定文件中5 Z( N& C) ^+ H3 A: t
指定文件如果不存在,则自动生成该文件
6 b: j! B' K+ C8 f4 {type c:test.txt >prn
# l' r, T- o& [! v5 `! ^屏幕上不显示文件内容,转向输出到打印机' r4 \' o& U( K* Y
echo hello world>con* j) d% a" P& n/ O1 Y
在屏幕上显示hello world,实际上所有输出都是默认 >con 的& W( \1 H: V1 `4 v' z! J
copy c:test.txt f: >nul1 i9 b' ^- c" |2 T- \0 e  s
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息& |' V, U  V/ U/ z
copy c:test.txt f: >nul 2>nul
! a2 q) }( ?% y% l8 D1 _1 m+ l* C+ H不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息7 j& ^; s3 ^& l' |& [3 c
echo ^^W ^> ^W>c:test.txt
8 }" q3 ~7 M; R% k7 K' y生成的文件内容为 ^W > W
  G; f- I. Y4 Q' L' C8 v) @; ]^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
( s) ~# M; ?+ n$ y+ ]' u: X% w# {: v; J- ?7 \
27 <
& h9 ?5 Y4 p2 I从文件中获得输入信息,而不是从屏幕上
7 V" J$ s+ @2 t一般用于 date time label 等需要等待输入的命令
" {% J/ }- ~/ Q  a@echo off8 R: b/ @& H2 Z' U% l2 e
echo 2005-05-01>temp.txt/ t; m5 H1 a2 p0 ?5 v" i- U/ |* T
date <temp.txt& h  p3 z& c: U: j( w- [
del temp.txt, y0 `! R6 h7 i" E
这样就可以不等待输入直接修改当前日期
- m9 J' q7 f0 P6 p% k* U' f( F% {
+ p- R; t- c' t! D# [* J) H. u% E28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
6 W3 |; {6 s7 o& r4 E/ B# Q# T命令行传递给批处理的参数
: F% U/ K3 b4 R%0 批处理文件本身4 M+ m+ A7 s4 e
%1 第一个参数
" p9 p6 P$ [, Q2 z%9 第九个参数
9 o1 V. c8 |# L6 z  B! E%* 从第一个参数开始的所有参数  S1 n5 a  R/ ?6 Y. x
批参数(%n)的替代已被增强。您可以使用以下语法:% B; g  [9 {5 p. u5 k- a
%~1 - 删除引号(" ), 扩充 %1
! ]* `' |6 o! O: T, o% n8 N%~f1 - 将 %1 扩充到一个完全合格的路径名- Y( `% p- v4 h0 J. a# `
%~d1 - 仅将 %1 扩充到一个驱动器号
6 c: J9 t3 N9 v* _( Q; \/ n! g%~p1 - 仅将 %1 扩充到一个路径& }4 z( o4 I" u! K- T. S8 G2 k8 x
%~n1 - 仅将 %1 扩充到一个文件名
8 H8 W3 L" M6 \/ ?%~x1 - 仅将 %1 扩充到一个文件扩展名
$ [7 R6 s$ i: n; R2 M%~s1 - 扩充的路径指含有短名2 s1 w2 {0 s) U
%~a1 - 将 %1 扩充到文件属性- ]( g! s7 O& S' o7 C/ H- Y
%~t1 - 将 %1 扩充到文件的日期/时间
- L, H0 `' N3 Y%~z1 - 将 %1 扩充到文件的大小# a1 ~1 v* W/ c% n6 R
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
  }" f  E0 g/ z1 h扩充到找到的第一个完全合格的名称。如果环境
" D9 h: O0 q- @1 E! I变量名未被定义,或者没有找到文件,此组合键会' C3 r# _( s9 L! V, s
扩充到空字符串. Y) Q: u/ M1 i2 D# u
可以组合修定符来取得多重结果:, v2 G2 h: e5 K) k/ q5 k
%~dp1 - 只将 %1 扩展到驱动器号和路径
$ y* o& l' l; L. v8 K$ ?" ?4 ~# V; X6 j%~nx1 - 只将 %1 扩展到文件名和扩展名
5 K! s( \! }2 G* b7 t! |, L! |4 D%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,6 d( t# `2 Z# X  O) @
并扩展到找到的第一个文件的驱动器号和路径。0 g0 K4 c) d3 [6 s! q
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
& b1 U! V% R- _* J% i( y可以参照 call/? 或 for/? 看出每个参数的含意6 O! z: b2 C7 @! d4 A/ ~8 Y* r
echo load "%%1" "%%2">c:test.txt( N& Y- J! ?" `) A. ?+ ]4 [
生成的文件内容为 load "%1"  "%2"/ g2 A$ s2 Q6 G( G5 `
批处理文件里,用这个格式把命令行参数输出到文件
3 b4 q+ P2 b$ j7 q) \9 V/ S5 K* R" a4 ]
29 if
5 Z* ~4 r$ ]5 E9 B. h判断命令
* ~& o" Q" I  m" ?; S, ~if "%1"=="/a" echo 第一个参数是/a
- e. ~  I2 t! |$ }7 oif /i "%1" equ "/a" echo 第一个参数是/a
4 o  B% A* z0 q5 c/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
! I0 L2 R# d3 _& gif exist c:test.bat echo 存在c:test.bat文件
3 U$ G4 a0 k7 ?2 pif not exist c:windows (
6 F( O  ]1 T% H6 j, k" U6 _- @& ^echo 不存在c:windows文件夹+ k- l0 c7 ?& \
)0 K$ k% E* t9 S
if exist c:test.bat (8 T* T% S+ J: Q
echo 存在c:test.bat
. t0 ^. w! ?# Y2 N) else (, z" ]# f2 N0 R- s% C: V! ?  ^
echo 不存在c:test.bat2 a# y" _* C( u) b/ J- m" |
)# u) T9 q: T1 ]! t! {
30 setlocal 和 endlocal
2 @5 ?/ ]! v9 l6 x设置”命令扩展名”和”延缓环境变量扩充”
! u  A# _0 s( [2 ]/ [SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
7 O; U" \8 n6 X" o- wSETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"+ t5 V; C4 _1 C) n
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
9 G% M+ l0 _+ V" fSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
4 }* o/ w# e0 wENDLOCAL #恢复到使用SETLOCAL语句以前的状态8 T! d# @2 s+ {! o# o
“命令扩展名”默认为启用
. d$ C3 d0 Y8 |( E" z“延缓环境变量扩充”默认为停用
: N' ?4 v+ y  y. P3 v2 y" D! G+ N3 B: w批处理结束系统会自动恢复默认值
4 b9 L( N! ^3 q5 D; u- y% w可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
% f. t/ F4 h! g! A4 V1 i; `7 \$ ]序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确" [% F! F( Q. N# T( K' C/ S2 ?
保程序能在其它系统上正确运行
5 X; q3 b; Z/ y# d% ]"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程; c6 f$ N6 O5 Z+ t5 i
7 C% U' p. G+ J/ ]$ V
31 set' X7 q& i5 p# M* p4 z2 Q
设置变量
8 C: G( a( f. `! b( q) B/ ?$ d# ]引用变量可在变量名前后加 % ,即 %变量名%: j( \4 z1 @* C4 b" b
set #显示目前所有可用的变量,包括系统变量和自定义的变量& c& t0 ?6 n8 S9 V4 S
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
$ O& B# [* c7 x# O7 \, t2 hset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=19 H+ n/ z' v; L; ]# L( E4 ?; E- c1 ^
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
, ^& \9 B1 t* o9 O3 o" ~" I3 W: Qecho %p% #显示变量p代表的字符串,即aa1bb1aa2bb2* M1 g5 i! d9 }' v9 D8 E
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
% X8 r+ ]$ M% g9 ]; Z& necho %p:~6,3% #显示第6个字符以后的3个字符,即aa2
2 g1 G. a4 v/ Becho %p:~0,3% #显示前3个字符,即aa1
8 p$ V( r3 z* F2 Y# lecho %p:~-2% #显示最后面的2个字符,即b2( q( Z7 ?3 x# I7 `
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b) W5 A. p/ W: \) G; B2 p+ }
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
5 ?- `5 \8 ~: Uecho %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
" w6 v# X2 L, h2 M: t$ f5 b% Kecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2! |9 h/ J! u& |& g9 D7 v
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb28 ]/ m5 v1 B+ y4 p( _
set /a p=39 #设置p为数值型变量,值为39
, R7 d% b; Q: @set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
  Y! Y6 n% v8 e, W' _set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用' y! h( v+ M$ s# D1 m
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
) S  }+ d" I6 h! s, a& M- [1 fset p= #取消p变量: p' l+ ~, m! y; A& A) X1 n/ n
set /p p=请输入
' r4 n: d3 J, {: X% o4 {屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
% K0 R7 ]$ y6 [  R8 l" R! R注意这条可以用来取代 choice 命令
& y' }  J" x5 P: `. x/ [: ?" P4 R3 [' {注意变量在 if 和 for 的复合语句里是一次性全部替换的,如0 p  M- F! J, F. J: ]9 y* D* [
@echo off
7 f" C( ~4 q; L0 V- O; ?set p=aaa
! g( y' I- x$ D5 g+ \9 {6 j1 sif %p%==aaa (! ]" x: W3 s1 S  \
echo %p%
9 |( j) U( J/ }: |' O' Pset p=bbb
' x9 j& i: J1 c) }4 Xecho %p%
2 c% B7 t% Z0 ^+ S8 f: a: }+ K* w)9 }' x+ L/ D6 u! ]: P
结果将显示/ F, y  ?, Z+ c% g  Q1 F
aaa1 S% m$ N4 d! _% |
aaa
3 F2 y: I  v  y) E, ]+ I$ S* Z因为在读取 if 语句时已经将所有 %p% 替换为aaa
# _$ C6 \  W( V0 F* l8 U' W这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
: _' T+ r# r+ F& K  B  f可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
/ x9 V' H# F4 v1 |) R. f  |@echo off9 C# ~$ P9 h+ h; {
SETLOCAL ENABLEDELAYEDEXPANSION5 D2 `6 Y5 S! K* C! o
set p=aaa1 b6 ?5 O) e/ S' @) V* o
if %p%==aaa (2 V) s1 T7 u! U
echo %p%
5 N1 P, r. K1 dset p=bbb# Y5 L9 S. D4 u3 w& O2 ?
echo !p!: e/ x# E/ ?6 R+ p& b' I, J
)
+ C& u$ M4 b) V4 M' PENDLOCAL7 {( N* h4 M7 R0 v  A0 `
结果将显示
* H( x+ k6 S1 `1 d3 Iaaa( M4 w/ U; t% n. b  H+ e+ a* T
bbb6 Z  ]/ `. V+ s. j) B1 H; n
还有几个动态变量,运行 set 看不到
' C. |4 W% K% D+ }3 l& l%CD% #代表当前目录的字符串
$ Y6 e$ Z# U3 l4 {%DATE% #当前日期9 Q( S+ ?8 o6 ]5 d+ h( X1 z
%TIME% #当前时间
+ I$ ^: X4 x/ j% b%RANDOM% #随机整数,介于0~32767
0 ?' [% ?' f! I+ u9 f%ERRORLEVEL% #当前 ERRORLEVEL 值
: h8 I: G$ {* x%CMDEXTVERSION% #当前命令处理器扩展名版本号
( ?! _5 V( E" a; ^7 I1 z%CMDCMDLINE% #调用命令处理器的原始命令行
& ?* T) v& p/ l! }可以用echo命令查看每个变量值,如 echo %time%
; n) q' N8 ^# H) p注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到* n5 f) {4 ~6 }9 J  `6 O& g! n$ Q' k

- x+ D$ Z2 ]; e1 X6 F1 Z1 {) ]32 start; i4 D/ S' u+ l& V& u  [2 H/ r3 q
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
* D! p* g. ~: P" T" M" D0 @5 |% z: a& k+ _- w1 k
33 call4 p! E# {# D" a5 l6 |- w, b
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
. ?7 }, K0 D! [- }' V; j有时有的应用程序用start调用出错的,也可以call调用
' f& e0 o7 U8 Q, `7 @- q$ B7 M
" Z. q7 S9 b' ]9 Z34 choice (外部命令): M5 B+ k4 W% T1 {3 I" ?- E  T
选择命令3 c2 a( i& w  G$ P1 @
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
- `1 M& N  z( Lwin98里是choice.com
" u8 ~" |" c! {- wwin2000pro里没有,可以从win98里拷过来
9 M. T( H4 ^( G* |win2003里是choice.exe# X' |' \' ^( G; \( P
choice /N /C y /T 5 /D y>nul: j, S8 W: h8 @
延时5秒
' S9 e( p9 J* |6 g) z. A- y4 a8 s5 H1 e% ^9 L% l
35 assoc 和 ftype
" _- o, p9 J8 l! K. Y文件关联% G# K, s# i! c1 o
assoc 设置'文件扩展名'关联,关联到'文件类型'. }# L8 ~$ B; Q5 H$ J
ftype 设置'文件类型'关联,关联到'执行程序和参数'$ ~; n6 R! \. `" i; z
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
, n: n- G) ^' J5 E+ N* x+ Z7 Z而是先判断.txt属于 txtfile '文件类型'% c, r' ?. t  X4 f* {' d! l! s" b
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
: G0 \0 |1 D3 Q' m& o可以在"文件夹选项"→"文件类型"里修改这2种关联
1 x1 `1 ~& [+ l- |assoc #显示所有'文件扩展名'关联
0 ~" C& z6 K# h1 B! hassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
  d: a/ D* U: x! _" Iassoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.80 W" t  K- ]8 _0 T
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
# I4 _3 M, e% Aftype #显示所有'文件类型'关联
: g- Y1 z8 a# hftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
- A# ^) W2 D* b, n8 Xassoc .txt=Word.Document.86 I$ j4 h- |3 F6 L; k
设置.txt为word类型的文档,可以看到.txt文件的图标都变了/ U7 I5 H# k& K7 [) |% Q* E
assoc .txt=txtfile
7 ^% {: ]! k& C恢复.txt的正确关联
' M+ p( u  w$ p* ~2 oftype exefile="%1" %*
! M$ k0 C  R8 D4 ~4 P+ m恢复 exefile 的正确关联
" s, l# }  m8 x如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
% Q, _$ J/ y  D0 o2 _9 P* M- {2 z( k
36 pushd 和 popd% `5 T7 F8 J4 }3 `$ w. c
切换当前目录
' O* b, n  `# _@echo off0 \: ]7 N" J3 D
c: & cd & md mp3 #在 C: 建立 mp3 文件夹
6 Y" N, T  c( E  Hmd d:mp4 #在 D: 建立 mp4 文件夹# R% n. D% I0 |1 [+ s" c
cd /d d:mp4 #更改当前目录为 d:mp4
: \* [  d0 o* d1 q( I% _pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp33 p8 I$ V/ u' R* R5 m6 U7 |
popd #恢复当前目录为刚才保存的 d:mp4
3 _% ?, Q7 G8 [, W
# x* I4 Q. q' N0 x8 ]37 for" t) g6 }, F2 Y  P! F- d! n) r
循环命令
8 ]- e3 G- [; D6 _这个比较复杂,请对照 for/? 来看
: n0 ?. ?1 P" l- c! [6 Y* dfor %%i in (c: d: e: f do echo %%i
; f  p( ?0 y8 E; _" O依次调用小括号里的每个字符串,执行 do 后面的命令  }$ C& e( l; y$ N; a8 o
注意%%i,在批处理中 for 语句调用参数用2个%- R3 ^+ u0 e2 n/ @( d: R
默认的字符串分隔符是"空格键","Tab键","回车键"6 H3 q# d' s. |+ @( o4 w0 f" d
for %%i in (*.txt) do find "abc" %%i! I, ~/ e# f4 J3 `# G" n
对当前目录里所有的txt文件执行 find 命令8 e. X: j- E& c6 b5 E1 Q
for /r . %%i in (*.txt) do find "abc" %%i
1 P8 a, w/ D% a% K; j+ T在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
- x4 _: v* x* y6 c* J1 _% }' S, ]for /r . %%i in (.) do echo %%~pni
; Z0 `4 }/ P! R' L4 d0 {显示当前目录名和所有子目录名,包括路径,不包括盘符
" @5 n. S" h! Xfor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
9 T  S# V4 [; |/ A3 K# n把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
5 T. ?; G* |: s& ^+ C* `- g' f+ Vfor /l %%i in (2,1,8) do echo %%i
) `: q( |% C: Q生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
0 L8 `9 X! Y9 I0 O8 Z. Tfor /f %%i in ('set') do echo %%i: D& n5 M4 M6 ]9 J+ D; @' \
对 set 命令的输出结果循环调用,每行一个8 O+ K( X6 }1 O: U! ~" i4 S
for /f "eol=P" %%i in ('set') do echo %%i
" T2 A8 \' _" \; f取 set 命令的输出结果,忽略以 P 开头的那几行
  _! g4 h- Q( \8 Hfor /f %%i in (d:mp3.txt) do echo %%i% M& S( a: r4 e% T. t% L
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称# }  C9 N9 p3 Y+ m
for /f "delims=" %%i in (d:mp3.txt) do echo %%i
# z/ b/ X1 u3 S5 B6 q显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
. n8 N8 I8 c9 W& L0 M7 hfor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
3 m' A( J% f: Z: l0 F. r对 dir 命令的结果,跳过前面5行,余下的每行取第4列& N! t4 r3 z0 `1 R7 z, A3 e
每列之间的分隔符为默认的"空格"
3 h9 L& _( v2 k/ P+ C可以注意到 dir 命令输出的前5行是没有文件名的
! l# c. O. R' Wfor /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
  k8 u7 j1 J$ ]+ x& W  s# r2 Secho %%a7 q* a( G! c" k" U* ^9 m/ p
echo %%b
% b1 p1 ?9 t% t. I6 Jecho %%c$ i: _  h1 {: I
)4 U; C: T' v& C3 i+ `$ I; M  N2 U9 |
对 date /t 的输出结果,每行取1、2、3列
6 E1 \2 v9 l  S/ v+ e第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列  Z$ H2 X: L( B) g, d
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
, @  U7 G; X( P1 G$ G其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
, K! I3 S- m) l( C: _9 Dfor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
! Z  X  B; y3 |! C7 f  {取第2列给 %%a ,其后的列都给 %%b
! c$ q5 A1 x( Q; x2 O4 h+ U: a! O4 n" Z# P! ?5 K
38 subst (外部命令)
) p6 C/ ?# o; l& Q8 S& i映射磁盘。$ N: g( X& }2 i
subst z: serverd #这样输入z:就可以访问serverd了
: V  [3 @8 z# [, jsubst z: /d #取消该映射
( m9 ]6 Y2 B( e6 {6 zsubst #显示目前所有的映时9 o8 _1 H1 I8 y/ `6 {) Q
: Z& c; e/ e, r, D" v  S* E7 A3 E
39 xcopy (外部命令). s$ Y) i) e0 T' s% p
文件拷贝( i3 m4 S5 B0 r0 G# _4 ~0 \9 w
xcopy d:mp3 e:mp3 /s/e/i/y
* [5 L/ X& B1 y" h复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
6 `& S# ^7 N9 u加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
- I0 v) ]5 I3 J8 ?0 G& ?4 Z4 s) O9 G1 M. N& z
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退! \) v* m( A& ?0 i/ P! K: o
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:) a+ e' {. r; X7 j
    0 P+ Z( s6 r6 A& l
@echo off- V! y1 P1 K9 I9 F# Z) \- @4 Q) ?
set p=aaa( F" `- l! h# }6 D
if %p%==aaa (
6 S5 }$ r$ ?4 S# }+ R, kecho %p%" D  O* x. D1 G2 G/ c. _
set p=bbb
* F8 e. b, k- @  t) |! X, N+ x* oecho %p%+ k* C) |9 t' n6 i! P* E4 U
)
/ M9 m; b$ O% O1 P% O+ w% V, v. x4 ypause
  • 截图:7 d& T8 e+ l( G& A8 Z" ?1 r5 U7 x
  • 2.批处理.bat 文件中输出中文乱码
    % y% l. [* g* i7 M
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:" }. y/ C! u; o* Q
    • 效果截图:
      " _& u' ?/ {6 u- R% x! s* R3 z- O5 y, z; u7 z% ~1 t1 d4 r# A

    $ W8 v) i0 `* H# [9 J6 I; z& ~
1 l: S4 v7 I" ?  \  S

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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