扫一扫,微信登陆

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

搜索
查看: 1465|回复: 0

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

[复制链接]

354

主题

381

帖子

2175

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2175
QQ
发表于 2021-6-25 19:48:12 | 显示全部楼层 |阅读模式
Windows批处理(cmd/bat)常用命令教程
简单详细,建议收藏
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
  • 2.批处理.bat 文件中输出中文乱码
  • 解决方法在文章末尾!
    $ |$ t  ~# p2 |& J* h0 a
前言
  • 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效
    + @) N6 e* A) I: @2 c1 N8 c+ D$ n
在Windows中善用批处理可以简化很多重复工作
什么是批处理?
  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展+ o) Q. S% R9 e. P
    名为bat
  • 目前比较常见 的批处理包含两类:
    8 |" F# x% d2 ]2 E
    • DOS批处理和PS批处理。
    • PS批处理是基于强大的图片编辑软件
    • Photoshop的,用来批量处理图片的脚本;
    • 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
    • DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理/ g$ k+ U3 Q5 J, ]  z* a) D
  • 批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的5 q+ t; u6 z) X5 {7 A
    命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行
  • 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件

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

5 K2 n# h) P( p4 `6 z8 ~+ |* E% L8 ^
Windows Batch 常用命令% Z% d8 K  l# o; k. a" j
1 echo 和 @1 e2 x$ q! K  X- D3 k. e4 O
回显命令3 |) R) ^+ I  \5 B. e/ u
@  #关闭单行回显
# P+ A. s% n/ a8 ?: w! ~echo off  #从下一行开始关闭回显( ^  z( C# W+ \5 a- A4 `! s! v& g
@echo off  #从本行开始关闭回显。一般批处理第一行都是这个' `' ]# A* U$ G8 k
echo on #从下一行开始打开回显
/ A1 U8 Q2 R! B% i, [8 ?! L5 }echo #显示当前是 echo off 状态还是 echo on 状态# _3 N: h7 ]6 Q' z4 H0 N# Z
echo. #输出一个”回车换行”,空白行& J$ C* q( w% c( @
#(同echo, echo; echo+ echo[ echo] echo/ echo)
& n$ k- q4 p8 H  n- @4 N/ k) n. L+ @5 N1 B& \
2 errorlevel. s0 g+ M1 L! H" I
echo %errorlevel%5 D6 u! d# [% ~+ d
每个命令运行结束,可以用这个命令行格式查看返回码8 t- I; v: B% G. J: A& r
默认值为0,一般命令执行出错会设 errorlevel 为16 e7 ]$ j6 v( }- t1 `" U

( f% r, X+ A: U( I; E* K, W3 dir. K0 I) T. ]3 M6 M" {' F( S
显示文件夹内容# x4 i# f; J& t. U& E
dir #显示当前目录中的文件和子目录! F4 u; \2 n' Y  o% \
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件( O3 f# l& `1 P
dir c: /a:d #显示 C 盘当前目录中的目录  c, l3 c$ j3 u
dir c: /a:-d #显示 C 盘根目录中的文件( ^# T( h/ Y% A& a6 B8 X! ?* Z
dir c: /b/p #/b只显示文件名,/p分页显示
0 B: U7 Z# _  H. d9 j7 udir *.exe /s #显示当前目录和子目录里所有的.exe文件8 i. t- k4 o, H* I( [

; c- {! O9 F8 V- r* f' A4 cd
# q) a& n2 i. Z0 U* V切换目录
9 \# m2 V2 I; Fcd #进入根目录4 F& S) \& t! j% E% s* {
cd #显示当前目录
, z. i/ g' f' E& |cd /d d:sdk #可以同时更改盘符和目录( w' m8 b1 W  D, a: J6 L( p; l
/ r) e) l2 A* X: Y/ X" M
5 md" P+ {+ I- F* O: k5 N6 {
创建目录
% y7 {/ n/ ^0 }) _, N$ }& L4 F1 Lmd d:abc #如果 d:a 不存在,将会自动创建中级目录* C: e4 K" i  S: h! }& F! c
#如果命令扩展名被停用,则需要键入 mkdir abc
0 N! d; }7 [# d6 e6 `. t
/ y) r& F( S6 _# D. A# P; n! S7 y6 rd5 Y( b. `9 `3 p+ ?" ]5 {5 a+ J8 ^
删除目录
# A6 l$ d2 o  W! g) G& srd abc #删除当前目录里的 abc 子目录,要求为空目录
" ^# E8 U3 M; Mrd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式2 g3 M& a. `. I

% Y7 B3 n  ^3 L( j: w( w$ y7 del  q  I3 I) \  X! }  B+ V. [
删除文件
9 S( T3 Y. @; S4 V* Z) _6 udel d:test.txt #删除指定文件,不能是隐藏、系统、只读文件% Y/ V5 l$ E( o( @2 {* @3 F5 S  T
del /q/a/f d:temp*.*7 p/ v' f% \0 s3 c5 V
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
7 S( W6 K8 T5 a) y' ^del /q/a/f/s d:temp*.*
% F* H* G0 \" s7 y删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
# H$ \( i9 ~4 U* j2 x, _
+ X! H- a& m9 D7 Y+ M" s5 ~8 ren
- a5 w, a9 L4 a, A3 |  D( Y6 h重命名命令
. E. e3 h3 b' ]ren d:temp tmp #支持对文件夹的重命名, }3 d( x" F8 T/ _6 u# o/ C
: U3 H) Q2 l; o9 D4 X4 O
9 cls# T% Z. O% I: J, T$ r8 q& T
清屏
  W! w2 ]# C# [8 n2 X% C2 o: c10 type
. C, W6 o4 ?5 X0 H( [8 t显示文件内容
& x( U( B' |0 e* ]; ftype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码. V( C' o$ P$ D7 o9 f4 w$ x( x8 w
type *.txt #显示当前目录里所有.txt文件的内容
* w! E5 t- I! W9 b- d8 e* e& \  P( J1 D+ K5 h) F  m6 A4 l: y
11 copy
! R5 d4 ]. p8 T  c0 b7 Y拷贝文件. T6 X' ?! {. ^; A
copy c:test.txt d:test.bak
2 Z9 L" q9 U* ]  N" v+ D复制 c:test.txt 文件到 d: ,并重命名为 test.bak
" U& Z0 E4 C9 `. m  Kcopy con test.txt7 X, A0 f: Z6 U6 ?' g' A
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件6 C8 \" C0 H& N/ F7 E9 D! c& ~
con代表屏幕,prn代表打印机,nul代表空设备' S% r& }, W- `" q. {" U
copy 1.txt + 2.txt 3.txt
2 i, U' s% h/ U% z1 z  f  A; v合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件! g0 l5 R+ n6 d; D1 C
如果不指定 3.txt ,则保存到 1.txt
% C7 d: ^* c: j8 M$ X  {9 ~3 w% ecopy test.txt +2 h' K  M8 Q( ]' s
复制文件到自己,实际上是修改了文件日期
' ^4 j: [7 A  `8 v' \
' t% Q' d9 x* l: j' b12 title
0 [% ]% ?2 C7 [2 M! M6 z! }设置cmd窗口的标题
) b$ c2 r5 Q0 w7 n5 v3 ztitle 新标题 #可以看到cmd窗口的标题栏变了
2 I3 J# F/ Q4 r4 Y
  ]1 C! g1 A' B. {( n  o& A: f13 ver, s$ r/ z- k0 I$ |# _% m" y
显示系统版本
0 [) H% w% w' e5 t- P1 I; G) j0 z
14 label 和 vol2 @- @- I' P* M3 z% m
设置卷标- ~& ~8 g7 ?$ G2 r$ v/ F( R; c3 y
vol #显示卷标
7 \0 c7 r0 s" M+ |label #显示卷标,同时提示输入新卷标) L: p$ |( C: F2 Y: r
label c:system #设置C盘的卷标为 system
1 I2 a: T) S' G: V- f, W; _# n. l- c5 }
15 pause
2 Y1 I" z5 E6 _& B+ [暂停命令
, H3 R- p, K: r5 z' B6 ?* j8 ^: T2 L7 A' z; H7 `
16 rem 和 ::3 B3 }# w5 H* y5 n* ~7 \/ H
注释命令
. T7 j' U0 E- p, M注释行不执行操作
) C& a5 ]9 s2 Z# Q2 X) ?
9 s' u) ~* l: x2 z$ `- ~. f17 date 和 time+ W9 Q, W! `0 X1 I7 v
日期和时间
- Z) [  w) w% D2 ndate #显示当前日期,并提示输入新日期,按"回车"略过输入
/ E$ y) F, I* J  r5 o2 s) b7 cdate/t #只显示当前日期,不提示输入新日期+ S/ V  ~% L, F8 T' r3 L: `( v$ I
time #显示当前时间,并提示输入新时间,按"回车"略过输入
8 {% d( f% G) t9 x% n  ~2 Atime/t #只显示当前时间,不提示输入新时间4 j0 ~# I) p- L
$ U$ a" S6 v4 K( x  ~
18 goto 和 :0 m# Y% f: c+ Y5 X, I
跳转命令  S/ \8 K% }2 F5 }0 p
:label #行首为:表示该行是标签行,标签行不执行操作( s% ?2 ~  w; \! Q; U6 ~3 n5 j- _9 e5 \: r
goto label #跳转到指定的标签那一行1 s9 Y% ~, M& e6 y" U
2 x* C' @" ]& z8 x6 [# V
19 find (外部命令)
* K# q3 u9 w5 g+ M1 R查找命令8 S  T: @' D" I; U2 ^' G
find "abc" c:test.txt
8 W8 t4 W, T( {. m4 d) c% u  y/ v在 c:test.txt 文件里查找含 abc 字符串的行
7 u( I# E  `$ g0 }7 {6 I9 _% \如果找不到,将设 errorlevel 返回码为1: l  t0 g* L7 K- H1 Y5 R
find /i “abc” c:test.txt
6 {6 Y9 k  B! [- p查找含 abc 的行,忽略大小写, X( r8 `) o4 I' J' H( Y: D4 X
find /c "abc" c:test.txt; S& }! U) O1 c  y
显示含 abc 的行的行数
2 q$ H! r, q) S3 U* l. U: a& Z* X4 P4 F+ O3 q8 v
20 more (外部命令)% {# F* \& w6 R0 `1 Z* e
逐屏显示
/ w. n/ a( ]4 B0 Q% z/ Y' @more c:test.txt #逐屏显示 c:test.txt 的文件内容" _/ b+ G9 t8 `  E2 _
  K/ w; t  C3 O/ s
21 tree
0 N9 n7 p# o! i7 j显示目录结构6 E7 K, o: M( K% A1 |
tree d: #显示D盘的文件目录结构
! @. J) z3 k& A- Z: X* [; c9 [% G8 w: Z, ]
22 &
- ?. \* @6 q6 ^9 X2 L/ d. w顺序执行多条命令,而不管命令是否执行成功% I+ ]/ g% o; b6 p
5 D$ }4 h1 C8 a; P( p1 f
23 &&
& `1 z0 X6 l0 U  @顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
2 D, i% p% i( K  nfind "ok" c:test.txt && echo 成功. e. g: _2 J, ^& V% ?
如果找到了"ok"字样,就显示"成功",找不到就不显示0 x5 q. K6 m; I/ F) j  N

- l# L1 ]$ L9 E9 ~" k24 ||
( |- E, s% E. |2 h0 W顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令3 L3 T- u" a* B
find "ok" c:test.txt || echo 不成功
9 b: n4 ]+ N" C) S+ }* J' B如果找不到"ok"字样,就显示"不成功",找到了就不显示
4 j0 t+ H" ]& e/ \% }! C* P' v, y" P+ ?" O  @/ M/ W, E: G- j) v
25 |
5 @3 @( a- O" q2 i: [: }管道命令
3 I7 \- U# O- t1 F! Ndir *.* /s/a | find /c ".exe"
) N1 e, i# X7 J* J管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
: A7 \4 t! a$ g# C. {: F该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
" w1 @( o  w' w, I+ M$ a3 X- b# dtype c:test.txt|more! m, y( r3 @) v, u9 X4 ^9 h- ]
这个和 more c:test.txt 的效果是一样的  N$ F- _5 g2 l; h$ K: c6 ]
& @0 g# i* q# Q) y
26 > 和 >>
% n- d* `! L8 x1 A; C0 j" _输出重定向命令  V4 j. G# J& H3 t. S: m
> 清除文件中原有的内容后再写入
/ E" l- Y) k9 ?: q2 ]' k: a>> 追加内容到文件末尾,而不会清除原有的内容
9 D9 {3 s  b" M- r% F+ }# ^主要将本来显示在屏幕上的内容输出到指定文件中& k% b6 j4 L. H  ~
指定文件如果不存在,则自动生成该文件
/ `& N' c) I1 U. \. D5 ^7 Dtype c:test.txt >prn0 `. Q5 c2 P) @. b9 j
屏幕上不显示文件内容,转向输出到打印机
9 i/ G2 S0 e5 n7 r- \5 v# p7 K5 aecho hello world>con
$ n* Y, g) j' v在屏幕上显示hello world,实际上所有输出都是默认 >con 的% ?  A# t% T. _# u/ H% T% L) u
copy c:test.txt f: >nul
; |5 Z8 S0 y5 I拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息5 X9 a! h9 R$ i/ |: J9 Q
copy c:test.txt f: >nul 2>nul$ `2 Z8 c- t# }+ B% E$ a$ @$ d
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息( b7 a3 x& @" X2 f/ p
echo ^^W ^> ^W>c:test.txt7 ?& Y; A2 S0 Y" S2 n- |# N
生成的文件内容为 ^W > W+ N- i9 ^3 j" L& l3 h, N% X, }
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号) X2 W* [+ W7 k' h8 R# n5 e2 F/ L

. t; A, t) T2 z$ g8 [' d27 <
* Z; ?, R8 S& {+ \" l4 r从文件中获得输入信息,而不是从屏幕上9 y  @. Y" G# `+ s
一般用于 date time label 等需要等待输入的命令
( K# a- p, C! o2 Q@echo off
* T2 G/ N* r( r* S. necho 2005-05-01>temp.txt" }$ k& F' ?9 x1 e/ b1 U0 q( d1 @
date <temp.txt
- P# r2 ?3 d1 g* g8 Sdel temp.txt
2 g$ q( t/ E& m0 U这样就可以不等待输入直接修改当前日期
7 ?6 Q3 u8 b+ t- t3 r; p- w4 l
: h# m! @6 v" G: @4 B28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
) Q! G) g3 Z  j* ~' O0 `命令行传递给批处理的参数
0 p4 {/ v% L6 r" N( H- Q%0 批处理文件本身
' T8 [  l8 W' K. b$ ]* M# R3 _%1 第一个参数
# d. L# }7 M2 O%9 第九个参数3 u: @7 r+ N# J" ]" ]5 a
%* 从第一个参数开始的所有参数) Y' p) B8 K& a" }
批参数(%n)的替代已被增强。您可以使用以下语法:7 j; j& n7 l, g+ `
%~1 - 删除引号(" ), 扩充 %1
8 f6 F5 _6 @. r, @6 z%~f1 - 将 %1 扩充到一个完全合格的路径名
9 Z" R9 z% q' r7 S6 h' j9 m%~d1 - 仅将 %1 扩充到一个驱动器号
+ Y7 z9 K; q7 D3 I- \%~p1 - 仅将 %1 扩充到一个路径
' d3 D# f3 Z* Q8 C, {%~n1 - 仅将 %1 扩充到一个文件名$ e  G) w: h. P- V
%~x1 - 仅将 %1 扩充到一个文件扩展名, L( q2 Y( s: @5 y, |
%~s1 - 扩充的路径指含有短名
2 j2 h% @5 j! T& P% ?%~a1 - 将 %1 扩充到文件属性+ f) T" A4 W1 a  u/ [4 ?* X
%~t1 - 将 %1 扩充到文件的日期/时间
4 w6 k8 T8 M1 k%~z1 - 将 %1 扩充到文件的大小
0 k- ^& J, c3 e6 K. s. F1 o' X%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %15 E( F( A5 q$ x) Z
扩充到找到的第一个完全合格的名称。如果环境& y% l' }! ]  o
变量名未被定义,或者没有找到文件,此组合键会
1 \6 d5 v! t! \, R+ U/ H9 Z扩充到空字符串4 F0 Y; C" }: @) a1 s' }
可以组合修定符来取得多重结果:+ H$ ^* N' E9 @. g( [9 @
%~dp1 - 只将 %1 扩展到驱动器号和路径
% m8 m5 i! f7 M) o5 h3 r3 j%~nx1 - 只将 %1 扩展到文件名和扩展名
6 s+ M, s5 }; O4 G%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
$ l# V- D3 `; k' Z& y! M并扩展到找到的第一个文件的驱动器号和路径。4 P0 [  z; g  O4 ?
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
3 C( v+ k/ t# r# e6 p可以参照 call/? 或 for/? 看出每个参数的含意
4 Y% j3 q; L1 l) x: aecho load "%%1" "%%2">c:test.txt
4 s8 |/ i4 f( m# ?0 T; x生成的文件内容为 load "%1"  "%2"* K; Q  W2 ]+ W* o5 p
批处理文件里,用这个格式把命令行参数输出到文件
2 P! z; K* L. {0 {) o8 `+ H4 S: [7 e" w( S& `& V9 m
29 if  V9 m, Z2 d, a, z8 C/ h2 ]
判断命令
2 K$ M8 \- A$ r+ M: D" T8 Eif "%1"=="/a" echo 第一个参数是/a- U" {9 U2 \  F
if /i "%1" equ "/a" echo 第一个参数是/a
3 W* \3 q' i+ L5 J5 `. l/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
7 d4 c5 H* ]  `7 [) }+ v: oif exist c:test.bat echo 存在c:test.bat文件
& }% `+ j. W) @4 s5 X- @3 ^/ E6 ?if not exist c:windows (
; z2 }# p3 N6 o+ b# c  y' r, e3 Aecho 不存在c:windows文件夹
" k( `7 q9 A' d0 c9 {)
& R- m& E8 \7 W5 O$ Rif exist c:test.bat (1 t5 l0 m2 ]4 W5 C; F
echo 存在c:test.bat0 {5 \% h' J" J1 g
) else (
8 s, D8 F. I0 P" Z- f" secho 不存在c:test.bat
5 G2 [6 E6 y3 Z& x)  z5 o# [* N% r& m) u
30 setlocal 和 endlocal
$ C8 x! W$ I' i) q; D设置”命令扩展名”和”延缓环境变量扩充”5 q+ M7 b' X  I+ u
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
; }! l, J9 Q3 @) t) v+ P. Z( K- wSETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
. @* o: F( D3 X5 Y+ ZSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"/ J! N' B. K4 [$ D" i+ b
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
0 l# c& t, N0 S. [ENDLOCAL #恢复到使用SETLOCAL语句以前的状态
: ]/ S: g- C7 W0 y- V! o, W. o“命令扩展名”默认为启用3 b' D# K6 p( u4 S, ~8 _  U4 `
“延缓环境变量扩充”默认为停用  Z# L- ]. p, Q& V" c$ C
批处理结束系统会自动恢复默认值: X) U8 _( Q( W# t; o
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程8 y9 S0 |3 p9 D5 S) W
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确2 v7 \/ t+ s7 j) U. |/ J' ?: o
保程序能在其它系统上正确运行
7 ?+ S2 `" P" k- x0 k1 C5 I"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程- {' K& ?) g& e$ B2 U+ U

, _( M4 x4 Z1 T; u$ Y$ S31 set/ O% W$ i# E. D6 j
设置变量- B8 }, f6 S$ ^/ \
引用变量可在变量名前后加 % ,即 %变量名%
5 D3 P6 ^/ S* w) o; @& T  Yset #显示目前所有可用的变量,包括系统变量和自定义的变量& a8 W2 p* A* m# R' u2 V1 M6 D8 N1 t3 d
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
4 c+ b. g1 g; L+ A4 ~set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
" r6 s# ~8 D5 @$ c. \0 v: I& x3 ~set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2( _8 S8 V" ~, S, d! E7 f4 I7 G
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
- H. t4 r) E- {4 u* X4 s  oecho %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
( ?* Q# V) T' m: _; Vecho %p:~6,3% #显示第6个字符以后的3个字符,即aa2
: i3 G5 o4 R/ ?' u! aecho %p:~0,3% #显示前3个字符,即aa16 o; P# V: D  n7 a# x- I5 w
echo %p:~-2% #显示最后面的2个字符,即b2% L; E; e/ _% E
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b& G5 A# d% ?- U4 M
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2- i4 f0 d0 m/ v4 e: @  M9 l  |- a
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2  d! S. U0 K# \) j4 w" v% F% L
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
  a8 x3 c. U; k/ ?set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
4 @0 c7 e. D% dset /a p=39 #设置p为数值型变量,值为39
' O$ B" \) s# e; ]2 S4 [set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
( ], g3 R5 _/ V* q2 n* n& }0 k5 jset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用/ W/ ?1 ?! ~! v  L
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
0 o2 D4 l5 o  x% W/ Mset p= #取消p变量
4 C0 A0 J6 B) U9 d/ @! h% J& iset /p p=请输入4 v* B6 o$ A' _- ~+ d
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
* t0 _5 q3 R4 t5 E, n注意这条可以用来取代 choice 命令, E& B7 O( ~5 ~6 m9 g1 f
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如/ O' q6 S, E& [- s% W8 t
@echo off1 G5 A6 T" ]4 q0 e2 U6 b0 D( G
set p=aaa
" w% d& E- E( y) m2 f4 C2 gif %p%==aaa () }! [+ ?, o/ X9 L9 ]8 Z3 i  X/ a; O
echo %p%
% @- y5 q1 Z% T$ jset p=bbb: \, [. h) @( \# X1 E
echo %p%* K8 r8 z3 K* d# U; @8 a/ q5 G: s
)
) a( t: \8 `8 j  v) s9 G6 B4 O结果将显示
! [- i8 T" g' gaaa& O/ ]+ J( X+ W  d
aaa2 V1 e, k' b' s# P
因为在读取 if 语句时已经将所有 %p% 替换为aaa
3 L" [1 P: y9 o0 [1 T: V: r: M这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
( c: G* S0 y1 f/ g" z. K* v6 M可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
- |1 q) P. S! C8 [9 W6 q@echo off0 B2 f( U# F. j+ s  q
SETLOCAL ENABLEDELAYEDEXPANSION$ J* m9 d& ~8 \- A  a9 l5 Z: _, o
set p=aaa2 @1 Y. ]* F* V
if %p%==aaa (
  z: v8 B- P4 B$ I* b( D1 v1 qecho %p%
$ C2 a. u( i) N9 o* vset p=bbb
3 F; f: a' A  P4 W* L$ Eecho !p!
5 C) c0 D% ~3 ~* Q5 v  I2 s  L). ~  A9 B1 u& L0 s
ENDLOCAL
% W1 w* K( a( d9 j: U. J# w! z结果将显示/ s2 B% w  N. l; Y
aaa) k9 C5 s% g8 C+ `
bbb
: l3 b, ^$ T9 W, s0 A$ M还有几个动态变量,运行 set 看不到1 r# A) Q/ l1 v& G; r$ F4 C
%CD% #代表当前目录的字符串4 \( l' N! ^1 F: `
%DATE% #当前日期* J, l" s+ M/ Y6 ~& y
%TIME% #当前时间$ ?+ P% X# S, ~3 E1 g/ Z9 c
%RANDOM% #随机整数,介于0~32767
$ a# L& r. r/ P( M%ERRORLEVEL% #当前 ERRORLEVEL 值9 M+ f8 t' h, S& ]7 C
%CMDEXTVERSION% #当前命令处理器扩展名版本号
; |8 g1 v. K  D9 o; ]5 B  d5 _%CMDCMDLINE% #调用命令处理器的原始命令行' C. J/ E! a* G' M
可以用echo命令查看每个变量值,如 echo %time%
7 A: G4 O) h  m! d注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到- k' \$ r( Z# |6 [+ ]5 E
& P% |$ h7 L- W0 ~- u- K
32 start3 ^5 @* j% a( x: R3 f0 d7 G  [
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
8 U: C; M5 r( P  L+ U$ _! Y, O1 V6 M8 [4 q" M, a: |4 g
33 call6 F9 s- e$ C3 ~& |! s
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
& b- `$ G' g  k2 w! t6 E9 O0 |有时有的应用程序用start调用出错的,也可以call调用
+ \  ?# x6 ~+ w7 \
6 z( R' I( i1 U$ }34 choice (外部命令), f) g' G6 o- L# h; J
选择命令! m; q* ]. a! G3 E$ G) s, a
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……2 P1 \' f' g) H0 l
win98里是choice.com
* R1 g! X6 A; @6 A* gwin2000pro里没有,可以从win98里拷过来2 A+ f8 x1 G* C+ l4 h! k
win2003里是choice.exe
/ @  F2 x# _3 Schoice /N /C y /T 5 /D y>nul& |% y/ x- |5 s  o7 z/ `9 M: U- G
延时5秒: q% Z# E6 J2 C3 ?0 `) i
  z* e% |7 P7 Y( Y+ Z
35 assoc 和 ftype7 \7 X8 w" Q/ X0 s/ A+ C* y9 w
文件关联
" o% G* M. x& s& J: y1 l# L$ m6 Qassoc 设置'文件扩展名'关联,关联到'文件类型'
- P; K1 E- s7 h2 T+ E2 Lftype 设置'文件类型'关联,关联到'执行程序和参数'
6 L7 r( [! z$ R8 m当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
; @" B0 H  X9 }2 q7 j5 d3 }$ R0 a而是先判断.txt属于 txtfile '文件类型'
5 }1 U; F$ ^; M7 l2 s' D- ?+ ~; Q# |再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %14 p; f- z& M# I# w2 y
可以在"文件夹选项"→"文件类型"里修改这2种关联
, P  [+ [: l* dassoc #显示所有'文件扩展名'关联: P" w  e- ^* k, D
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
9 U% U' {. w: X4 X4 h+ x! lassoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
+ h1 _) K* s* p" z& d3 oassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile1 G' L# u* ^9 N6 o$ D6 m$ f& d
ftype #显示所有'文件类型'关联
. v/ b5 `3 c" T) f9 Tftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*5 ^! F: [& \' b6 ~! _" p8 D% k
assoc .txt=Word.Document.8  m' F0 M. Y4 t
设置.txt为word类型的文档,可以看到.txt文件的图标都变了
$ O& a# D, I  `' F) c2 [assoc .txt=txtfile, `) B* w* \: Y* n
恢复.txt的正确关联& A2 }5 C3 C. Q: {1 N
ftype exefile="%1" %*
1 u: J, @7 u  L( q, ^1 n恢复 exefile 的正确关联. @, e6 D$ M/ ~# g0 j# ]
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令" X5 o# C# C6 u) [0 S

2 `$ z! K6 q; A36 pushd 和 popd
" |, Q/ x$ b$ o切换当前目录+ t; ^& I# I$ J! S/ k. j/ T
@echo off8 Y) B  I$ H  t6 V( u9 \. V
c: & cd & md mp3 #在 C: 建立 mp3 文件夹' E- Z7 Y  h8 J9 M
md d:mp4 #在 D: 建立 mp4 文件夹: [5 L8 A6 {, Y: p1 i
cd /d d:mp4 #更改当前目录为 d:mp4
. `) [- L6 s2 y0 wpushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
" C. u( a/ F$ J4 d  ^8 vpopd #恢复当前目录为刚才保存的 d:mp4
$ Y! p  k1 f2 ]
! s2 f. N8 P. U! [9 ~7 f37 for4 E8 k* W7 Q1 Y2 f# S1 }6 s1 I
循环命令/ m! _& t* j  ~# x! u& _: u
这个比较复杂,请对照 for/? 来看
3 C+ d/ F  G5 f# F- m8 {for %%i in (c: d: e: f do echo %%i
: P) z  z( @6 y$ M! Y# _依次调用小括号里的每个字符串,执行 do 后面的命令
1 @) Q- {% r# h, S5 c! p注意%%i,在批处理中 for 语句调用参数用2个%7 _7 \  r- `3 N9 t' f
默认的字符串分隔符是"空格键","Tab键","回车键"
% j8 i- Q6 @: w6 d: x8 wfor %%i in (*.txt) do find "abc" %%i" Y5 r, \! o: H9 c5 C, N
对当前目录里所有的txt文件执行 find 命令7 O8 Q% d+ q% h7 x2 e/ I
for /r . %%i in (*.txt) do find "abc" %%i6 X+ I& }+ V& Z7 }# l) P% p  d& e% R9 s
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行0 f+ f! d4 G6 g# C6 K, Z% e( _
for /r . %%i in (.) do echo %%~pni
$ s* R5 D5 a8 K0 _9 a显示当前目录名和所有子目录名,包括路径,不包括盘符
: B1 |" Z1 G7 sfor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt" A: [* B1 Z4 ?/ W7 J
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
; `/ Y  N3 k, A: Rfor /l %%i in (2,1,8) do echo %%i4 \1 W6 b- X9 }6 l
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1% o1 x8 ~: ?5 E4 X; H* ?1 D
for /f %%i in ('set') do echo %%i
+ ?, ]( N  Q' K4 [) R对 set 命令的输出结果循环调用,每行一个4 b% y1 B# L! w/ ]; `
for /f "eol=P" %%i in ('set') do echo %%i
0 n1 ~, G/ q, ]$ K# |* h取 set 命令的输出结果,忽略以 P 开头的那几行8 q' ~% c% x: c; J# _
for /f %%i in (d:mp3.txt) do echo %%i3 {2 _3 @7 u: X. m" k
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
' E3 i+ m  X: u7 J  A7 rfor /f "delims=" %%i in (d:mp3.txt) do echo %%i
* ^8 ~1 A" ^4 l5 c, a; `( @显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称/ f# g5 P2 G/ o0 Q1 r- a
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a% U* {# T% j; N0 p+ w- v  s
对 dir 命令的结果,跳过前面5行,余下的每行取第4列
, S; b! I) S: u% K" |每列之间的分隔符为默认的"空格", S  q3 N0 w0 ~$ t3 K
可以注意到 dir 命令输出的前5行是没有文件名的; P9 b& O$ L( F
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (: N) t" z" p8 y  }5 R1 k3 l& F( i
echo %%a4 o9 s4 g! _/ [& q* Y
echo %%b! F# \. e4 Q; T4 j7 v
echo %%c) G8 M" D, J8 \) C6 n- f! ~
)% G- d5 L& V  o$ z; r
对 date /t 的输出结果,每行取1、2、3列
2 p+ a0 `* f0 K* ?# q第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列0 l- B) |9 S- d8 b, q& O# H
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"6 R; K4 S1 Q. S2 x5 v
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的# G  |9 C  F* X4 C! l) J% ?
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
/ w- s7 e/ b7 C; v/ d! Y取第2列给 %%a ,其后的列都给 %%b: e# F% \' L# i1 _, Q$ o3 k$ m0 d

- S6 a! }: S: z: |* k38 subst (外部命令)# A2 i3 v1 \# d9 _1 J) P+ x# O
映射磁盘。6 F& A' ]3 k' l. E/ W5 b
subst z: serverd #这样输入z:就可以访问serverd了4 m6 y5 q/ S) W, l$ q
subst z: /d #取消该映射. Y2 R/ ?5 F2 H- m$ S# A6 o) j+ D
subst #显示目前所有的映时3 m. ]# \4 S& w, j) @) e4 L, ^
* B" V' ]1 Y4 U" v
39 xcopy (外部命令)8 e1 _) c! H8 q$ e  [
文件拷贝
, _% r+ q% d) O, x( i4 Hxcopy d:mp3 e:mp3 /s/e/i/y0 c3 s- M8 x2 ^7 S) b* Z& s' u" r
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
, n4 T* `# U, {8 }# A+ q' Y加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
3 `' n, H- E2 q% V$ _; Q5 I  _* F9 D* G
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退6 l6 P& u1 [9 g0 b" F
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:, t, w4 W/ i$ q

    4 U: s2 L0 B, W
@echo off
( r" W* _2 `4 l3 h6 Lset p=aaa
1 _# x! h  S- `4 hif %p%==aaa (
- ]0 p( V+ c9 X' Lecho %p%
+ m2 `$ v& [2 F3 n9 Y. kset p=bbb( f6 W( p: m) \2 K
echo %p%) U; @( U- g. ~
)3 e: c) J7 [# ?3 L
pause
  • 截图:& Z1 d3 R& E& t6 @9 q
  • 2.批处理.bat 文件中输出中文乱码
    ; A3 j9 r$ t. q# B7 b
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:
      1 x& T8 r+ p$ Z! c" h! M
    • 效果截图:+ j& X! G3 k  p/ n
      2 J& M: ~: p( z5 ~

    6 q4 ]! R$ O' B0 ~$ |7 I, `+ v, H& V7 y, Z

- @: u0 O' q9 y, z% C! j

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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