扫一扫,微信登陆

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

搜索
查看: 1438|回复: 0

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

[复制链接]

307

主题

335

帖子

1893

积分

管理员

Rank: 9Rank: 9Rank: 9

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

    ' k. i3 j1 }/ K$ x
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?

! o- @- F# ?: ~2 D0 N" h% b) c% M1 l! O/ Z) N$ l1 ]) {
Windows Batch 常用命令
, S2 \+ ?# X% i- C( u1 echo 和 @
5 E2 D+ o/ O# u6 j4 g9 K/ \回显命令2 W/ O9 E- x" A  O
@  #关闭单行回显3 U4 i7 h- Y- z8 G
echo off  #从下一行开始关闭回显
' v8 T0 B3 z& j7 Y2 Q@echo off  #从本行开始关闭回显。一般批处理第一行都是这个9 ?" t/ q+ g1 u3 u8 f" ~
echo on #从下一行开始打开回显
7 z& x. W" p) y3 c6 Xecho #显示当前是 echo off 状态还是 echo on 状态
4 l% `8 h' C/ R) _' Jecho. #输出一个”回车换行”,空白行! {# G) K1 E- z6 y4 A
#(同echo, echo; echo+ echo[ echo] echo/ echo), ~, |* v3 J6 V" S& O

2 }. h' [# B/ V# C2 errorlevel1 O6 Q3 y/ B3 D
echo %errorlevel%; K% |: s9 N+ }( G
每个命令运行结束,可以用这个命令行格式查看返回码6 X3 H' k4 O2 d% s
默认值为0,一般命令执行出错会设 errorlevel 为1# L. L+ V! _; H  m

- j* O6 h8 f) p8 x+ L- p( I, l3 dir
$ Z' d3 ^. {! H' o显示文件夹内容" i$ Q* X8 |1 Z) R
dir #显示当前目录中的文件和子目录
8 g* O: k: J# O. g' Edir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件; P( ^0 `0 Y6 y
dir c: /a:d #显示 C 盘当前目录中的目录
; P' i$ e, e, @+ Z; `; S' k" odir c: /a:-d #显示 C 盘根目录中的文件4 P3 k! T/ N$ d" s8 X; a' U
dir c: /b/p #/b只显示文件名,/p分页显示
3 H% [5 b0 T" E' jdir *.exe /s #显示当前目录和子目录里所有的.exe文件0 B, j2 U8 o7 ?9 V: ]. t2 H( s
& z5 m* q; Y- b* n* Y) B( B2 V7 D8 Y
4 cd; x+ e0 ?* p, E
切换目录9 G+ k6 D) U% D* v( o$ m
cd #进入根目录
* R3 H& `" H, t/ U1 hcd #显示当前目录, f! B# `& w4 ]8 [4 j) q( ^
cd /d d:sdk #可以同时更改盘符和目录
, b8 X+ ~# T2 k2 p1 u% h9 N
$ }, C$ H( Q3 g6 C3 {; d( I# u5 md
* q: J. S/ V# S; j6 v7 b8 ]6 f创建目录
: L5 H. K# Z( V! U) c% o; Ymd d:abc #如果 d:a 不存在,将会自动创建中级目录$ b  b* V* \2 {. J+ Q9 Y
#如果命令扩展名被停用,则需要键入 mkdir abc0 j7 c4 t6 t( T8 \
& ?3 J' `1 t. N6 Z4 Y( W8 {6 W8 R
6 rd
7 Y% l. \8 {( H7 R- S删除目录
$ H" `5 R. {: h- c* V) ard abc #删除当前目录里的 abc 子目录,要求为空目录
3 ^" ]) v+ x4 a+ ard /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式: m' ?" `' w, Q& l- W3 V+ T4 G
6 R! L* M: y" M
7 del
6 N0 |4 N: |7 U删除文件' [; ~/ H+ T6 m
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件3 m* @$ ^; o" A: q+ |% D3 R( }
del /q/a/f d:temp*.*: _; g( j% M% ^2 k. J; j
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录; ], q$ j' @' ~( ~/ g8 c' T+ y
del /q/a/f/s d:temp*.*
9 P+ g4 X) j, M' _1 ^删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
- p4 r# M3 @$ z* }% h+ L3 N# ^! D0 g1 c. b: u' `! K  m: x
8 ren
# O& z; k# F+ W' A重命名命令9 G$ O7 [$ U1 ]- P' M4 O9 I
ren d:temp tmp #支持对文件夹的重命名
  |- s3 u, I1 `% r/ u( \- k5 f% t% E& e
9 cls3 Z7 k  ~  o$ _0 W" f7 A
清屏
5 h. E* [* L# M9 Q4 m10 type- m) f: u! h: v& A! H* _: |
显示文件内容
; b- |' W& _4 N* R' D" ]2 ^2 Mtype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
. f# {, f1 ?8 _type *.txt #显示当前目录里所有.txt文件的内容9 b! G! w  }/ h7 W
* S/ g: B* M3 H
11 copy8 T7 a# J& b2 O8 v0 H
拷贝文件) E6 O: G0 j2 J+ B  s
copy c:test.txt d:test.bak' x1 o2 K" \  G1 X. ^; t+ `  O
复制 c:test.txt 文件到 d: ,并重命名为 test.bak
" O# [& }; ~) F: t0 _6 c9 h" Ncopy con test.txt" |+ H3 i; b% i& L( t
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件( Y/ a. W& u+ I4 k5 t0 h
con代表屏幕,prn代表打印机,nul代表空设备+ g+ Z* ~% s7 U3 Z$ [! D% o  N. N6 G
copy 1.txt + 2.txt 3.txt- ~& H5 p( _$ K: D/ X3 v5 G
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件1 f$ l7 F; u# V9 _( z
如果不指定 3.txt ,则保存到 1.txt' i3 f$ V! T; p7 J9 S9 y: K. G
copy test.txt +9 h2 z1 }% m+ O% j* f. y- ?. X+ o
复制文件到自己,实际上是修改了文件日期- S1 X7 p8 h- t: n" H) d( e9 ^9 z( ^

* @: y1 {- E$ ^. g8 ?0 u( T6 T2 F12 title0 B/ E2 \+ w% `% E8 |
设置cmd窗口的标题
& `2 i, r" f4 J* M6 xtitle 新标题 #可以看到cmd窗口的标题栏变了
9 \8 }) v% j/ S( ?0 u) o) K: I, _% V3 a
13 ver# _8 k% h/ w# ]. |( w
显示系统版本
+ q3 n+ v% u3 l3 M$ j& L4 ]' `+ ~# T- `- f; I; m8 {- M
14 label 和 vol
# M* \$ L3 e# |6 ^6 Y4 k设置卷标
! I" c3 ^3 c( `; x+ hvol #显示卷标
' Z' n( b: l. M. @label #显示卷标,同时提示输入新卷标
. a9 {( `. |# V$ a  V- Q8 l8 [label c:system #设置C盘的卷标为 system" g$ w4 {* e$ P7 c8 I& a
' H; p, E7 {! F5 a. W0 Z
15 pause
5 `+ o0 I8 P+ H" \6 s暂停命令
/ @7 l& b' A, H6 k) w8 J6 \
$ R+ k* e# p: }; D/ b+ Q, }16 rem 和 ::
# ?/ B  n, R! q* e! h: d2 `8 a注释命令$ t( T/ `+ b9 A/ z
注释行不执行操作' e8 Y5 H1 x/ d1 C) U

+ V) J- W' G( ?0 r17 date 和 time
5 V0 `8 a- b/ {3 [+ t0 [$ u5 X7 w. d日期和时间
7 O/ \8 [1 J  D( X% s1 qdate #显示当前日期,并提示输入新日期,按"回车"略过输入9 t; @, L' [  w( `7 m
date/t #只显示当前日期,不提示输入新日期* v& ~. s9 o6 m; \; s4 O
time #显示当前时间,并提示输入新时间,按"回车"略过输入$ _  s# U. R7 M" \3 y, z
time/t #只显示当前时间,不提示输入新时间7 g  b! A7 B% y: {

, m2 e5 _' a! q/ Z% ?! U  J1 W18 goto 和 :
2 B+ D4 u' ?6 A3 N: e* \+ K0 e4 [跳转命令
8 w. F) R2 Z6 m- N6 U) L:label #行首为:表示该行是标签行,标签行不执行操作
5 K# h# P7 j9 _) Igoto label #跳转到指定的标签那一行
9 l9 O* p: l. I- a- ?: `  W# \5 c1 \, G3 ?3 \) n
19 find (外部命令). i7 H+ u8 U. a8 d) r" v/ v
查找命令
6 L8 c- ~' Y$ M6 t, z' g2 K1 Jfind "abc" c:test.txt6 x! D' [0 |" |: a
在 c:test.txt 文件里查找含 abc 字符串的行
. ~8 R0 w0 x# b2 x% U9 {如果找不到,将设 errorlevel 返回码为1& K& k" k& S7 [$ P, X+ H
find /i “abc” c:test.txt. V4 M1 z( v% W  @) M: P1 C  x! I
查找含 abc 的行,忽略大小写- V5 F/ q' ]! r0 K4 ~, J6 g; n
find /c "abc" c:test.txt
5 l; u1 y& S, u6 D  g0 p2 N" M) n显示含 abc 的行的行数2 a) B& B3 i+ A9 c: v
% g/ V" C) H+ j4 b7 F
20 more (外部命令)
) p( f* A# c# S& f2 ]5 f逐屏显示( G8 i; w1 r  ~' i) w* c
more c:test.txt #逐屏显示 c:test.txt 的文件内容( C: c- a" y: A3 w+ m5 U

: T7 y& v7 n4 ^3 ^$ g21 tree
9 ?6 A4 m0 ?. R$ W0 v显示目录结构, k* l0 ]7 S2 t( ~7 j
tree d: #显示D盘的文件目录结构
$ H  V3 f0 Z& _% i2 r4 {5 d+ s' J% u7 Y1 j- C6 c9 J% G7 G
22 &
4 X1 P, w7 o+ L# G" a/ k顺序执行多条命令,而不管命令是否执行成功
4 V  i6 u/ U- _6 i5 B) a
8 t: `( l& Z1 _3 Q- b23 &&$ M: o# ?- \5 @% c6 g0 @! Z
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令, B) J" Z; K  n9 X2 X5 m0 ~2 u
find "ok" c:test.txt && echo 成功
6 e- B- C0 p# J" F; k如果找到了"ok"字样,就显示"成功",找不到就不显示- A$ E3 U6 M6 z# {# v

  f2 N" I( i! M) [; K& i  g24 ||
/ R( ]& _6 d" ^4 e6 ^0 ]' N顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令; s' F$ |5 Q2 ^
find "ok" c:test.txt || echo 不成功
+ y3 i! H) Q5 O4 ]如果找不到"ok"字样,就显示"不成功",找到了就不显示
% D* n# i* c! V7 b' o/ b3 v3 |0 C/ W6 O- ~  [! A0 I- j
25 |4 W( f' ?% H( r& D4 {, [+ q
管道命令9 U# s9 t3 p% C3 z! W5 j
dir *.* /s/a | find /c ".exe"! }) H% Z. w# T7 R& C
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
8 O' r0 k9 v8 h/ c( p该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数. W+ N. U4 P+ V5 y; E4 N
type c:test.txt|more# f$ C1 J8 a; n) q; y9 @; u$ X- b' E
这个和 more c:test.txt 的效果是一样的/ ?" Y% a7 R6 j! [
% ^& z. f1 j* z( Q$ D( U1 g
26 > 和 >>8 f9 d5 \6 ^3 ?) h2 _/ e
输出重定向命令
, V$ ~4 J3 f0 k1 @. h5 F> 清除文件中原有的内容后再写入
( J6 y# m' K+ k, I5 X1 M>> 追加内容到文件末尾,而不会清除原有的内容9 Y" S& V' Z7 {; O! x% r
主要将本来显示在屏幕上的内容输出到指定文件中
& W9 e8 _' Z" E( H; X指定文件如果不存在,则自动生成该文件
% u5 ~5 P9 H. t% e* |! m* N$ Rtype c:test.txt >prn  N8 V+ ^7 C4 [2 c+ k
屏幕上不显示文件内容,转向输出到打印机0 F3 M* [1 C# C0 F5 S
echo hello world>con/ T4 F; D8 f' }- O2 {
在屏幕上显示hello world,实际上所有输出都是默认 >con 的1 p0 \- C! P* g
copy c:test.txt f: >nul6 H% `! [' P/ C5 ?% [4 e* D
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息. E' K* G+ @  j7 T9 j4 w
copy c:test.txt f: >nul 2>nul
  X* F0 D: u, Y: G  I* U不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
2 i$ b2 t0 y! o) [% [: b6 Mecho ^^W ^> ^W>c:test.txt
- \' u2 ~' ~' e8 F- O$ u6 ~生成的文件内容为 ^W > W* e3 j5 H% j/ R# ~' y$ X
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号& V4 \+ d1 U- ]1 G/ v
- V4 o. k" H0 q& }
27 <
6 c: t3 t  C+ R从文件中获得输入信息,而不是从屏幕上4 I7 S" s3 {' o
一般用于 date time label 等需要等待输入的命令1 E) C! P- D1 k: M/ a' s- c7 b$ \( n
@echo off$ r. C1 H! C& d& p6 Q
echo 2005-05-01>temp.txt$ C4 O) C1 {$ [$ a7 G
date <temp.txt
) q& X6 n6 o  x9 pdel temp.txt
4 G4 ?! a8 h0 Z6 u* J" l- s* |这样就可以不等待输入直接修改当前日期3 q* p8 @5 G! _6 C- i

, v' s. f! o+ {1 `& Y4 i1 G, F28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
9 o9 B) v6 t6 ^9 L3 @  R8 s. X" a命令行传递给批处理的参数
, C7 a$ I" }( e+ d5 R, y%0 批处理文件本身. N' K! i( n$ O6 a
%1 第一个参数
! k7 V- ?' p4 E* U) w( D%9 第九个参数
& M5 d& f+ D; `8 b7 F. j  n%* 从第一个参数开始的所有参数
; P! e6 X5 V9 S/ |% `) y批参数(%n)的替代已被增强。您可以使用以下语法:& b5 T  F3 z' J) t0 R& v
%~1 - 删除引号(" ), 扩充 %1
) x( c' k! U1 T3 ^# `& s( |2 g%~f1 - 将 %1 扩充到一个完全合格的路径名
& b3 Q* d. P. r' f  S%~d1 - 仅将 %1 扩充到一个驱动器号4 [6 H! n- t( R3 l
%~p1 - 仅将 %1 扩充到一个路径
. {; B" ~* o- y1 z; E$ G4 [%~n1 - 仅将 %1 扩充到一个文件名' c0 Z0 g" f+ H$ G
%~x1 - 仅将 %1 扩充到一个文件扩展名/ @2 V$ l( [" v9 ^0 |( D
%~s1 - 扩充的路径指含有短名
, F. c8 r& b+ p. D2 E5 [%~a1 - 将 %1 扩充到文件属性
& C1 k- L/ L0 }4 F6 s%~t1 - 将 %1 扩充到文件的日期/时间
/ P& g& v: Z$ r0 f2 K%~z1 - 将 %1 扩充到文件的大小+ G& E6 y9 x9 d9 B4 c5 U
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
) S' A1 T: r% K扩充到找到的第一个完全合格的名称。如果环境
6 }8 B% ?$ O" }变量名未被定义,或者没有找到文件,此组合键会
& [: `) @" B0 q, O' z扩充到空字符串+ G( H9 f7 d' Z. B
可以组合修定符来取得多重结果:! E1 K' e7 B2 [
%~dp1 - 只将 %1 扩展到驱动器号和路径  v9 v! a2 m, h6 S1 m! g
%~nx1 - 只将 %1 扩展到文件名和扩展名
' w0 s5 _; H; F%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,6 Q4 ]) l$ C9 @& s+ w
并扩展到找到的第一个文件的驱动器号和路径。/ v9 p7 B3 Y/ I% `4 `7 W
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。1 x/ K# b* H% I. f- g
可以参照 call/? 或 for/? 看出每个参数的含意
& ^) ^" N* V" O( F. E5 wecho load "%%1" "%%2">c:test.txt& v' V6 L. b  g$ d
生成的文件内容为 load "%1"  "%2"; G$ @, z4 ?/ ]5 Y8 \3 r2 `- A
批处理文件里,用这个格式把命令行参数输出到文件
  Z5 F1 M& F1 v' U) u( ^" `; n* p% N2 v8 N2 A4 i
29 if
7 g) U0 Z1 u! n$ D, l3 @& v, r判断命令
, r$ a7 ]; i4 Q5 p# e0 Dif "%1"=="/a" echo 第一个参数是/a
0 I. y1 E& B1 W- t; i, Jif /i "%1" equ "/a" echo 第一个参数是/a
/ K$ C  `6 a/ \- p  _/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?1 i( C( o$ _# l
if exist c:test.bat echo 存在c:test.bat文件
  s4 S  P- r1 K+ P" k& vif not exist c:windows (6 e) m- C) l% l. K% w. C
echo 不存在c:windows文件夹' [, g, T6 S8 d/ Z& I, B, k
)
! s' q/ X! ?* vif exist c:test.bat (% c* [1 ~: I6 g0 `+ s* l
echo 存在c:test.bat
8 A9 r: s; C1 f! ?7 ?9 d. G) else (
! O; z7 _5 m7 s7 ^" T1 wecho 不存在c:test.bat
  q( b' O, G: n4 F$ e6 a0 U8 g)" L0 I, p2 L' u& p! l
30 setlocal 和 endlocal
: i/ d: t- ^; P设置”命令扩展名”和”延缓环境变量扩充”
. c! B: J: f. D  h& ^) Y, ^SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
5 w9 @4 i- o( V" v5 @0 B; dSETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
8 f4 w+ \9 v* JSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
: N! T# Y2 L3 E( _& `( h& V! }' YSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"% ^, y: i6 Q  b
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态
' ~' u7 K" w. b- ]' G“命令扩展名”默认为启用$ x% V$ l$ m9 D& C! t2 i
“延缓环境变量扩充”默认为停用) i$ y8 }9 b: d! q0 u7 a6 Y
批处理结束系统会自动恢复默认值$ Z7 o: Z2 i  ~5 H# V$ g& J
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程; e2 N0 H+ g  Q9 g% {/ F3 p
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确. v4 ?- F9 F/ s- C
保程序能在其它系统上正确运行
; |; E) ~: I0 B+ L"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
# `+ U* l- h4 X/ Q- n3 F( Y: E/ p3 l0 P3 t
31 set
+ W. ]* l" X0 j0 j  ]/ n设置变量5 S6 c" w. p/ e) D% ?
引用变量可在变量名前后加 % ,即 %变量名%! F4 t, N9 H% q! r. G$ m
set #显示目前所有可用的变量,包括系统变量和自定义的变量7 M6 _# u5 M9 _! a
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用: s# `6 L, {& y7 i  O
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
9 P' Z8 Z+ ^  d; q/ j7 u, Bset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb28 O) g2 k4 a" [. O, g# D, y" V
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2& q) P- w4 u" O4 p1 Y/ ]
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
6 K7 J7 N) B- m1 K) D; f6 j( |7 z# ~echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2' i7 I# |2 d7 B1 S
echo %p:~0,3% #显示前3个字符,即aa1
3 F+ x& f- p. p1 M6 a' E% _echo %p:~-2% #显示最后面的2个字符,即b2$ ]+ N5 o( p" P' U2 y& u2 D
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
4 W( [9 W+ Z9 B, M  }echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2' }8 y' {* V* n' ~& F
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
0 @2 v! X+ w/ w" A4 e, uecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
% I/ y6 u, T5 a- E) V1 Oset p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb20 B/ v; T5 `' {4 I6 |/ \
set /a p=39 #设置p为数值型变量,值为39
5 Z1 p1 P3 R3 y8 T+ Rset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=35 C0 ]+ ?' I8 ]: ~/ T
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
. F" Q% E* ^7 C. fset /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?3 I; N3 \5 S! K/ [/ `' R7 _
set p= #取消p变量
  o! m) D& C; o  S  D" [# kset /p p=请输入$ J) X- U! K1 r: m- @+ s3 B
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p: Z: W3 V# L7 N. L* f; N; R* m
注意这条可以用来取代 choice 命令8 l" Q" U9 a. c! ~
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如8 E* a& F9 K" a# t  Z1 S
@echo off1 h* n+ k4 j1 B; f' c4 Y2 O( p
set p=aaa: K& d' U/ Z4 i0 ^0 Q9 ~" f
if %p%==aaa (: S, w+ U) r6 M! I5 D; \  j( {
echo %p%
4 f' P; b9 o- |2 Y1 t' L$ aset p=bbb
" ~( c; z0 L9 D0 d5 }, X% R3 Gecho %p%. O9 r. R( v7 {4 I
)% }( C9 E3 N5 X7 J/ m
结果将显示- R2 }' X7 r5 L; {8 V
aaa8 R; ~( ~5 q+ Q) ~
aaa
& D) [0 t+ ~* x  _5 K, L$ p1 Q因为在读取 if 语句时已经将所有 %p% 替换为aaa
& m. |3 R( r/ l1 e8 X( \这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"* N& N# y( y" O3 J
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!, J- k$ F+ q# T
@echo off
+ n. l3 X& ?2 s' b: a5 M! S7 ESETLOCAL ENABLEDELAYEDEXPANSION
: V' ?- _: N/ O0 \. s# i7 {set p=aaa
$ T+ Z" g- J) L' c  gif %p%==aaa (
' ~/ M# h( h- K2 R. B2 fecho %p%( \! Z( Z/ W4 ~4 [+ Q. c, P
set p=bbb& \5 D) h  ~. l/ L0 L" i/ B
echo !p!
- s  a1 B! _. B); l3 D6 r" `# Q6 ?# Z' t/ D) R
ENDLOCAL
/ z+ D6 y' E) S结果将显示
- i* e+ u. p  ]# v0 Q( _3 paaa# U3 f1 L5 ]2 b3 q7 D0 m
bbb  l5 K0 b4 ^" `% V7 V- \
还有几个动态变量,运行 set 看不到+ K7 q  l" k$ [/ Y) `6 H
%CD% #代表当前目录的字符串
1 _/ A" ^4 _( q%DATE% #当前日期
& B: ]  z8 v# b0 t& [%TIME% #当前时间
1 A  Y* O" o! {, S4 ~0 h& M1 E%RANDOM% #随机整数,介于0~32767
* c# x0 o, {* R%ERRORLEVEL% #当前 ERRORLEVEL 值/ B( ^  A6 |- e  Q8 N1 V
%CMDEXTVERSION% #当前命令处理器扩展名版本号: ^+ g. {! V& P
%CMDCMDLINE% #调用命令处理器的原始命令行
" z& x0 _, ~# s# V0 @+ I8 Q3 S可以用echo命令查看每个变量值,如 echo %time%0 i& `: w, o" g0 U
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到# z% l! D* M- t& i
( e/ Z2 g0 Y) |: b7 K% \
32 start4 E4 L# M5 T- N$ H5 r& t/ S
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
( e6 p$ a9 L& R* g6 H% ]) |4 u3 ?& T4 C
33 call
6 @+ R# u3 S( E: x5 a& W8 a8 g批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
9 D, S9 ], z8 U& }* }. B* ?有时有的应用程序用start调用出错的,也可以call调用9 E7 B7 U+ `7 D; {

2 P4 c& E7 E0 o' B2 p34 choice (外部命令)' [. o$ M3 ~* F' K
选择命令5 w* ?" ]" v7 `
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……9 a9 H) d1 C  h) c1 o0 v! V
win98里是choice.com  V0 ]/ T2 u2 H7 t3 j
win2000pro里没有,可以从win98里拷过来
7 W) O4 G+ |$ P& q/ K: n/ hwin2003里是choice.exe
' A$ s8 _) k% U) j; ]/ @& qchoice /N /C y /T 5 /D y>nul
. P+ Y* {& h" x$ F( F  N延时5秒0 r# ~8 s3 n) Q% s6 n6 k1 l) G! n
( k6 n; A2 z% k5 c, |( a# w
35 assoc 和 ftype9 W2 l& v' s8 h) Q" Y* p# f
文件关联
3 d" r6 I+ q" f7 qassoc 设置'文件扩展名'关联,关联到'文件类型'  E' e  W' A) \  B
ftype 设置'文件类型'关联,关联到'执行程序和参数'& L% o7 B- `: o/ \2 R
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
2 D1 C1 V$ G/ Y; N9 k; K2 ]" V而是先判断.txt属于 txtfile '文件类型'
2 v. K. G+ \! W2 k再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %17 @, I+ W8 v5 H
可以在"文件夹选项"→"文件类型"里修改这2种关联/ j7 {- O: h" ]' _5 Q
assoc #显示所有'文件扩展名'关联( t+ C' ?& x; o% S$ `' J2 u
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile' \7 A! h" \( s3 [: w
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.80 m3 A% V+ c% I* ~7 I+ [2 W
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
' b2 u1 Z- F$ ~7 F! H9 fftype #显示所有'文件类型'关联
1 k: ^1 Y; {& C/ |1 {ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
. V, K8 Z; j$ |8 ^  b0 t8 Tassoc .txt=Word.Document.8
6 C0 |" S' @) G2 D( {设置.txt为word类型的文档,可以看到.txt文件的图标都变了
7 ~& J; c, k6 R& h2 [assoc .txt=txtfile
1 W$ {% y8 b0 k: t; E9 y) ?恢复.txt的正确关联& x) i% [' R5 v7 L0 S8 R
ftype exefile="%1" %*/ A: M$ R3 u6 S) W1 _
恢复 exefile 的正确关联( J- r# u3 M( q# |
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
0 f/ q; T# U1 f/ C' g" Z) C: }
$ `$ ~* I0 R. W36 pushd 和 popd: j/ `3 ]5 c- I8 n' e7 e: y
切换当前目录
" c& ?5 u; j  V( B4 y) U1 Q@echo off$ G; j4 m8 \8 j* m. H  f
c: & cd & md mp3 #在 C: 建立 mp3 文件夹5 g6 S( H9 Q# ?# e9 H
md d:mp4 #在 D: 建立 mp4 文件夹
* n, v0 r  v/ P: r' `$ Scd /d d:mp4 #更改当前目录为 d:mp49 B, A. i% x" q4 c" G. b
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
# ^8 L" I. y. f5 f; t) cpopd #恢复当前目录为刚才保存的 d:mp4
/ S) R$ ^& p& P2 b0 s- A7 _  r: ~5 D4 g* {) k6 i
37 for
: y" q% J7 U) D/ M8 P2 a. M: }4 A循环命令4 @5 @' P- H2 K( U
这个比较复杂,请对照 for/? 来看/ ]+ [5 m# j9 I& G4 o2 s1 K
for %%i in (c: d: e: f do echo %%i
) y! p- _6 P8 s. b/ ?5 w4 ?, @: d9 j- B依次调用小括号里的每个字符串,执行 do 后面的命令7 m/ d' O9 l8 q: X2 s- E. Y4 e) G
注意%%i,在批处理中 for 语句调用参数用2个%
. b+ R% a" c! |) j, y; k1 W默认的字符串分隔符是"空格键","Tab键","回车键"
  b& C) k" _; i# w( Ofor %%i in (*.txt) do find "abc" %%i
! J8 E. A. R9 k/ B对当前目录里所有的txt文件执行 find 命令. F* d( [1 g& ]: J1 z0 t2 v
for /r . %%i in (*.txt) do find "abc" %%i
# {  {3 S( [: x* O" t5 K4 B在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
. ?; R7 [, m7 L- J0 yfor /r . %%i in (.) do echo %%~pni
9 K* M1 z6 U5 Q- y显示当前目录名和所有子目录名,包括路径,不包括盘符
" V- C* x; |9 [6 A7 f2 G$ S# C( tfor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
2 M8 {. l! r6 e& l把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去$ C" w# h4 v7 Z; g
for /l %%i in (2,1,8) do echo %%i
, s& P# b, l7 R# {6 L( E6 ^6 S生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
+ f$ T& b& a% E) ~* L. I+ Ufor /f %%i in ('set') do echo %%i8 {& \. }* v8 O; \& L
对 set 命令的输出结果循环调用,每行一个
/ w# l! [' w' l" R- gfor /f "eol=P" %%i in ('set') do echo %%i% @2 a: @- C& m0 h' {
取 set 命令的输出结果,忽略以 P 开头的那几行' P- R9 y: ?, t8 L* t
for /f %%i in (d:mp3.txt) do echo %%i1 _- z5 x6 L2 P; k. p8 |+ d" {
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
0 ~" W6 i0 ~2 w4 ?for /f "delims=" %%i in (d:mp3.txt) do echo %%i
: ]4 p/ m: h6 _) F/ ?显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
" q" ]' U1 @& y+ ]; n! T8 Rfor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
1 F7 P, f0 i3 ~3 d) M1 W; Z对 dir 命令的结果,跳过前面5行,余下的每行取第4列
, H: d  p# w2 U5 ]( e4 q9 ?每列之间的分隔符为默认的"空格"
" M8 Q' X1 Z' n2 d6 g! N9 u可以注意到 dir 命令输出的前5行是没有文件名的
8 g2 f* \" N) Q3 [" A' f' nfor /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
$ a0 x( v9 b- j+ kecho %%a2 U3 t8 V" B1 `: o" A% R) y
echo %%b7 s9 ]. H# d$ l8 t
echo %%c6 \$ o  r. t7 ]
)
0 g: y  V0 q: H( w对 date /t 的输出结果,每行取1、2、3列
0 t- [: b' V' c, b. U! z第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
; }) y& W! c+ N) m% C分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"% |) g8 X5 y7 x- d, Z! X5 T
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
5 f  o# m" I* a7 jfor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b; _: [8 F* {- b4 w: V& v
取第2列给 %%a ,其后的列都给 %%b/ |2 U3 V5 R5 f% ^1 z4 n  O5 \

! R: M, v0 T. v* v# P$ E8 _$ l38 subst (外部命令)
+ b( _. W" m8 w1 v8 Q. V$ Z) K# b映射磁盘。8 x6 {0 Q/ w5 r4 O8 u- S
subst z: serverd #这样输入z:就可以访问serverd了! I. k+ M* C/ v" F  \  q
subst z: /d #取消该映射  k" u0 q3 h' K9 @
subst #显示目前所有的映时
9 H" Q) k" ^! e! z# f! o, J  L& K
; y  ~# g6 R% q2 @4 F. f4 {' U+ U: N% u39 xcopy (外部命令)6 m& S# J" F! Z; C0 v  T5 \0 U* b) |
文件拷贝
# O- t* o( N4 B0 j! r' E# P2 K& K  Z/ sxcopy d:mp3 e:mp3 /s/e/i/y
: `+ _# I3 g2 E, P复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
. O$ T2 V, s. ]. U* U1 ]$ a) n加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
% Y/ c9 A8 T% Z) [8 `0 H8 t7 a- \# @+ Z! ~  H3 E0 J* A
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退/ w# Y3 [% u6 b' h
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:
      4 X$ [2 m* R" \; ?0 z+ _
    ) O+ e; ?! q, G8 ^+ U# [
@echo off
. y: U; P) T) Z! z( `set p=aaa- r2 e" e. R5 R' S( i' O# v/ }
if %p%==aaa (3 S& |. z; X; A( r+ Z% ^! S
echo %p%
% U4 A; Q- Q3 \9 y; S6 }set p=bbb
) Y, C8 G# _4 v' v) P" R' H/ J8 Xecho %p%2 m9 L2 F% Z! {, f4 S4 w* i! G
)
& b( K( N. L$ Q' U# f6 p5 `pause
  • 截图:$ l' O, w) j+ j1 f' y
  • 2.批处理.bat 文件中输出中文乱码

    # h3 f9 R) R% [, X0 G+ _$ v
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:
      9 }, R  Y% N) @8 ]4 V
    • 效果截图:' ^9 c' E8 v) R' X
      $ x  S# u' K* F  H+ Z, m, M
    # ~8 {" ?; p' [5 r# y/ p0 x

, `9 o, C/ F! V) n) e

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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