扫一扫,微信登陆

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

搜索
查看: 1980|回复: 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 文件中输出中文乱码
  • 解决方法在文章末尾!
    8 j0 M# c1 I7 L. p
前言
  • 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效9 M1 |& H) b# }$ o
在Windows中善用批处理可以简化很多重复工作
什么是批处理?
  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
    $ F/ C6 U" h- ^# T9 q: P. _名为bat
  • 目前比较常见 的批处理包含两类:

    ; b' _1 u; F4 B( ~* z, Q* L' I
    • DOS批处理和PS批处理。
    • PS批处理是基于强大的图片编辑软件
    • Photoshop的,用来批量处理图片的脚本;
    • 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
    • DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理. y, Q2 I" X$ t. L' E% a
  • 批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
    2 H3 X  C' B3 D8 T4 [: p% |* S6 s7 l命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行
  • 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
    # i# [# ]" N- z; h+ p1 f
怎么创建批处理文件?
  • 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
  • 一般情况下,每条命令占据一行
  • 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
  • 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
    , L% I: z' Y/ N$ `6 w; e& y' h
批处理命令简介
  • echo
  • rem
  • pause
  • call
  • start
  • goto
  • set# e: O! ?% g7 s& a5 Q7 K- |
批处理常用命令总结批处理符号简介
  • 回显屏蔽 @
  • 重定向1 >与>>
  • 重定向2 <
  • 管道符号 |
  • 转义符 ^
  • 逻辑命令符包括:&、&&、||" Q0 c: Z; T4 ^9 i3 \
常用DOS命令
  • 文件夹管理:# g# B5 S6 t2 ^. g2 p/ y
    • cd 显示当前目录名或改变当前目录。
    • md 创建目录。
    • rd 删除一个目录。
    • dir 显示目录中的文件和子目录列表。
    • tree 以图形显示驱动器或路径的文件夹结构。
    • path 为可执行文件显示或设置一个搜索路径。
    • xcopy 复制文件和目录树。
      ! L/ g1 M9 f- z. X" m* {2 g# E
  • 文件管理:
    - b6 ^8 ]2 e+ t! l2 I  A5 ?
    • type 显示文本文件的内容。
    • copy 将一份或多份文件复制到另一个位置。
    • del 删除一个或数个文件。
    • move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
    • ren 重命名文件。
    • replace 替换文件。
    • attrib 显示或更改文件属性。
    • find 搜索字符串。
    • fc 比较两个文件或两个文件集并显示它们之间的不同* ?" f6 w+ w3 R
  • 网络命令:; X% b+ E' l, T2 m+ O; g; E; n
    • ping 进行网络连接测试、名称解析
    • ftp 文件传输
    • net 网络命令集及用户管理
    • telnet 远程登陆
    • ipconfig显示、修改TCP/IP设置
    • msg 给用户发送消息
    • arp 显示、修改局域网的IP地址-物理地址映射列表
      0 I  \% ]3 ^! @3 U1 g
  • 系统管理:
    5 |* P0 O- ^, ?" y# v% S: [- \, p
    • at 安排在特定日期和时间运行命令和程序
    • shutdown立即或定时关机或重启
    • tskill 结束进程
    • taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
    • tasklist显示进程列表(Windows XP Home Edition中没有)
    • sc 系统服务设置与控制
    • reg 注册表控制台工具
    • powercfg控制系统上的电源设置
      - r2 }+ T% @* v& T, \" }

    ( `% D6 _/ i# Y) [1 Z. \5 b! K
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?

; q% K, }+ f8 H1 T/ M% A
. {9 P8 u  Z7 g. p* v9 J$ FWindows Batch 常用命令
" t4 ^1 p0 j2 i1 echo 和 @
" ]& @+ M3 }* Z/ v5 f$ |/ S回显命令
. c3 R4 g) b: G! r2 l  G@  #关闭单行回显6 @& w. v6 g( F1 A! s
echo off  #从下一行开始关闭回显$ G7 J! {4 B7 x" J' e& ^
@echo off  #从本行开始关闭回显。一般批处理第一行都是这个
! [3 A; U, |! i( v  G( I& C# A+ Mecho on #从下一行开始打开回显
( W4 y8 W$ e7 x2 ^echo #显示当前是 echo off 状态还是 echo on 状态6 |, ]; d- H9 M% W- |
echo. #输出一个”回车换行”,空白行$ b+ u1 L7 I- w3 A& O2 A2 }$ o$ @9 s
#(同echo, echo; echo+ echo[ echo] echo/ echo): v: L: a/ c) d7 U  H( `

: |; R" A9 ]5 p  @, Y( A+ c2 errorlevel
, _% p2 J( f' C) w- p  Aecho %errorlevel%
9 V. I7 @, Q* u2 B每个命令运行结束,可以用这个命令行格式查看返回码3 w# v, g* F4 i) I1 ]
默认值为0,一般命令执行出错会设 errorlevel 为1
8 e0 F0 [# n7 [; [0 ]
6 t4 }* r# O; U: v' Y1 K: t: l( z. A3 dir; z- ~& ~: P4 I* D( u! `1 ?9 y3 [
显示文件夹内容
$ C0 u( j- X( z- f! B% R* T8 h# }2 pdir #显示当前目录中的文件和子目录- [% ~0 |! ]$ v7 i9 k3 B" `
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
% K! }  N+ t8 O# Y- Pdir c: /a:d #显示 C 盘当前目录中的目录. V( w* Q# |5 f, W4 U$ Q+ X
dir c: /a:-d #显示 C 盘根目录中的文件; P7 H( |+ \! A1 Y+ x, c
dir c: /b/p #/b只显示文件名,/p分页显示8 e/ C( {1 w: b  }/ b$ T4 i9 `
dir *.exe /s #显示当前目录和子目录里所有的.exe文件, S1 X; @$ k" e! y! t% ]: l
2 M$ d4 i  m4 Q& a2 h! o
4 cd
3 _- P0 P" v4 M' s1 h切换目录6 c3 P4 N& Y# @! [
cd #进入根目录
5 z+ j+ ^' g- w1 a" U# N* O! {  hcd #显示当前目录
2 F2 t( X4 W; q& lcd /d d:sdk #可以同时更改盘符和目录
! i. t: E# z& [: G! E$ c. ]8 k; H( g! Y) I, i+ y8 R9 b0 L& e0 l; K
5 md
- g0 `7 f& g0 L4 N" p创建目录" p$ Q( n+ B, e* ~2 o  B
md d:abc #如果 d:a 不存在,将会自动创建中级目录
& W  l' |0 J; M: G' X7 l. O#如果命令扩展名被停用,则需要键入 mkdir abc
3 F1 J' {! P# @) v+ l& Y$ V7 u) ~4 S. x( G) E
6 rd
3 m9 b& t1 [( {7 J$ O3 ~删除目录- M0 o6 B& L: |( H% w$ H4 ?
rd abc #删除当前目录里的 abc 子目录,要求为空目录
7 R+ f- [. k+ @1 W% r$ M" e/ F' trd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式& s$ A3 Q2 u2 t" z" o& q# v: i; d9 g

8 z$ L1 h8 x1 U; e7 del/ a  G( B% \; c; u( `/ n
删除文件
9 n& L, T9 G# m. Rdel d:test.txt #删除指定文件,不能是隐藏、系统、只读文件  ~0 C+ Y- N( L& Y  k' Z
del /q/a/f d:temp*.*
5 C  M& ]) {- V8 r2 b$ W删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录7 q/ `8 E' j: _2 W! R: E. z
del /q/a/f/s d:temp*.*) @5 v) D9 Y* a
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录6 s5 b4 t$ f/ w7 s9 s

/ A) C' L& X6 V+ K) S8 ren, Z* t, }% C7 k3 n0 a
重命名命令
3 i& q0 H! G* N# Kren d:temp tmp #支持对文件夹的重命名% s; W% [' m+ N6 O

: L0 Z+ n& }0 B9 h# f& \2 g9 cls# s, H9 H! h5 D- D% j
清屏
% O3 K2 L5 U* ~4 Q% @10 type
" M  G! G7 b2 G9 P( S/ \显示文件内容5 Q  l  D/ r' M" s, Y
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
9 Y0 D! Y/ g) ~" J0 g1 [6 w4 itype *.txt #显示当前目录里所有.txt文件的内容! ?/ D# S" [8 x* L9 h# C: M3 O

) e. T) @& M  P  ~8 x8 ]11 copy. h8 s: ~$ e7 j8 ^- C) F# a
拷贝文件
9 |1 y* A* K% D% dcopy c:test.txt d:test.bak8 s) o7 W+ e- M. q3 K
复制 c:test.txt 文件到 d: ,并重命名为 test.bak
: ]/ v1 e7 L: i! ^. b& acopy con test.txt
1 e5 K& _# ~+ a; {6 b9 K从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件& a: ]# E! c1 {
con代表屏幕,prn代表打印机,nul代表空设备
  p# Q4 l7 f! f0 P4 Kcopy 1.txt + 2.txt 3.txt
2 d. ]0 W$ p6 |2 x合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
. ]* ]% O1 C) H7 K; }/ A4 E如果不指定 3.txt ,则保存到 1.txt
! K+ j- a# p0 O  R, G' I  \9 Jcopy test.txt ++ u2 T. e9 k$ q) L4 ]9 h
复制文件到自己,实际上是修改了文件日期( H' K1 v" t8 o8 |: g' R

! _8 P# x1 e9 M5 }! r% v12 title
- q/ C( K+ N3 M; j设置cmd窗口的标题
: u, T" l, D- X8 Z/ V9 W+ V! c: U1 Utitle 新标题 #可以看到cmd窗口的标题栏变了
6 l2 v9 G8 U$ q  S/ ?* t/ U# I! ]. {/ z# m4 A0 [6 s2 P2 L2 N
13 ver/ a, n, ~6 m0 u4 \& F$ w% ~1 {
显示系统版本
: q( L' a$ q% m' |# ~# C' D2 \# ]4 `  o; }! Z
14 label 和 vol
; P/ v$ B" S( h设置卷标
. u6 f- W" r% e6 ]& {+ Avol #显示卷标
! D; ^: G+ O5 B7 `label #显示卷标,同时提示输入新卷标) y1 y$ F" t! J  R$ [
label c:system #设置C盘的卷标为 system
) B0 k) ~! q/ U' I8 U" R8 |* }: Y" D6 S' ?' _. I& i
15 pause+ ~9 R) l1 u7 N+ A. ~
暂停命令. ^: O8 Q$ o* F; O! r5 t1 W

# U- A8 x# E, @  ?3 G( R& k0 m! n5 q16 rem 和 ::4 U- y; v$ E+ Y/ ^+ \
注释命令: |* D' {2 E7 p  e
注释行不执行操作
" T* t: i) L* N8 ^' F0 v0 @
8 e3 s* v* e% x! p. ]17 date 和 time
& q9 V. h9 h. g3 y! x) d* [日期和时间
, z: w: X; N2 Bdate #显示当前日期,并提示输入新日期,按"回车"略过输入
; r  ^) X' ~' z0 _" |date/t #只显示当前日期,不提示输入新日期
* T" V  a# \/ r' O7 y/ }- otime #显示当前时间,并提示输入新时间,按"回车"略过输入
. P: J" d! q' y( \* Ptime/t #只显示当前时间,不提示输入新时间
* Y) J1 Q6 s' f) [- M# P! R
2 {9 {% I! k/ v) Q18 goto 和 :* d' V/ S$ h1 X$ p8 B0 w1 d) o
跳转命令
( |# L0 H0 i* t/ B:label #行首为:表示该行是标签行,标签行不执行操作' n8 F+ u* p! V4 p
goto label #跳转到指定的标签那一行( h4 _* K' Z: B5 r7 ~" B. f
1 u: i& n2 X$ a$ @. @; B
19 find (外部命令)
8 u$ B4 i* E( V2 s8 t$ `查找命令
. z" b! x; a0 N# h7 xfind "abc" c:test.txt. m! i+ v: O) j0 w) n2 N" S1 @
在 c:test.txt 文件里查找含 abc 字符串的行; I9 z* U0 S% o9 M$ v$ U4 Q
如果找不到,将设 errorlevel 返回码为1
9 D& @2 [+ A8 X( e2 dfind /i “abc” c:test.txt
# O, B8 [" D2 a6 v3 D4 q# `查找含 abc 的行,忽略大小写
! n9 w; F# q: y! Y6 [: B* ifind /c "abc" c:test.txt
) C1 m' I7 T! i  y! {显示含 abc 的行的行数
0 \) e" S7 J: Z9 K( g& {9 s7 M( e! j5 `
$ z) L! L- J3 z# l. ?% G  N20 more (外部命令)( _8 h; [* X3 W- f. H( e% T6 k
逐屏显示1 j6 u# Z- ?" K+ `( ~$ Y
more c:test.txt #逐屏显示 c:test.txt 的文件内容1 U. \8 s7 a; I7 I/ m9 z4 T
" z+ R+ ~/ L1 l% U6 C) ~- j
21 tree
4 u5 h4 X7 A. U6 E& L- J+ A显示目录结构
+ b5 [" e4 }4 U; Q" N8 B0 Ptree d: #显示D盘的文件目录结构  L: |8 C* p* g" r8 ?9 l$ M) Z
' E" U* ]# U' q3 t: ~: P
22 &: M# H0 Q6 a, k. L( t
顺序执行多条命令,而不管命令是否执行成功3 ]; g3 n4 u7 y
( X2 a# U$ k% {7 ^# D9 Q: {8 f2 L( J) Y
23 &&
( X( V: M* e% S! i- o顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
( A8 E! s3 V6 O$ U# J0 U6 M9 Kfind "ok" c:test.txt && echo 成功, \/ Z, ]4 m# ~
如果找到了"ok"字样,就显示"成功",找不到就不显示! R  D8 o% c& [# K

( z, W7 \' t; R0 q24 ||7 `& Y* s0 \9 z% A6 z: z
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令, J! g. R0 h1 d3 |8 c; G: e3 Y% z
find "ok" c:test.txt || echo 不成功& X6 q, d; p: J+ H! z- M: ^
如果找不到"ok"字样,就显示"不成功",找到了就不显示1 G4 S+ ?* O7 Q3 }; P3 X* h1 a
* \  ]2 C/ L" Z2 b3 _& q
25 |
7 S! v. \* z6 E/ h( y% D0 M$ R管道命令$ `( I0 D0 ~$ f
dir *.* /s/a | find /c ".exe"3 h1 B) d! E2 G* x
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令- P! c* X, K, F( `- U& ?; _3 g1 x$ g. g9 r
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
# q; w  C- g3 X4 B9 {: o; l, Etype c:test.txt|more0 a9 a' z2 [+ ]$ p' K# j
这个和 more c:test.txt 的效果是一样的
5 ?& k- P7 F! d8 D, L4 @/ _7 c% q% m7 W/ H& @- y
26 > 和 >>5 S1 q: d& D, M8 ]: f8 a- e
输出重定向命令% [5 q& }2 B3 i* q/ d
> 清除文件中原有的内容后再写入0 ?" F+ @7 G: W
>> 追加内容到文件末尾,而不会清除原有的内容
6 I8 Y, B3 D8 w  x& r# [5 d3 E8 _$ J0 {主要将本来显示在屏幕上的内容输出到指定文件中
9 c, Q5 ~% \2 m: a7 v5 M, O( [) Z指定文件如果不存在,则自动生成该文件
* l( ^, ^# _6 J8 C9 r5 Z+ ?type c:test.txt >prn8 d8 h8 |9 l& m, B* q) W+ k
屏幕上不显示文件内容,转向输出到打印机% O6 G5 T4 {# @
echo hello world>con) X2 b6 Y# _9 D+ V7 Z; Z
在屏幕上显示hello world,实际上所有输出都是默认 >con 的
7 r( g5 n  w: Q+ N) n- Jcopy c:test.txt f: >nul
& `3 f( j6 o  @+ {5 U拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
/ W" n4 T% h; k. C, F: mcopy c:test.txt f: >nul 2>nul/ e2 U6 _, s, E; G8 ~' l- F
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
. d) ^) c7 C4 ?7 Iecho ^^W ^> ^W>c:test.txt
" Q% V. E( W  r$ \& c生成的文件内容为 ^W > W( k& X$ G: T, A+ Z# U, R
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号- n$ C" @' p7 n- n
4 [! ?' _" P* }9 o5 }' K
27 <. E" g% _! `" u
从文件中获得输入信息,而不是从屏幕上. H: v; R" W5 z% D; [& M* K, x
一般用于 date time label 等需要等待输入的命令
% N0 U8 g# \9 x@echo off
$ j5 w1 V3 b- c% Eecho 2005-05-01>temp.txt+ d5 C' A+ H! ?0 `2 D! R
date <temp.txt
9 D+ O' U- p) ?+ qdel temp.txt0 ^! y- }9 Y' E8 Y
这样就可以不等待输入直接修改当前日期
' c* ^8 a, E* V$ `
+ _* g3 |5 g+ ]( Q, M7 \; O28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
$ ~4 D# s0 _1 B; p- A9 N1 l命令行传递给批处理的参数
( i7 C) u) K- s; _%0 批处理文件本身
+ P2 j0 m' p3 u) b& s1 ^: D& s%1 第一个参数
% M1 C! }9 E2 M%9 第九个参数3 [! l8 R$ u7 H1 L$ o0 N, X# X1 i2 M
%* 从第一个参数开始的所有参数. I% L; o2 @  E/ @3 Z
批参数(%n)的替代已被增强。您可以使用以下语法:
5 q# E( B& S/ o# M1 c%~1 - 删除引号(" ), 扩充 %10 e$ Q* m8 c* l' C2 b' v/ d- R
%~f1 - 将 %1 扩充到一个完全合格的路径名5 u8 u, |7 c7 [, L4 E+ Y" a
%~d1 - 仅将 %1 扩充到一个驱动器号
% ]8 G9 V: J' s" {/ @6 a%~p1 - 仅将 %1 扩充到一个路径
+ E3 R" g. s" v/ p%~n1 - 仅将 %1 扩充到一个文件名6 l' n+ |  L% J1 |! [# P4 O
%~x1 - 仅将 %1 扩充到一个文件扩展名' S  z( i+ x# r9 _! I2 l* y5 x: f4 z
%~s1 - 扩充的路径指含有短名
5 x+ G% b6 q, M1 v! T# b' ?; W%~a1 - 将 %1 扩充到文件属性
. M! S7 S$ r5 p+ _6 e%~t1 - 将 %1 扩充到文件的日期/时间
1 y6 ?& g' C$ Y7 k; s9 V: d%~z1 - 将 %1 扩充到文件的大小
% a( i, y' P- ~* `' ~: i; _%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
, h, B1 T! ~4 g, y, B% H9 h扩充到找到的第一个完全合格的名称。如果环境" v1 f6 O" o2 @, Y
变量名未被定义,或者没有找到文件,此组合键会
1 ^8 L: b: P% {$ R8 `扩充到空字符串
3 H% x6 J" U& @# Q8 F+ Z可以组合修定符来取得多重结果:
! C8 M5 L3 p4 @%~dp1 - 只将 %1 扩展到驱动器号和路径: b& v$ o: I. n
%~nx1 - 只将 %1 扩展到文件名和扩展名
6 F3 K% k2 Z6 ]; M9 n5 t+ }! T%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,5 [. ~% W3 k4 n0 @& Z; r
并扩展到找到的第一个文件的驱动器号和路径。
% v- g# ?- H9 q1 S7 A' f%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。. }2 F' x8 E% Y, t( w) w
可以参照 call/? 或 for/? 看出每个参数的含意/ S7 j+ k/ o4 b6 x6 `
echo load "%%1" "%%2">c:test.txt
! n  a, m+ A+ }( L生成的文件内容为 load "%1"  "%2"
1 I% ^- E/ X* ?$ v' s. M& u# {批处理文件里,用这个格式把命令行参数输出到文件* J- g/ k9 f1 [  {, t
3 h; o/ q/ l* D% X7 z
29 if5 F/ I+ T# a8 @4 y5 t  {: J
判断命令0 Z: d5 [  L, k/ ?  D* k
if "%1"=="/a" echo 第一个参数是/a+ n! G' ^8 z6 {) x/ t4 a
if /i "%1" equ "/a" echo 第一个参数是/a0 P' p0 s2 B* a, u$ T
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?' {+ r3 M  q; B5 m$ h
if exist c:test.bat echo 存在c:test.bat文件
* [% X* F, T% H/ r' N$ ?if not exist c:windows (7 c' \% e) A+ i) @- Y
echo 不存在c:windows文件夹
, V  e% K3 ]$ w& g)
0 u" p2 ]. T* D' w3 A( C0 M' Pif exist c:test.bat (" j+ c. x4 Y% u% S/ Y
echo 存在c:test.bat% ]$ J( f# z# J9 {
) else (
. \8 t& |/ e1 g/ T( |3 mecho 不存在c:test.bat
' v5 r( k, o* t  b: y. h9 U)) `0 G' m5 f: ~3 X! T9 W- s
30 setlocal 和 endlocal" Y$ ?0 w8 J9 h
设置”命令扩展名”和”延缓环境变量扩充”
' y$ S1 P4 @: B" CSETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
& i' ?0 j+ X6 `* iSETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"3 p. \1 ?; ]" |3 Y: m- }4 R
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"' P3 L9 S% z' l* n2 K) B
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"% e# t+ g! S" J
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态
- w% e# u2 a" q& \; ]4 `7 T8 F“命令扩展名”默认为启用( o$ i- U) g8 S3 G6 }: a
“延缓环境变量扩充”默认为停用& E  ^7 U. Q& t8 I; ?
批处理结束系统会自动恢复默认值/ M2 e5 b# s6 L& r' S( w3 a9 F% d% g! d
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程+ D" a, L5 n& b5 `6 l
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确+ ?1 j7 h- F# P8 W" ~
保程序能在其它系统上正确运行& F6 F& q; A- b
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程8 d2 h; S# T# B! y
, t& H2 b& [3 O3 Z" J7 n( J
31 set8 \. y! _" ~- I4 w0 b7 Q# e) S- S
设置变量
' e3 b3 a5 @+ g( }4 W引用变量可在变量名前后加 % ,即 %变量名%  K1 p8 Z) R# o+ _5 ]0 q
set #显示目前所有可用的变量,包括系统变量和自定义的变量/ `+ ]2 ^# h, ]; L8 H3 f
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
( [$ \* A" B2 Q) i8 N- Dset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
0 W! `/ a4 d( Y- Cset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
; C( |  R0 Y2 }+ ~4 _8 Oecho %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
. ]) y% S4 R8 Decho %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2- ]4 O6 E6 k% d- u
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2
  e8 \% z- K* u; j. v$ I& hecho %p:~0,3% #显示前3个字符,即aa1( w; k  D% R, s4 R2 N% M
echo %p:~-2% #显示最后面的2个字符,即b2
; ^" M& ]& }; yecho %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
1 z: u2 f8 R/ T5 X' E2 Pecho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
7 e- D: R- e6 Z, O/ pecho %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
8 G8 x# H6 w, B4 u) Wecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
9 _- s. u5 z0 z4 x, {- o) P% Iset p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb29 h' @, @7 Z5 W1 @8 J1 s& y
set /a p=39 #设置p为数值型变量,值为39
$ T$ w% A& }4 P; Lset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
# `5 A3 z+ ?0 z% v, uset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
# n& t! X; w' o, s1 {set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?* P; u0 q/ v, ], g, h$ T: h
set p= #取消p变量
( ]# ~( H; I0 pset /p p=请输入: ^# ^$ i7 k* E0 r! Y' M: |0 V
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p; u) ~9 F. ~* w& X& X* Y
注意这条可以用来取代 choice 命令  \$ O+ i* w0 @" G' e1 `" x) d
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如5 z5 ]) E- O6 z* ?+ c
@echo off
9 Z! u' t& \' |: xset p=aaa
. y/ k) J/ X# Wif %p%==aaa (" j# b3 m' t! j! W) R: M: [
echo %p%. e6 t' d3 W8 l+ \9 ?
set p=bbb
" Y$ r& i" N% X+ L: S: o% Lecho %p%
) E) A9 P6 j9 B' _& M), _' s2 N0 k+ c. ~
结果将显示
/ G$ I' {9 }2 X* N. N( w* _aaa" \/ {$ V& y# Y
aaa4 a7 l4 ^+ c0 o7 k
因为在读取 if 语句时已经将所有 %p% 替换为aaa, q4 o- h. ^) }; I! w+ g
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"3 k# Y' C. G( q2 _# `. E
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
. |. o- Z8 G8 B@echo off
7 [7 O7 o: ?) y3 p$ gSETLOCAL ENABLEDELAYEDEXPANSION3 G$ }+ r" C; D
set p=aaa
+ Z/ y+ i1 H+ C0 O8 Rif %p%==aaa (1 ]0 ~) l4 z* A) v
echo %p%
! \4 r4 {* N  Y8 g8 Zset p=bbb
- F3 j7 }6 f, y5 F, M0 @1 y* ~echo !p!
/ f& j9 G& G8 E1 T; x( h)8 F$ w1 d& b* Q( _+ r
ENDLOCAL
0 [; `3 G0 k& z0 s结果将显示) E' C* [) ?  k* P/ H# |
aaa
6 d$ |/ \& F' S' g; p  B% g$ X, Bbbb! s# v+ y: f# e- Y
还有几个动态变量,运行 set 看不到8 B( S5 @) G& ^7 M
%CD% #代表当前目录的字符串
0 N  K0 j/ z7 d+ z7 F3 N%DATE% #当前日期
" ]5 ^7 F; ]- E0 G! l0 h8 f%TIME% #当前时间; H9 t7 s, i$ R: y1 W
%RANDOM% #随机整数,介于0~32767
- _/ R% ?, ?+ M# R0 B%ERRORLEVEL% #当前 ERRORLEVEL 值4 m0 o) }: h" k- p5 u, N
%CMDEXTVERSION% #当前命令处理器扩展名版本号
1 u2 k- O3 W( @# x1 G. k# r%CMDCMDLINE% #调用命令处理器的原始命令行
* X7 ?" X( B5 R! O( z可以用echo命令查看每个变量值,如 echo %time%/ V* S* ]/ @! s$ y2 B# L6 e
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到" p4 [2 _9 M& a# l, J: N& W; M
0 U8 }/ ?: ^8 Z8 M, u
32 start, o* F4 D. M' B- t
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
% v$ M7 P2 F! ^4 u
7 g/ s. @/ ?# I# I, e6 s6 V5 [+ M0 S: p33 call$ f( t. F9 f  P! ]( Z' ]
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
4 b8 G$ ]* K; {: `- T8 K有时有的应用程序用start调用出错的,也可以call调用# }- v- p/ t8 D7 E) t

5 r9 d- H; Z6 _( d+ l7 B" c6 }* H/ Y34 choice (外部命令)5 v" m, v, T: J5 J" e# m
选择命令
. x2 U, n6 |. t9 A+ M7 _* O让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……. ^) G; o- c0 o) y. a
win98里是choice.com
5 S% Z4 r/ V+ k6 x4 s2 ^6 n" i; w! ~9 twin2000pro里没有,可以从win98里拷过来
4 m5 O9 H- v  a/ P: k' Mwin2003里是choice.exe
; g6 q2 T: ~" G; E9 Fchoice /N /C y /T 5 /D y>nul1 a$ ~% @6 A1 j0 w* A$ |, C2 D& M
延时5秒- @5 t: s4 J3 g' p
* j( I4 i5 N5 O: _, _9 v5 B
35 assoc 和 ftype# _  U/ g+ i' y; D
文件关联. G# W3 h; a' V" ]
assoc 设置'文件扩展名'关联,关联到'文件类型'$ \( c& ^( @3 q7 q2 x- n8 @/ I5 l
ftype 设置'文件类型'关联,关联到'执行程序和参数'
9 i$ ^0 Z& m/ X; q2 o当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开, S; A: f/ ~5 v% F- b( ^  N
而是先判断.txt属于 txtfile '文件类型'
- q- \8 y3 r; `! [, F, n; l再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
% g9 ~# y4 J0 P) B4 J可以在"文件夹选项"→"文件类型"里修改这2种关联# F! ^0 w7 }5 a8 F. h  s% y  N: {+ x5 `7 i
assoc #显示所有'文件扩展名'关联! f# c, A  I% ^7 v. A6 P
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
4 }) W! p* t$ _assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
% w  J& J7 I# }2 q% {assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
+ t; U( j6 ?) T3 tftype #显示所有'文件类型'关联/ j* f6 `5 l. E9 _( B* L2 \1 M6 H
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*: K& i" j5 T1 o
assoc .txt=Word.Document.8# E+ W& T! U+ B; m- m! s/ b
设置.txt为word类型的文档,可以看到.txt文件的图标都变了- C1 F3 e  q: ]1 S
assoc .txt=txtfile" R2 y- C1 l* n" a  R; X# b  S+ o
恢复.txt的正确关联
4 W2 m7 Y, \$ s% b4 Rftype exefile="%1" %*
& w5 p$ x5 C/ R9 i- t恢复 exefile 的正确关联
7 C. E& Q, n" t+ p: V. d如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
& h) j; I7 y& R8 u  T4 d/ l1 c* Z
8 ~8 C4 Q" X$ E+ w2 t" C6 D& Z36 pushd 和 popd
' J& G9 |7 @# p3 g3 V5 l$ U切换当前目录8 ~$ B7 E# b# W6 Q- y( F0 h* I3 B
@echo off* h3 C8 o* T+ ?  @$ O- A# D
c: & cd & md mp3 #在 C: 建立 mp3 文件夹6 T8 Z: H) V& T, M$ s2 B
md d:mp4 #在 D: 建立 mp4 文件夹2 Q! g* b; C( h- v& q" M& ~/ F! _
cd /d d:mp4 #更改当前目录为 d:mp4
" q5 j2 E' _  b- Upushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
7 F& ~9 ~2 z% M. z: M; ~popd #恢复当前目录为刚才保存的 d:mp4
0 ~6 _" ]+ U, I6 T* I" u
; P7 `3 H) H* P+ i' j37 for$ p" R! ~2 x2 a4 l9 I
循环命令
7 y, C. J8 H" k0 [4 b2 w这个比较复杂,请对照 for/? 来看
) b  b  Y, D1 [; i  C7 qfor %%i in (c: d: e: f do echo %%i
6 q. w8 x) w7 a2 G% w, r依次调用小括号里的每个字符串,执行 do 后面的命令9 Y* [+ r, b/ q0 R3 U1 O
注意%%i,在批处理中 for 语句调用参数用2个%! M" F/ c7 i6 l+ K8 l
默认的字符串分隔符是"空格键","Tab键","回车键"
8 `, n9 }2 e/ O6 tfor %%i in (*.txt) do find "abc" %%i) G8 ?7 _; ]; v1 t( i6 H5 u& ]
对当前目录里所有的txt文件执行 find 命令
) b! ~2 W6 m3 s! I* Vfor /r . %%i in (*.txt) do find "abc" %%i+ W, o  l8 X+ [3 a
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
5 D+ P  b7 R$ l! u4 n& t$ ?for /r . %%i in (.) do echo %%~pni
, f4 K0 V4 ^* H# U显示当前目录名和所有子目录名,包括路径,不包括盘符
" d  a: a7 k1 C. g2 zfor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
5 z# @. B" v' A* @把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去4 B2 t) _/ u5 ^: D) n
for /l %%i in (2,1,8) do echo %%i
3 Y. q) a2 L' P* a5 r% p生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1! b+ }$ H0 ], a
for /f %%i in ('set') do echo %%i
) \# M6 d* l4 M& @对 set 命令的输出结果循环调用,每行一个$ F: g- ?8 S" r1 X9 G, x
for /f "eol=P" %%i in ('set') do echo %%i
" g) t/ T+ u, T1 Q4 k) @; w* e" {取 set 命令的输出结果,忽略以 P 开头的那几行
+ X( |; i! i: g; E- `, @for /f %%i in (d:mp3.txt) do echo %%i. x9 ^8 G! T1 ]
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
  G  t% ?1 q+ Wfor /f "delims=" %%i in (d:mp3.txt) do echo %%i
5 _( k+ A: S; O9 _) K; X6 x显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
' C. u( z  d. n: O% Q1 g3 V5 G7 ~for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a3 g$ N4 D! T, J  U
对 dir 命令的结果,跳过前面5行,余下的每行取第4列3 Y1 R9 T2 @  H' [4 n
每列之间的分隔符为默认的"空格"5 V/ R) m5 j' O( L" v( z
可以注意到 dir 命令输出的前5行是没有文件名的
: l$ C! p: A, v/ v! W; Kfor /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (' y8 R& F9 T3 ~
echo %%a
& B& D2 h  {) r! L7 Uecho %%b0 Y* k0 Y. T& n7 ?& u  X
echo %%c
$ r, u# g6 R5 Z5 z7 c# |4 ^)8 K4 X% e3 v6 j! n9 q. Y( n1 R
对 date /t 的输出结果,每行取1、2、3列! {6 X9 r6 k3 Z! r7 w' ~* U  l
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
/ B' T$ J) f$ C( H. `分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
7 U0 w# @9 {! d% |其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
+ g* v" [" E& S4 `9 O' i0 g" efor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
6 N8 U  Q/ t# ^! T! q# v$ `取第2列给 %%a ,其后的列都给 %%b
3 I/ N- q( ~& e  }) e" X4 H2 J% b8 U* g  j+ Q
38 subst (外部命令)- Z/ u+ L% z: `, C
映射磁盘。& k/ @8 A  b- S. {0 Y* [2 t8 z
subst z: serverd #这样输入z:就可以访问serverd了( Z4 b& w# S6 c, D3 t
subst z: /d #取消该映射% q  F& k+ p. _! ~# `7 l4 w5 t
subst #显示目前所有的映时
7 H; P, k/ m( p+ _; f1 `) C/ [: w. [% G$ F* z% [' R, D
39 xcopy (外部命令)
& u3 m- i6 q% B) p) u0 _4 b3 A$ [文件拷贝
( h6 ~. ~$ T& Excopy d:mp3 e:mp3 /s/e/i/y
& t3 j# H, E1 j' D: A9 `复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件5 Q1 p8 g; B9 W6 E' o
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
) W, l4 I' ~' Z* I4 Q+ _6 K  l) ~6 |3 Y' }
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
    + Z+ j& T9 W- v1 y6 p9 E' r& Q  f( U
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:
      . N* h- b5 t; r/ {- r
    8 `3 f" R+ O" h
@echo off
5 ^- |5 o: G  G2 @3 [0 @) bset p=aaa
* q, }; I, s. o+ Dif %p%==aaa (" p6 N2 p" l. @/ p! u( ]$ I
echo %p%
& N3 M1 P" h! [& }6 S: P0 Y& `' oset p=bbb( m- d* K5 Z: T, h3 B, ^
echo %p%( x! D% b! `1 W( V
)
; r: ^4 b: W: Q/ x4 {pause
  • 截图:
    : c5 g1 s& W, f: c
  • 2.批处理.bat 文件中输出中文乱码

      b9 n# c) b* _8 ~
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:2 a$ U2 b$ ^1 T. a  E
    • 效果截图:7 O- N; M: x6 O( O  O: n
      6 _+ k- S: ^$ r9 K# C6 r5 i9 w% I

    % v* n7 M- W7 k) k! R9 d. I9 X

7 @6 _- s, r( x

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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