扫一扫,微信登陆

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

搜索
查看: 2081|回复: 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 K7 R2 v5 J9 o
前言
  • 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效
    + p; V6 C, m: G! P2 |8 U" u
在Windows中善用批处理可以简化很多重复工作
什么是批处理?
  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
    . Y6 O2 c4 N2 a1 t  ?! Z名为bat
  • 目前比较常见 的批处理包含两类:
    ! K( p. E3 a8 G6 \# A% Q
    • DOS批处理和PS批处理。
    • PS批处理是基于强大的图片编辑软件
    • Photoshop的,用来批量处理图片的脚本;
    • 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
    • DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理9 v" h& F1 P$ N% @
  • 批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
    2 r0 _! S+ ^9 l( w& x# c6 `命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行
  • 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件

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

2 {9 }/ o. x; t1 u6 S1 Q% `
& G4 B; p5 q- f& Z- _Windows Batch 常用命令- Q( ?  Q" \& L* ~; s9 w  X# M) X
1 echo 和 @
) F: j0 ~4 w% C回显命令
. s& J) R- e, P( Q8 ~8 P7 _5 ~@  #关闭单行回显1 ~2 w  {: f! @5 a
echo off  #从下一行开始关闭回显
# ~; @9 ^: Z( M* V@echo off  #从本行开始关闭回显。一般批处理第一行都是这个4 r- W) \+ n# O8 y( d/ |7 @) n
echo on #从下一行开始打开回显# H+ B; ]7 y7 N) e
echo #显示当前是 echo off 状态还是 echo on 状态; O! |9 O1 k( ?0 C
echo. #输出一个”回车换行”,空白行
& F' D7 I+ j% D9 ]- q% t  T#(同echo, echo; echo+ echo[ echo] echo/ echo)
1 b1 h% g( X# G2 n( N4 L6 \$ c7 ?- p  {* _; X9 l
2 errorlevel) S- a+ J7 _4 H$ M- p
echo %errorlevel%
+ n4 p: k9 |. a( z; ?6 @1 t: @每个命令运行结束,可以用这个命令行格式查看返回码
) i1 e, m" n& C, ^默认值为0,一般命令执行出错会设 errorlevel 为1
9 @! R: A7 @8 D! [9 x8 }" Y* S& e& F, k7 p& O8 b* x1 `
3 dir
, v+ i* C3 u+ p6 M1 n显示文件夹内容
1 u. s6 H9 F% A6 L8 Xdir #显示当前目录中的文件和子目录
7 }) [' _) s0 d5 O; d9 {dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件' P( {% m& N! u2 m& ^' R' o
dir c: /a:d #显示 C 盘当前目录中的目录+ e/ X; n0 w* p
dir c: /a:-d #显示 C 盘根目录中的文件$ O. U, s% K  N/ b" g
dir c: /b/p #/b只显示文件名,/p分页显示0 A2 i- ?4 c: P$ Y
dir *.exe /s #显示当前目录和子目录里所有的.exe文件( Y  J2 E0 L" Z

3 H4 Z0 ^  L$ E7 o. s0 [: D4 cd4 P% w% ~1 F6 p0 G
切换目录  C% g0 [& Y5 E& D
cd #进入根目录( J7 c0 H# s$ |  e& n1 J, ^' K
cd #显示当前目录) }* d/ t5 \& x" N8 @7 z
cd /d d:sdk #可以同时更改盘符和目录
8 c0 R/ A6 {8 J1 r+ j. O" P3 j1 O9 X7 i0 B9 _' g# S3 s
5 md9 B2 ?6 m- y1 b3 r! L6 D# k
创建目录' y0 b, b* f2 Z2 m! A
md d:abc #如果 d:a 不存在,将会自动创建中级目录
3 S3 y. u  ^+ O* j: G#如果命令扩展名被停用,则需要键入 mkdir abc
) h  Y( U( w+ F9 k: R' M# }* i$ T( n8 i( G% l2 h) [
6 rd
" W' T$ D, _5 `. @删除目录- m- B  F. i8 Y" f  {; z
rd abc #删除当前目录里的 abc 子目录,要求为空目录$ p. e  d, J$ L) C; N
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
% J1 K1 A- \3 s$ S/ G3 @  b, I! K0 [- l
7 del& o3 e7 I0 A& I6 c
删除文件
) q* K4 V1 e( Ydel d:test.txt #删除指定文件,不能是隐藏、系统、只读文件) t8 \" s3 e2 M  D, \! g
del /q/a/f d:temp*.*
( e0 [& g' L, R6 @! `. F删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
5 {( u( g/ M6 c8 m+ ydel /q/a/f/s d:temp*.*& M' k  G; f% b$ M' u( d
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录/ X. x9 B# |" e

  i! w& k# }0 L3 g( V7 m8 ren( [- ]6 C; C9 v1 q; f: K6 W# ]
重命名命令) u; }5 s% @0 W
ren d:temp tmp #支持对文件夹的重命名
- P/ j8 W; f! h. L$ x5 B% s# p6 r) u
9 cls
) D  W4 A0 E& W2 M$ m7 D) i清屏
0 P3 X+ L3 `. W" i& q( M1 ^10 type, G" \% d$ \0 X0 J, }# N3 O" ]# g
显示文件内容
- g8 i) ^6 {' s  a: f( Y; ptype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
; q+ `/ `# Z0 F" `/ v* Z) }type *.txt #显示当前目录里所有.txt文件的内容" u( G8 E$ h4 ^& o1 b3 X; y
0 a) A+ k2 f2 y! D3 I. C
11 copy
/ s% a" n$ b' S0 V3 z拷贝文件4 G6 K- [+ P; s9 m% N9 b
copy c:test.txt d:test.bak
9 H2 Y, z# F' q- F: {( i复制 c:test.txt 文件到 d: ,并重命名为 test.bak
6 M' {% k% m, D* {# [3 |* Wcopy con test.txt( O! L* Y  p: ]1 m9 `
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
/ t) `/ J; E) W/ `# A9 L. ncon代表屏幕,prn代表打印机,nul代表空设备) I1 p  ?; K' f9 O& C
copy 1.txt + 2.txt 3.txt! F- u! K6 _  o& h5 C
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
, I. G& |" }4 A1 n6 ]6 i$ k如果不指定 3.txt ,则保存到 1.txt
7 V) }% }$ z/ d( {" dcopy test.txt +
$ i! ^1 X6 K( ?8 R复制文件到自己,实际上是修改了文件日期
( U# b9 R) H0 I2 S4 [
+ a: d4 f+ D( A" h12 title9 O( ^* Z+ F5 t0 U  {3 h$ _9 T8 B9 q
设置cmd窗口的标题8 @$ F. {2 @+ V% J  D* f
title 新标题 #可以看到cmd窗口的标题栏变了
" U. \2 Q/ I  |% b3 ^, Q2 T' L- l, x4 `
13 ver! J3 j" t% `$ ?$ P! [; [7 a' j& h  g
显示系统版本0 H+ B" N- [$ |6 T3 `7 L; y4 ^; n

' g) L9 T7 @: v1 C; b. T14 label 和 vol% ], p  C! h# {4 S
设置卷标
( _( V' V3 V7 X5 i& E- _( bvol #显示卷标9 Z( v( h0 q. e/ E# w3 o
label #显示卷标,同时提示输入新卷标# _& x; X0 n" I" m! O# M  e2 f5 \
label c:system #设置C盘的卷标为 system3 }7 Y1 p' C  E9 C& h0 q" ^+ k( n

  u  v! G- M  s- o2 ~% Q15 pause9 r# s; }  l1 [) X3 u
暂停命令+ t2 u5 R, d! _/ F/ T3 \3 K

! B. A7 m! t3 W16 rem 和 ::1 u/ {. @7 Y, G9 q4 x" z' }. T  N" v
注释命令
4 {" [) P, V! m* w/ d) Q8 `注释行不执行操作
5 P' L2 M( M; _5 _/ i; Y
5 l7 N5 |, V8 Y/ C, o+ C8 Q) C17 date 和 time
7 ~5 i3 a& T, R日期和时间
9 E# B$ V3 R/ B5 t) n/ E3 G" Xdate #显示当前日期,并提示输入新日期,按"回车"略过输入
) i% H( B6 {  l) m1 b) v: s( idate/t #只显示当前日期,不提示输入新日期' W) w6 G6 _8 n+ \' l2 M: k: o
time #显示当前时间,并提示输入新时间,按"回车"略过输入7 d# F" u! F1 }0 \
time/t #只显示当前时间,不提示输入新时间8 N. R/ _$ _7 v" P% |4 ^
8 \+ L, @/ n8 e- c) o3 t: ?
18 goto 和 :
* F& w' W2 I, s) K跳转命令* q0 D3 c3 d$ r+ A& }( X9 [' r
:label #行首为:表示该行是标签行,标签行不执行操作
9 D3 v) a+ u- j. I3 Fgoto label #跳转到指定的标签那一行
: J; l" P2 K0 m6 j( h/ n3 Y' i/ D; P9 E) N! `. s4 E% O7 S
19 find (外部命令)  P* q  I1 |3 H' }& y4 }+ X
查找命令6 V7 U2 g+ Q3 P9 o: x
find "abc" c:test.txt/ J) ^3 S/ @" p7 d! c: C
在 c:test.txt 文件里查找含 abc 字符串的行- `! Y0 Z5 w2 C' h* T( B2 s' ^# Q
如果找不到,将设 errorlevel 返回码为1
% Z* V* A% i/ d5 @9 m* ]% _8 bfind /i “abc” c:test.txt/ C8 {* R$ T3 ^$ q# d# h0 r8 E/ \0 Y8 g
查找含 abc 的行,忽略大小写! Z2 C9 H& X7 \/ ^: c
find /c "abc" c:test.txt
! j7 L; u. C. N& c3 x% G显示含 abc 的行的行数% u( F% ^2 R* `7 R- e

3 ]( O8 H1 v: O6 F" E20 more (外部命令)
! J* i, b' f: v/ ^( {( }; ^逐屏显示
; |4 U: M7 U' C7 o+ `" Y, }more c:test.txt #逐屏显示 c:test.txt 的文件内容
7 I& Q7 q1 Q& v1 X6 o& s$ C
, h! f, J0 x6 D( _) i3 D21 tree
, D8 w9 i; r5 l$ C/ j7 ~! K% l显示目录结构
- q. I' k9 S% p3 J% Vtree d: #显示D盘的文件目录结构5 w' x2 a' }9 c' `2 t

6 T* a4 W3 p1 |, G1 `: |22 &
1 p- r: }7 Q6 `" V/ o1 |顺序执行多条命令,而不管命令是否执行成功
6 C- y" X" F  |3 J" A# o, `' M7 `* ?. U2 a/ {$ |, e
23 &&
6 w8 G. E6 _( v: L; G0 [" j顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
9 I" t# [8 V' ~find "ok" c:test.txt && echo 成功8 N: `' W  E4 j6 c* l$ M
如果找到了"ok"字样,就显示"成功",找不到就不显示% w+ q6 {* j! V

9 `) u2 h% L8 W3 @3 S' d) E24 ||
) L' t0 F5 U3 n( l$ X顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令/ F$ g. r2 D9 m2 ~7 M
find "ok" c:test.txt || echo 不成功8 N5 D( t" u/ k+ `9 ]7 t& T) L3 w5 Z
如果找不到"ok"字样,就显示"不成功",找到了就不显示+ X; O: u2 Z& E* m1 `+ H8 `% y

5 v3 {8 B# I$ W3 A% ?$ v  ^! s  j# V25 |; _8 t2 |0 y. a8 c" u4 b( b) {
管道命令' D: t) j8 h; ~8 M, i
dir *.* /s/a | find /c ".exe"
+ J. L+ p# F8 q2 }管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令5 {- h% N" M5 M: D; o
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数* R7 B& ^! B& s% R& U- z5 T
type c:test.txt|more
+ ^/ R4 u( u0 Q' c这个和 more c:test.txt 的效果是一样的
5 ?$ A; B0 p+ o, A9 q
5 ^7 y* S- }6 f4 _. q26 > 和 >>
+ H2 @; N# F/ c6 s, t2 S. c输出重定向命令4 A* \  T' o8 S) `$ Y( l& R0 _
> 清除文件中原有的内容后再写入- t1 k8 d' o" S; [4 d& @
>> 追加内容到文件末尾,而不会清除原有的内容5 F  q- q- W1 ?7 f6 M
主要将本来显示在屏幕上的内容输出到指定文件中
1 Y1 p$ _% F6 N* u9 ^, Q7 ~/ m5 {9 e指定文件如果不存在,则自动生成该文件* W9 n6 u- X( a
type c:test.txt >prn) Y# ?- Z; }) |4 h2 T1 c
屏幕上不显示文件内容,转向输出到打印机# _+ u4 C( D' J: B8 s& V4 }  f
echo hello world>con
! V6 K$ g% `. {在屏幕上显示hello world,实际上所有输出都是默认 >con 的  r2 G/ x( L, s* t
copy c:test.txt f: >nul7 w  i0 i9 M8 M6 n" A' ^$ X
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
( v( S3 W! `( l- B$ F$ b7 O! Pcopy c:test.txt f: >nul 2>nul8 E' ?% t2 S4 i* U
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
! p  b' |* n3 @' c6 _/ g) kecho ^^W ^> ^W>c:test.txt
7 C2 s  U6 ]% c5 ]0 P生成的文件内容为 ^W > W" j) L- }6 G- q/ p% @
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号0 _. J' K! Q0 m2 U* Z

% _/ i5 V) t6 y& o  x27 <
' P" D+ a) S* ]. l  v4 n从文件中获得输入信息,而不是从屏幕上
! [( K7 @+ N8 Y5 r8 @一般用于 date time label 等需要等待输入的命令+ u+ A& X8 n( x% _! Y4 v3 \) \
@echo off
, i' m6 ]0 i1 \3 mecho 2005-05-01>temp.txt
4 E7 e/ {4 m! R- l8 L8 k1 idate <temp.txt% v5 Z- {2 j3 E  P% ?
del temp.txt
& {# d9 l, ?4 c. x8 e7 I这样就可以不等待输入直接修改当前日期
9 A, N# D" p  [# R# g" E3 j
* @( q8 E6 I- n2 A28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*$ {# w  _. A! M: A9 S$ c- O: {+ u
命令行传递给批处理的参数
- P1 U5 E; U0 Y' i# ]: S7 d* U%0 批处理文件本身  A2 @/ o$ Q9 L. ]  n/ e
%1 第一个参数+ Q7 q& Y, f8 [
%9 第九个参数  L( F# }3 \9 M# \! R
%* 从第一个参数开始的所有参数
3 p- [5 x+ a- s/ I. \批参数(%n)的替代已被增强。您可以使用以下语法:
$ \. i. T7 v9 [3 l" c8 K& H+ @% d$ N%~1 - 删除引号(" ), 扩充 %1
- A! l+ T' j: G0 C% x% Z%~f1 - 将 %1 扩充到一个完全合格的路径名0 h! j/ O( @1 j  a
%~d1 - 仅将 %1 扩充到一个驱动器号' J: U7 o. Q9 A; w6 f
%~p1 - 仅将 %1 扩充到一个路径
" \6 j, [9 T1 D% |%~n1 - 仅将 %1 扩充到一个文件名
3 n- i( m3 v% y# A2 {7 u: E$ H%~x1 - 仅将 %1 扩充到一个文件扩展名
6 ?5 L' i6 V3 k' {- c. g% A: g6 u%~s1 - 扩充的路径指含有短名' x# ?$ Y! E! O2 c
%~a1 - 将 %1 扩充到文件属性
! X7 e% N7 ?3 g5 L: \. k1 @%~t1 - 将 %1 扩充到文件的日期/时间
: o6 c) R" a( n! o! ~7 d%~z1 - 将 %1 扩充到文件的大小
1 r2 h: O% h5 E* p4 ~%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %16 w" t: w- a: ?( f, Q* t# O& `
扩充到找到的第一个完全合格的名称。如果环境2 Q$ z  I( k0 o! D' V3 k$ R7 Z
变量名未被定义,或者没有找到文件,此组合键会
1 T- L  v, W; o+ K3 w扩充到空字符串
' L# J# M. e. [: N$ x' q) i) g" d可以组合修定符来取得多重结果:) H4 ?& H  n1 |1 R3 {* S
%~dp1 - 只将 %1 扩展到驱动器号和路径
5 n% K4 Z/ V1 M( {1 W%~nx1 - 只将 %1 扩展到文件名和扩展名
% d+ @, w0 F. E$ ^%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
% H' P& J* t) b- C* s5 D' c: P: P! u并扩展到找到的第一个文件的驱动器号和路径。
9 c% L3 j' M# u%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。) n: ~* B9 z  u9 T3 |7 Z
可以参照 call/? 或 for/? 看出每个参数的含意
1 G) H" w  f0 c' qecho load "%%1" "%%2">c:test.txt
8 \5 s$ |& \2 k" n3 _生成的文件内容为 load "%1"  "%2"3 T- j. k& S9 u7 P
批处理文件里,用这个格式把命令行参数输出到文件
$ O8 D. z6 [7 {. A! I: D& r
2 f& \% j0 t+ B; y+ R, j. p3 T29 if
6 @( F+ b; q" s* |% N判断命令
' V8 d' i8 ~1 b. Cif "%1"=="/a" echo 第一个参数是/a
/ ~- e( v! U' @if /i "%1" equ "/a" echo 第一个参数是/a
( R/ x4 n& {/ X& H8 W3 M8 {8 `/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?1 m( K  M( w( g
if exist c:test.bat echo 存在c:test.bat文件
5 v; `! q7 M8 Kif not exist c:windows (
6 |% ~  d! t; W( |echo 不存在c:windows文件夹9 Q9 }, [- B5 F2 L; b( Z& F' t
)
8 R* C" {/ ?' r3 p9 k2 h7 t9 b0 H! jif exist c:test.bat (' p0 i$ o% B: P
echo 存在c:test.bat
4 x; m' c- x+ K7 e$ K5 v5 G) else (
9 e0 S( [, U  _( M2 m1 l8 Recho 不存在c:test.bat
/ G- X' z" H: U; q# h: n! v$ I- Y)
- m1 i6 R2 C5 N& z8 p30 setlocal 和 endlocal& k0 P6 e- d9 C1 O" P# @
设置”命令扩展名”和”延缓环境变量扩充”0 l: H6 p* N- K6 P
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"1 M" Z% o+ a7 P
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
! x$ ~! v* v3 z$ FSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
$ P6 z& E( m8 [SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"/ E' O) X! Y( Q+ N  l" O9 v1 C) V
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态
5 x7 j  U4 j* M' H  n5 e/ k" I5 a“命令扩展名”默认为启用
- W* \  _- ~0 W0 H“延缓环境变量扩充”默认为停用
6 n: C4 t1 }$ ?+ v批处理结束系统会自动恢复默认值5 a+ a0 \- ~3 z$ T9 U
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
+ ^3 D7 d2 S* ^0 |( U序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确$ M; X1 A% ]/ u6 T( K5 J, I
保程序能在其它系统上正确运行5 P& q, p3 Z; h7 K' p8 U8 D
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程- S: H! A' d: F% }3 p4 l
- F& C/ ^4 U8 t. f; K: D& p
31 set8 p# r( e; Y6 @" p
设置变量# v2 T! s& o. |$ b; ^- i
引用变量可在变量名前后加 % ,即 %变量名%. ]. ~0 u; x' M- Y1 j) z: z
set #显示目前所有可用的变量,包括系统变量和自定义的变量
0 c% _& J; q% e  mecho %SystemDrive% #显示系统盘盘符。系统变量可以直接引用9 F/ e5 x4 ?# g8 p5 [5 w
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=13 F% Z& B) q. u# w3 h
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb21 E; Z1 w$ f1 Y, c# X7 c
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2" a; K2 @' L3 V5 E
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
  V5 K. r/ \2 R. u' K- R: }echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2* @4 {4 n7 D9 Z! R" I
echo %p:~0,3% #显示前3个字符,即aa1
9 O8 R2 v$ H- X. x( q" e7 y3 E  n" fecho %p:~-2% #显示最后面的2个字符,即b2
. n& ~5 t/ R; Y, K. s8 L# a# C" Yecho %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
9 W: k, }/ i- e% l% s9 yecho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
; C; S4 |2 a8 e" vecho %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
$ Z2 L7 ]) n; k3 q7 c% secho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
+ M: V* B* C$ h, d4 K$ Wset p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
0 M+ E$ |+ L9 W* O9 uset /a p=39 #设置p为数值型变量,值为396 Z4 e1 O- V; T# F" b+ D+ K$ g
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
5 P. {5 t8 ]2 K3 V  a3 H& nset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
8 r6 n) D7 ^; E. n5 ?/ Gset /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?- G9 e8 k( B8 I5 P+ v  y3 b. }0 y
set p= #取消p变量1 Q' _8 k% c+ |, U& H' ~: b
set /p p=请输入
! ?. g4 k8 e. c; \0 x0 e屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
9 s+ J6 r2 G# F2 U+ l+ R4 s% C+ O注意这条可以用来取代 choice 命令
: O) D% V# g) d% A! ]  F6 v注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
! \2 e: b, h1 w8 U@echo off
, A5 F" ^6 L3 ?% yset p=aaa
( _4 v: c; D* Z7 }# A; C7 Z* tif %p%==aaa (
( x2 ]/ n% k7 @$ ]- iecho %p%
! x  [9 Y( J2 B- w  c- u  rset p=bbb
0 _. B% P- H, o, A: Zecho %p%
1 }/ @* V. f, o2 k2 S3 C, O; })0 A/ U! K/ c7 [+ }1 c* n, V3 O
结果将显示5 a: c- r9 P* j  J; C! j7 [
aaa. o' j3 \  `6 B+ w
aaa
8 b& N5 Y6 M, Y) K3 ^) r4 i5 j因为在读取 if 语句时已经将所有 %p% 替换为aaa
6 C& O* ^9 w8 q# u7 C. @# I# ]8 f这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
  O9 ^8 J1 b6 I) z6 L可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
9 T# _9 y/ L$ L4 g$ q' s% U@echo off- W: r) f5 N4 Y
SETLOCAL ENABLEDELAYEDEXPANSION; }: G& L6 R+ D) G
set p=aaa
& N  x- P2 L% Q6 d# ~4 `4 K  p5 O# Kif %p%==aaa (8 U; n$ n8 k  B1 V: e
echo %p%( B' ^$ m# Z/ T8 w1 H
set p=bbb
# {) X$ j5 F+ @% P1 e  J7 @& wecho !p!$ z* G" F4 Z$ w* ?8 j( a
)
3 a$ C, ]$ c! F8 o" j; ^. L% KENDLOCAL  V# y8 }* S" C
结果将显示
" e, y8 K: b$ J  U) f- u0 N" K2 s# ?aaa
" a9 O! |8 D. D5 L5 J2 U/ ~9 Zbbb4 w+ a7 X* u4 k, Q. @  q+ Z: B
还有几个动态变量,运行 set 看不到
- i7 i- P9 Q( A7 D2 Q%CD% #代表当前目录的字符串2 }4 `2 o" Z) l
%DATE% #当前日期% u; x% C0 @: k) h! m: P. ~
%TIME% #当前时间! r2 p6 B  _6 b. @
%RANDOM% #随机整数,介于0~32767# R$ L) l  K8 k/ D8 d5 i3 I
%ERRORLEVEL% #当前 ERRORLEVEL 值1 h3 c7 N/ N2 c
%CMDEXTVERSION% #当前命令处理器扩展名版本号
- |# {" T' \) S( e- |%CMDCMDLINE% #调用命令处理器的原始命令行
6 D$ P% k9 ]. `; F; i0 q5 o可以用echo命令查看每个变量值,如 echo %time%: p+ k! a. D2 k' S- ?* F; A8 V
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
/ f' T( p3 G/ A3 f- s# C1 d& V' ?/ Z! H6 P1 n& s
32 start
, e1 \/ D7 c* g( q批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令+ J1 M# B) ~. s5 O8 ]# f( U

/ ?* T1 P5 J8 y2 d* {. Y& T33 call0 t2 R( {/ {, N: x2 N+ b1 v
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
0 p8 j0 [% z4 l. c+ h有时有的应用程序用start调用出错的,也可以call调用4 P6 n+ Y( g3 ]3 s, |4 y
. s0 Q" u2 {7 X& m# Y2 q' e
34 choice (外部命令)$ N8 _6 G0 k6 u' z% Y, C' Z" d
选择命令4 X6 C8 `. Z2 d/ c
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
% A4 [) L3 s* u" hwin98里是choice.com
" K& I9 h/ W5 }8 ?win2000pro里没有,可以从win98里拷过来3 T; I) K- ^$ }+ j1 r$ Z; M
win2003里是choice.exe
; l$ z4 z6 y4 G. O# l6 Pchoice /N /C y /T 5 /D y>nul/ w6 L( x7 _+ X: \' J" B4 u0 [- n
延时5秒" G1 M, v$ ]! v1 U" }
/ `" D; `% L- m7 g5 z0 P  y7 V0 Z
35 assoc 和 ftype
  Q# ]2 @. L7 I) c( I6 p文件关联
3 R" l2 p6 R; z8 N# x* G- Hassoc 设置'文件扩展名'关联,关联到'文件类型'$ p) ^6 L1 Z, _( b' S. F( A( S  b7 O
ftype 设置'文件类型'关联,关联到'执行程序和参数'3 A" q- {. A% B6 Q9 n' L
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开& T% u) d; Q/ y6 g4 }
而是先判断.txt属于 txtfile '文件类型'6 }! o; ^' C9 I5 D  C
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1! w+ o: b6 a- A- Y& D9 n
可以在"文件夹选项"→"文件类型"里修改这2种关联) Z5 X5 v9 e6 f
assoc #显示所有'文件扩展名'关联+ f& J  i, |4 M+ ~) e; o' C+ [8 f
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile7 P6 }4 E0 M& ?: e  g
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8& P* ~8 B' v* L+ j
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile2 A$ J1 C. ^4 H% v6 D/ d
ftype #显示所有'文件类型'关联5 U, s2 J$ G1 C) k6 e: E
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*+ \. ~+ Y8 G# k" x% K8 N
assoc .txt=Word.Document.8
9 o# ?! X; h9 B( K设置.txt为word类型的文档,可以看到.txt文件的图标都变了2 n. l0 |6 }  J' d/ K
assoc .txt=txtfile& }: D3 c1 g1 ^' D% n/ D2 Y
恢复.txt的正确关联2 G3 A6 h- f+ X, z4 E+ w; n5 [" m
ftype exefile="%1" %*
/ t$ M4 |/ h8 x( ~, Y恢复 exefile 的正确关联
1 w. z6 x; Q7 C1 ]9 [1 R如果该关联已经被破坏,可以运行 command.com ,再输入这条命令/ \6 @7 I1 W' _1 V5 R
1 p. U& h% ^5 s5 ]
36 pushd 和 popd( {1 Z) e4 h! I# J9 h9 }8 L5 M+ z
切换当前目录
5 f% P: B5 ^* [: g1 R& Q) i@echo off& b6 _. N0 l# j, m
c: & cd & md mp3 #在 C: 建立 mp3 文件夹
; V. Q. Y0 w. i3 mmd d:mp4 #在 D: 建立 mp4 文件夹
* d2 T7 i( C% b4 i9 R3 {' C( Fcd /d d:mp4 #更改当前目录为 d:mp4
  ]! w, i6 \5 `3 \& Bpushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3% W, j. h* z& Y6 r; @
popd #恢复当前目录为刚才保存的 d:mp4: N$ o* l7 S5 Y5 F* \  r

% ]  j& w7 I, u; l. Y; o9 D37 for+ b& i  R2 D, e9 U$ J. h; `! E+ e
循环命令
+ ^' P4 m3 A( ~9 W' A$ u这个比较复杂,请对照 for/? 来看! Y# y$ u+ ]) w  ?& O1 ^
for %%i in (c: d: e: f do echo %%i% K5 b0 P& V2 c. G# A4 {9 R0 \
依次调用小括号里的每个字符串,执行 do 后面的命令
: Z" l4 {* ^& f$ ]. V注意%%i,在批处理中 for 语句调用参数用2个%
8 K* C; e( @) C* s默认的字符串分隔符是"空格键","Tab键","回车键"9 W) ?, t2 M& l4 h' u
for %%i in (*.txt) do find "abc" %%i
& E! B/ D3 N: P' M2 |# G5 O7 _对当前目录里所有的txt文件执行 find 命令. I; p" G$ N+ \2 v- w
for /r . %%i in (*.txt) do find "abc" %%i
, A: d; P& Y# O6 ~4 f在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行- a- m- t+ p3 ~( A6 ^2 `
for /r . %%i in (.) do echo %%~pni
9 I4 x' j$ _1 y; D5 O# \0 B& B显示当前目录名和所有子目录名,包括路径,不包括盘符
# c* b% e/ i4 E  g7 Gfor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
8 u4 D, x$ x8 z+ l0 F9 J把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
. f/ o/ S  P& Dfor /l %%i in (2,1,8) do echo %%i1 N% c1 F+ r% k- i6 M
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加11 ]7 T! b6 z$ P0 k* l9 ~
for /f %%i in ('set') do echo %%i1 u9 z: A1 C: Y+ i
对 set 命令的输出结果循环调用,每行一个) d0 k% O& f! s7 e% J
for /f "eol=P" %%i in ('set') do echo %%i
1 x) C* t7 c- Q; G取 set 命令的输出结果,忽略以 P 开头的那几行0 {  J: v) ]9 C3 g) B# _/ _9 |' _
for /f %%i in (d:mp3.txt) do echo %%i/ l4 @; |2 `$ ~
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称% m# h+ k% J3 A  V* c
for /f "delims=" %%i in (d:mp3.txt) do echo %%i
2 g7 E( V: k9 L% k" D& {显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称6 l' s4 i4 Z* \& [; H3 {, H, A
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a6 n' N+ s+ Q, Q4 G+ f; z# x
对 dir 命令的结果,跳过前面5行,余下的每行取第4列
  y7 p% |+ J8 Q. P( W每列之间的分隔符为默认的"空格"
7 q5 l) o9 s: m* x5 }6 R  E可以注意到 dir 命令输出的前5行是没有文件名的+ r+ t9 N4 \  S1 r; X0 d
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
& g2 c7 _! w! d- Z5 N' techo %%a  C: _7 [; t' N  x5 y3 B
echo %%b9 ~; \# [" k8 m0 ~$ }, L" {
echo %%c2 j* ?# s3 M3 c) M/ a  V
)
! i6 |# l1 M6 X5 ?; H对 date /t 的输出结果,每行取1、2、3列+ \& @* h$ D# ]
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列# y; y9 _8 m/ {5 }6 _) v1 E
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"9 s! f" r' [- p
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
6 y  M' K! R/ x! K5 n1 i0 Q* a" wfor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
2 \1 V  L8 Z/ R# B) U! m  f9 p  w取第2列给 %%a ,其后的列都给 %%b2 ]2 k5 e1 n% T- A: V* ]3 g- |0 s

4 C& b' y+ e& f% u' {& j+ F* H38 subst (外部命令)
! _' [8 p+ a* C+ }( ~/ E7 p映射磁盘。2 V+ [) V" w2 f& I4 C- a
subst z: serverd #这样输入z:就可以访问serverd了
8 q1 \" U4 Y5 {4 D0 E& Dsubst z: /d #取消该映射
# P' r( V( u* d4 l9 J) ^2 Z& Wsubst #显示目前所有的映时3 D! d1 V1 U( C- R: ]

* o- ]. H, Q: A) Y1 Q( U39 xcopy (外部命令)
$ c2 a0 F( U9 m. x/ D文件拷贝
6 }) c, ]5 U' K8 E1 G( a  Sxcopy d:mp3 e:mp3 /s/e/i/y
5 K6 @4 s+ s) s" `6 M' F. m复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件, V% u' R7 }. h' d
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
3 x( `& @" c# I5 L! m4 m  r+ M; S% ]) l
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
    ! j) p  Y1 K8 Z8 ?! w7 q
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:
      ( b1 T4 G' R6 a

    ' P  z8 M" t+ Q7 j( H
@echo off
. ]* j. a+ y. j% V% r; G6 y# v$ `set p=aaa, c3 t1 P& \$ Y; p4 n+ v7 W
if %p%==aaa (' z! N5 a( X1 V1 \$ ?/ Q
echo %p%1 m2 u' G0 Y* C
set p=bbb: \( T0 c1 \$ ~/ i6 f9 j9 w
echo %p%
: q" c) p2 _6 x)
: p/ S4 w0 B/ A' U3 dpause
  • 截图:
    9 d) H% @; y, K5 H+ f
  • 2.批处理.bat 文件中输出中文乱码

    ; l" Y7 t6 b/ w5 @
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:
      2 S! ^& |. K7 \5 [- }
    • 效果截图:
      * |2 R: y( q! Q, h7 H
      # \( o7 t& G' h3 o
    3 s4 J# C- ^  C# @: a6 w& Z8 `

# t# v! i3 \+ {/ I2 e; M

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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