请选择 进入手机版 | 继续访问电脑版

扫一扫,微信登陆

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

搜索
查看: 1890|回复: 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 l! a9 X. v9 Z$ e. r9 L( f
前言
  • 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效: p" Y8 c2 N( [; J: @
在Windows中善用批处理可以简化很多重复工作
什么是批处理?
  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
    : B) |! T2 J2 O0 O/ e% g9 A0 a名为bat
  • 目前比较常见 的批处理包含两类:

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

/ |' x( \9 `  s1 [+ k2 w" ~
+ x: J: }* Y1 J1 pWindows Batch 常用命令# {- O- }! x, ^; G, x, Y$ h
1 echo 和 @$ F$ S7 E' s$ O0 U
回显命令
$ ?! t! `* ~; ?@  #关闭单行回显
3 |2 i7 X( j+ h% [+ c0 a- g+ pecho off  #从下一行开始关闭回显( K& J/ d; G% g8 ^
@echo off  #从本行开始关闭回显。一般批处理第一行都是这个! [% V' @2 R# _5 Y- Q
echo on #从下一行开始打开回显1 B' e0 B( P  }, Y
echo #显示当前是 echo off 状态还是 echo on 状态+ b9 W# p- u) _+ ^. G( H
echo. #输出一个”回车换行”,空白行
0 l' {& }2 B8 k8 a' e: ]0 M#(同echo, echo; echo+ echo[ echo] echo/ echo)
5 g9 F/ x: e' U7 z  |
6 ?  L0 ?/ i- [: i) _. \. n6 }' \( b2 errorlevel
# A' [* e- p% z& f2 i! c' d9 decho %errorlevel%
- e% l) F1 ~$ E+ j每个命令运行结束,可以用这个命令行格式查看返回码
" v. w5 N' ]5 M) @默认值为0,一般命令执行出错会设 errorlevel 为1
6 Y4 c/ J, p" H% l/ t
1 L7 ^. p' e7 X1 @8 _1 z3 dir" j! `2 Y. u2 Y2 E- V7 d; t, g
显示文件夹内容6 O2 C9 V8 T5 L1 L
dir #显示当前目录中的文件和子目录
% b! A2 \9 o! D1 ldir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
! i) B+ [, {% w, v2 q' ydir c: /a:d #显示 C 盘当前目录中的目录8 h; g. Z6 U& s+ L' X5 R
dir c: /a:-d #显示 C 盘根目录中的文件
8 R. E" n1 N' k" E, ddir c: /b/p #/b只显示文件名,/p分页显示- p+ I% i4 z& f, Z6 }4 [
dir *.exe /s #显示当前目录和子目录里所有的.exe文件( b' G9 I+ e( o. z( z6 s2 l' ^
0 j9 w4 b1 I2 f8 q
4 cd
  a" b2 _% ?% y  G切换目录5 u/ w: S- P! Z4 W, M+ g0 I# Y
cd #进入根目录
* g! a9 A" |- Zcd #显示当前目录# a3 t: y4 W/ ~( f4 X' O7 ]$ B
cd /d d:sdk #可以同时更改盘符和目录
% _) y1 L- _! ?3 ^; i$ Y2 V$ ^: |9 X, ^0 D1 m: `5 G
5 md0 y7 k5 E% L- C% a; t( M
创建目录# L) d1 m8 q6 v% c9 W
md d:abc #如果 d:a 不存在,将会自动创建中级目录( i, U; f+ a5 M) w  h
#如果命令扩展名被停用,则需要键入 mkdir abc: u2 @9 C% l3 w% I) r& a3 u. y% [. Z
$ ]5 x8 C* ^# j4 Y6 s) k1 |
6 rd
# x! u9 F/ X1 T% g  q; U删除目录
; u  X8 n+ o/ M( V  B, y* e: vrd abc #删除当前目录里的 abc 子目录,要求为空目录0 B# A# Z$ G# d, l
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
8 l3 s$ D5 P; t2 i# u
* i' i; {; O' E% Y7 del% |4 c1 h" x' |% D' d" {2 |
删除文件3 w5 Z" k3 H$ R3 C! A
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
0 ^1 T- L: b+ i$ _6 ydel /q/a/f d:temp*.*
: h7 o# b" t3 N- {8 d/ [! M删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
! V" O. l* h$ pdel /q/a/f/s d:temp*.*
1 ^: W! R8 k+ I删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录! C/ r5 J! S$ c2 Y
0 D% \- q" H. ~
8 ren4 E7 \- U3 l1 H7 z( H9 L: K$ Q/ q
重命名命令
9 F1 `. V4 |0 `  ~  u2 \$ aren d:temp tmp #支持对文件夹的重命名
+ t$ [( L5 s, m: b4 S) I8 G& o2 v+ y( j- q" R0 H# e& r% \
9 cls* p6 m. w" r/ B! g% z
清屏4 C* Q: [. D7 S2 V) R1 P; e
10 type
; L' q6 A' ]! a% D; T; u  ~显示文件内容
& U2 ^9 i# s8 D# \% u- F  d# [& htype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
( q' o, |$ r3 |: ?# ~+ s* m2 c2 J; R* Ttype *.txt #显示当前目录里所有.txt文件的内容# }- S  Z1 Y$ o' ~/ Y+ T
* X( F- C$ f9 ?7 E$ R! o! J: Z
11 copy) b' W6 z% e2 y0 A
拷贝文件
- w9 Z) I4 Q+ e  W& _copy c:test.txt d:test.bak
' r. e: S- D' i7 }4 ~0 W! S复制 c:test.txt 文件到 d: ,并重命名为 test.bak% `9 I& O) x# A& a  Z6 u
copy con test.txt
. ]) Q9 q$ G. _. ~* m从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
. I" \, ~, b% m2 G; m+ o2 u- Scon代表屏幕,prn代表打印机,nul代表空设备
' u, _/ {* }9 ~: B6 xcopy 1.txt + 2.txt 3.txt
, s9 a$ E, ]+ R0 [合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
7 k6 a- M- s5 t2 L6 ~0 z如果不指定 3.txt ,则保存到 1.txt2 b$ N7 b  |# X* y! p
copy test.txt +0 ~2 d. M. n; i+ I, |1 F! X6 o
复制文件到自己,实际上是修改了文件日期! M/ s' A# y$ n6 z( u: d

% |0 P% g6 _) N: e2 M0 @. f12 title
* k% y! \: ?7 d2 N5 Q! B设置cmd窗口的标题6 f3 O! h3 @! d0 B7 o* D6 N3 I" t- k
title 新标题 #可以看到cmd窗口的标题栏变了
1 p! U. z* {. ?; N! {, x: z7 C1 }6 m) z
13 ver
0 K$ D, T6 {! ~' k- m6 K显示系统版本: T, S; G5 l2 w+ w
( Q3 f8 X" ]/ w" T
14 label 和 vol
  Q# t, W# t: s  `1 r; j设置卷标
  p% Y% n: W' d/ M8 f5 [vol #显示卷标0 `  G5 \! F" I
label #显示卷标,同时提示输入新卷标* \7 ^: I4 B/ C3 @3 ^
label c:system #设置C盘的卷标为 system
/ W& l' K5 K9 H/ W, a  z& k# X4 \  _  Z# R: t
15 pause( L( ]& o9 @! j* Q% U$ q
暂停命令
+ N' ?, U2 s3 n  h: O( u" O) i' a6 P6 \) ~/ ]# C" ^3 ?' K
16 rem 和 ::
1 C& a5 T# b0 o, n5 q8 g2 ]注释命令/ s# ^8 ~8 ~' r& u. f4 Z7 V" Y  B
注释行不执行操作: N2 R2 d, G6 t
9 D/ o9 [0 a% n! A: Z; x. x
17 date 和 time
  R& E/ A, Z' e- ]日期和时间) s  [# \" d/ n. l6 ?* u5 i
date #显示当前日期,并提示输入新日期,按"回车"略过输入
* n* L0 E9 u( V" B" ?) {date/t #只显示当前日期,不提示输入新日期6 P- u7 [: }  S4 c* p4 H
time #显示当前时间,并提示输入新时间,按"回车"略过输入# Y) e% n' ?  Z  C+ I. r
time/t #只显示当前时间,不提示输入新时间. }+ V" X  z2 {9 v; d  t

" T9 g) V* C( |6 B; {18 goto 和 :
% j$ M# m0 _- t( ~1 k跳转命令1 U4 v+ ^, {% p9 r. Q- f" o
:label #行首为:表示该行是标签行,标签行不执行操作
8 o7 P2 i/ ^7 q, s% T: \goto label #跳转到指定的标签那一行, l1 ~) r3 i5 M, M1 y0 C4 O9 N
9 D$ d) o( l+ P' R( b
19 find (外部命令)
' t& e  i4 v( X1 S1 T查找命令6 x/ ]/ W7 K/ C3 o
find "abc" c:test.txt* o9 D# d1 T, X+ |: F' ~: n& t
在 c:test.txt 文件里查找含 abc 字符串的行
. S( L/ e6 z' R( R1 C3 W如果找不到,将设 errorlevel 返回码为1  @6 @' o2 C, `8 u
find /i “abc” c:test.txt8 z* H2 J0 P0 a% C0 d/ r' w* p  Q; L
查找含 abc 的行,忽略大小写
% i7 e( A& N( Kfind /c "abc" c:test.txt
- _# v' Z+ Q7 ?3 P9 j显示含 abc 的行的行数% o3 U# n/ |9 o% d! m0 W: v
2 G. w5 Q7 u# n$ n8 J3 @3 i) a7 v+ X
20 more (外部命令)  V8 L: \. W8 K2 h& ?7 O. Z$ ~* x
逐屏显示: u: a* q4 _1 _
more c:test.txt #逐屏显示 c:test.txt 的文件内容4 y3 r; u' d7 }1 A$ C8 y
7 |3 d9 j2 a$ n7 n) C
21 tree- ~2 f+ F7 w( K2 j& |
显示目录结构5 U2 }# z0 e" H$ ?, Z2 Q
tree d: #显示D盘的文件目录结构
/ T- j7 D% d! F! t  E7 ~0 S  }0 b5 y: k, X
22 &9 ^# U/ _$ `$ T8 H+ \7 F, F2 v
顺序执行多条命令,而不管命令是否执行成功
( Q# X5 Q. V$ c" _! C0 W- B
& F& t/ S% V2 N$ P: W7 F23 &&' u5 N% t) ~5 m
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令/ m% J8 U  J+ `) P
find "ok" c:test.txt && echo 成功: V6 d- B8 b  a, z0 L# `
如果找到了"ok"字样,就显示"成功",找不到就不显示. j/ [4 b, F/ k* }' ^

% ?4 L0 M! j: w+ t7 ?24 ||
; \0 i2 B& o5 a8 F" N1 O; @顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
& v8 \9 L/ T: dfind "ok" c:test.txt || echo 不成功/ ~. G1 c) D5 n* w
如果找不到"ok"字样,就显示"不成功",找到了就不显示
; x' O. }7 {$ y, y+ w( H5 u+ F$ Y  p) l
25 |) ^; q& j. ?8 M8 B/ h" G  o
管道命令
$ v! B$ r# H# ?( a4 k& ^dir *.* /s/a | find /c ".exe"
  \) z* k7 s6 F& g% }+ y0 y管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令9 I. R! k4 v% H$ t2 b1 y% B# I, J
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
5 @$ V! z# q# ztype c:test.txt|more
# q0 ?7 |2 L* k$ Y这个和 more c:test.txt 的效果是一样的
* j! _8 ~8 g' R1 I
3 y0 ?; g: k* q26 > 和 >>
9 |& k$ R, B- I输出重定向命令3 u* ~' s5 ?) w! o8 y
> 清除文件中原有的内容后再写入/ a7 d: m, M, J* q. T1 g; `
>> 追加内容到文件末尾,而不会清除原有的内容
8 Z( s' O/ Y6 l" b+ v主要将本来显示在屏幕上的内容输出到指定文件中4 z/ \/ o) R& @. r+ G
指定文件如果不存在,则自动生成该文件% [% D- r, }! k6 v0 m5 f
type c:test.txt >prn" R4 |) o) H* J2 m, D" I6 A
屏幕上不显示文件内容,转向输出到打印机4 [" |: Y) ?/ H
echo hello world>con
; }* M+ u/ {! @5 D) o) x4 m# Z1 X在屏幕上显示hello world,实际上所有输出都是默认 >con 的
* R1 }2 X* q( I. ~, f* kcopy c:test.txt f: >nul7 E# L8 a7 |+ N
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息# K  j- c& r: M2 B0 I0 B
copy c:test.txt f: >nul 2>nul8 ?( W! D. I$ N+ F9 W% E1 N
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
% E) ^# g2 Z+ X( t6 qecho ^^W ^> ^W>c:test.txt
# X) \# Y! p* k4 [生成的文件内容为 ^W > W
5 g; G: E' F* R+ ~% j6 ?  c^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
- e; t7 j- {7 x" M0 N: r
) ~/ A' S, `6 ?7 U/ \2 V1 a. ]27 <$ J$ T: W8 T0 Y  ^, D; S% n
从文件中获得输入信息,而不是从屏幕上! R& t/ O6 _' Y6 [, j
一般用于 date time label 等需要等待输入的命令$ ^; B  h& S' W+ Y3 I
@echo off; M( {  S5 w. O8 U9 v" Q8 ^0 T$ _3 w
echo 2005-05-01>temp.txt  ~2 R( _6 j2 V: M2 i
date <temp.txt: V7 N& J2 m: ~: m1 E. Q/ Z
del temp.txt9 W  R. }3 ?$ d: G/ H) y4 I
这样就可以不等待输入直接修改当前日期9 l5 v0 F1 O" Q# N/ ?
6 r0 X- a% b( w: H7 N
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
/ _/ |3 X# u3 M" e( y/ q$ O命令行传递给批处理的参数+ F! Y! P: O5 H) @2 U) i0 p4 c
%0 批处理文件本身9 ]5 ~# P+ n: Q, a" R, i. D
%1 第一个参数9 m& N5 Y/ k5 {8 t
%9 第九个参数
% |% d; j0 f" U& ]) h4 j%* 从第一个参数开始的所有参数# D8 x& L1 ~: P5 D( ]4 G% y
批参数(%n)的替代已被增强。您可以使用以下语法:
, d+ ?7 R2 E1 c4 ~%~1 - 删除引号(" ), 扩充 %1% L$ L. ]: I) R1 O) v* y+ ]- I
%~f1 - 将 %1 扩充到一个完全合格的路径名: I, z6 i# t2 |9 W& d0 |- |
%~d1 - 仅将 %1 扩充到一个驱动器号
9 r% f- L; @( m+ g%~p1 - 仅将 %1 扩充到一个路径
3 {% J6 i4 k; x: M%~n1 - 仅将 %1 扩充到一个文件名
- U* h% s$ {* a8 H%~x1 - 仅将 %1 扩充到一个文件扩展名
3 @: y# x4 B' d0 C6 x) J/ T%~s1 - 扩充的路径指含有短名
! {1 `4 J* _9 S/ E5 D3 ]: p) V%~a1 - 将 %1 扩充到文件属性! q% D; c) q0 m# K3 h  F4 U
%~t1 - 将 %1 扩充到文件的日期/时间
+ L  E9 [& N. [, ]%~z1 - 将 %1 扩充到文件的大小
& F/ n* l9 F' y3 \  a; e% w1 C%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1, ?# l5 d, S: u, H4 x- K; I3 A
扩充到找到的第一个完全合格的名称。如果环境
% @  ~, |: |* R) M变量名未被定义,或者没有找到文件,此组合键会
9 h' i2 \- k# A1 C8 v扩充到空字符串3 u9 b) l- s+ H6 D
可以组合修定符来取得多重结果:3 u3 F/ z6 [( a* s% f: C  t* U
%~dp1 - 只将 %1 扩展到驱动器号和路径4 z+ ~6 k" D( j% s
%~nx1 - 只将 %1 扩展到文件名和扩展名/ v7 G, |0 d! `! l: K( f
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,5 g& N6 r% g4 `+ W6 \$ `
并扩展到找到的第一个文件的驱动器号和路径。) H. V( J$ G% c# L1 X
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
* T9 L( t; P8 e+ D  x4 C8 ]可以参照 call/? 或 for/? 看出每个参数的含意
! B  c% _7 l  }1 q8 U/ h2 X2 mecho load "%%1" "%%2">c:test.txt
( x6 l# b8 w% \. s1 p) w7 L生成的文件内容为 load "%1"  "%2", J1 z; e/ p! R+ M! Y: E0 u
批处理文件里,用这个格式把命令行参数输出到文件- i6 A! Q; G3 q9 w+ O2 V

3 }( S% `% S6 A: {5 L( Z/ |29 if
7 R8 S0 ]. G, V; n+ j% q判断命令
' N: i7 t+ D: w% Nif "%1"=="/a" echo 第一个参数是/a
, |. D9 @/ M- {4 B1 r+ r$ Cif /i "%1" equ "/a" echo 第一个参数是/a
  S$ A$ x7 P6 q0 }+ O& O/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?0 F  F/ {$ U  g0 A/ f
if exist c:test.bat echo 存在c:test.bat文件
! L' j( @1 Q4 {; q2 Qif not exist c:windows (
) P0 g6 w5 I) I! e4 s) u. x% Becho 不存在c:windows文件夹
' v$ p' Z. O/ G, y% t& Q& T8 M3 v)
3 K# ~1 u6 U- T, Wif exist c:test.bat (
: E- Y- P3 j8 e5 Y2 b; Techo 存在c:test.bat' K& z; V$ U+ B8 V$ q( Q7 I
) else (
  a5 h9 N4 Q# x+ {* zecho 不存在c:test.bat* L  H  A" C' v
); W$ T/ D4 \2 P+ F/ z$ O
30 setlocal 和 endlocal) I7 K/ q4 C! n* `
设置”命令扩展名”和”延缓环境变量扩充”
! ^) d$ n6 P% \2 O- T' C  M8 W5 nSETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
( ?3 Y: R- r7 `; `% r2 v' VSETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
- s; V" V- S. H9 L) SSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"8 @, ]; ?& r  |* l
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
. M8 a5 ^3 [3 ~3 i- i% OENDLOCAL #恢复到使用SETLOCAL语句以前的状态+ f) ~% Z& w/ R
“命令扩展名”默认为启用
1 e. W  }% Z* [$ l9 J5 ?. P+ U“延缓环境变量扩充”默认为停用
* p, _/ h  r8 b* C! o/ H批处理结束系统会自动恢复默认值
$ ~6 A7 ]. n, v7 d0 ]6 g9 p' F. I可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程/ Z# ]: h8 t  M1 M( \
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
0 P0 y! S+ }, q" a  C, u* ~保程序能在其它系统上正确运行
$ |$ n/ |) U3 {7 j& `! b( Y6 D"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
3 h& I  c6 P4 \( ~0 \  O. @# m$ V1 S6 Q9 ]  H+ t' d
31 set1 s9 j5 E+ y9 [- g
设置变量4 F3 z7 t) [" \& _1 H7 _' a; ?
引用变量可在变量名前后加 % ,即 %变量名%
" h) G% g/ Z+ Pset #显示目前所有可用的变量,包括系统变量和自定义的变量
* |* `9 H/ t4 _echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
, U! k  g& N6 a! c1 kset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
" [9 @0 ^. e$ X, Z# F$ lset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2$ n7 p9 t1 {' @
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
+ J; d: T/ }! \% Aecho %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
" x3 ^( {3 U+ i6 C  Zecho %p:~6,3% #显示第6个字符以后的3个字符,即aa27 t; _( n( m  J7 t7 V
echo %p:~0,3% #显示前3个字符,即aa1
- J) B9 v5 }+ Y6 pecho %p:~-2% #显示最后面的2个字符,即b28 p7 e7 j" y5 f$ Z& c8 D/ \: k
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
6 d1 a0 |7 S5 _! Q9 z# B6 gecho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb26 L2 u2 x& E# s) r
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2; [) L% V; M0 O& r
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2" ^) e0 Y! {+ D& c( \
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2# z6 J" n1 ]5 w, y6 [( t
set /a p=39 #设置p为数值型变量,值为39+ Q; `1 X- G3 F  A: M3 _
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
2 N- t# t1 R# t5 Y4 k) v" Rset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用2 V8 L: M& D  z: p! ]+ n  @2 S. y
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
& M: z0 C! d* T. }! y+ Uset p= #取消p变量
; p; X; i7 n  cset /p p=请输入- ]# ]8 M/ u; f% {
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p; N4 H2 {: P& @0 R3 x5 u
注意这条可以用来取代 choice 命令. f- ?8 ~' X! m! C* X0 h3 r
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如$ ~: F8 D! A  W6 \+ l, A
@echo off# F2 p9 {% E. |1 }
set p=aaa
  J4 E3 j# W  p! x3 tif %p%==aaa (! g+ i" Y" _: ?6 m, K
echo %p%. N8 d& u# }  q1 A& M, f
set p=bbb
+ |0 |6 y' s+ R+ _! wecho %p%
  [: O" \: N. F  X& B: j' Z)
# T1 n! V  R3 @4 D结果将显示7 e! x3 K# x5 H& Y6 S
aaa
9 c  S; O  v) g$ S" }- |aaa
( h# @  d/ g# Q因为在读取 if 语句时已经将所有 %p% 替换为aaa  e1 `8 y1 S  M- m4 J  o8 D
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"+ B  Z- `; m8 d" ]$ c6 ?
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
. l7 P0 ^1 n3 u  f@echo off* x" g' b. D/ F7 `6 D8 |) w4 l6 F- u
SETLOCAL ENABLEDELAYEDEXPANSION
7 y0 t9 |# F* b7 I2 rset p=aaa8 ~& N( Y- P1 V9 w1 Y: C
if %p%==aaa (6 v6 E" m3 B; n# K/ g
echo %p%
/ I; {2 h2 h+ C' W5 s* y  Aset p=bbb
2 s5 s' Z& W  C  xecho !p!$ p  ^: U" A3 U9 m0 h) W( f
)/ k9 U  Y1 k/ j. ^. q- I2 o
ENDLOCAL2 x9 ~. l- k7 q% l7 m' L9 q! Q
结果将显示
9 [7 I$ f) v" a: ]' H+ v# F( Jaaa/ Z% T8 Y" H! h
bbb
+ a* l3 |  z* p7 |2 q3 ~还有几个动态变量,运行 set 看不到' e' E/ E+ D7 r9 u/ X: x
%CD% #代表当前目录的字符串- T; v8 p9 T6 M. K" T2 y8 s1 V
%DATE% #当前日期! Z2 O6 O: A7 t3 O+ M
%TIME% #当前时间  V  n- H8 Y- e0 B  e3 |. P, ]
%RANDOM% #随机整数,介于0~32767# d+ I) b; m# z0 r- a' x- Z
%ERRORLEVEL% #当前 ERRORLEVEL 值) r6 I8 A8 J' f  ~  b. e9 A1 [
%CMDEXTVERSION% #当前命令处理器扩展名版本号( Z, J2 `5 `- V5 q8 w5 B) N% ?+ {6 B; w
%CMDCMDLINE% #调用命令处理器的原始命令行
% l. A# B5 N$ F. D. o  x  C可以用echo命令查看每个变量值,如 echo %time%
$ O. A/ t3 \# R3 L- k/ D/ N( y注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到, n1 H% ^, u+ O2 n: [

4 S: `9 v  ^# _32 start
1 i* @  _: \* \1 A5 H, r批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
' f/ V; }4 h* M: k) c2 h
3 G% t& x" u$ y1 y# H  v* K33 call
6 ]/ O6 v" [) F" {% ^批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行: ]+ V6 n% q  N/ |& ?: w6 G
有时有的应用程序用start调用出错的,也可以call调用5 P# n0 E6 t& A3 H3 g

2 u0 R4 c; c& s" A9 r% B! E34 choice (外部命令)
( k4 U' o4 ]4 S5 j/ D8 O& k选择命令& U. h- X' ~" I; D9 [
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……* g$ Y7 f; n& }  f, f+ O4 g* \
win98里是choice.com
! e9 Y. ~+ y& n' k. Nwin2000pro里没有,可以从win98里拷过来
( F) x. O2 R/ e  r0 H2 u% k3 Owin2003里是choice.exe; m! m- Y$ s  @; ?
choice /N /C y /T 5 /D y>nul, D$ _, w+ R' j+ Q9 x5 V
延时5秒
& Z; c: T! z9 x7 V3 v5 W, G& Y- G  X
35 assoc 和 ftype& ?% I4 l! j' b; L- L0 y1 i' w
文件关联- I1 V# o1 h# U
assoc 设置'文件扩展名'关联,关联到'文件类型'7 p+ z2 g$ ^" c3 y& Y
ftype 设置'文件类型'关联,关联到'执行程序和参数'  [, Y, m( x, i) |2 L" h
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
6 W' q  l% v, Z1 f. B1 ]而是先判断.txt属于 txtfile '文件类型'4 n9 f, K  t% }, f- X* P/ g
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
/ L) }/ ^6 |( n9 e可以在"文件夹选项"→"文件类型"里修改这2种关联0 T0 L& A: }! w) \8 l# U: ?
assoc #显示所有'文件扩展名'关联
. S  I, E! R% T1 R' y$ Cassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile" x. P+ \: z! R0 J5 c
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
% G" D- _0 ?" |  bassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile( ^  _' Y# k/ X3 x4 m
ftype #显示所有'文件类型'关联5 q1 d) ?; a/ V& r6 b# l2 D
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*2 d- I% I/ S* ?* s) B0 A1 d
assoc .txt=Word.Document.8
  D6 c7 s) U% @8 d/ x7 S2 U& J设置.txt为word类型的文档,可以看到.txt文件的图标都变了& a) W0 J' Q) K8 O
assoc .txt=txtfile
/ H( G0 M) _0 _- _! l2 f5 J" y恢复.txt的正确关联: T0 J% O" y: u
ftype exefile="%1" %*7 V+ O( s& i; v$ g1 l3 a1 K- Z+ o
恢复 exefile 的正确关联
6 l5 Q; }1 R/ P( l9 ?' y/ e如果该关联已经被破坏,可以运行 command.com ,再输入这条命令- t& |9 j3 E6 x; }
+ X4 d' W) }! D5 x2 D! y. W" [6 G) i
36 pushd 和 popd
  u7 d3 y$ N5 X" U- X切换当前目录
& Y" C7 ]: G' H% ^6 {@echo off
0 A8 c3 Q  B" _. Z: w3 j6 dc: & cd & md mp3 #在 C: 建立 mp3 文件夹/ w8 D3 c: Q  B# J- w
md d:mp4 #在 D: 建立 mp4 文件夹
" M! x1 K+ ^  @$ D. f$ xcd /d d:mp4 #更改当前目录为 d:mp4
7 j  p. k2 g/ u7 t$ M' M5 h6 \; Hpushd c:mp3 #保存当前目录,并切换当前目录为 c:mp33 C7 j" @0 O; B$ m+ |) t7 D
popd #恢复当前目录为刚才保存的 d:mp44 l9 q  G$ _' J0 G4 u

3 d. A" P7 R/ C5 N% D/ G37 for! S& F2 n5 r/ Q0 O, _
循环命令
- R5 C/ G) [$ |. S! Q这个比较复杂,请对照 for/? 来看
& ?* U( a) |! j8 Qfor %%i in (c: d: e: f do echo %%i: `4 B. H8 g- K) E/ g( h- Y
依次调用小括号里的每个字符串,执行 do 后面的命令9 Y( ^- [! Y- c; x$ S
注意%%i,在批处理中 for 语句调用参数用2个%3 ?! u0 C  `0 ^0 D. B
默认的字符串分隔符是"空格键","Tab键","回车键"% ]0 m# s  E3 l. A) f
for %%i in (*.txt) do find "abc" %%i
0 @8 H4 E( j% h5 R1 h' M$ v! M2 L对当前目录里所有的txt文件执行 find 命令3 Z4 V9 ]9 f0 l# i
for /r . %%i in (*.txt) do find "abc" %%i
2 e4 R5 A( G1 L2 L" [. K3 Z; B% l在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
, ^1 u4 @4 o# p' i% a  L! Rfor /r . %%i in (.) do echo %%~pni  X+ D& _4 s5 t
显示当前目录名和所有子目录名,包括路径,不包括盘符
8 z" @; r6 M# q2 Cfor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt  C& G" y) ]) |+ H6 d! A
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
8 I- \1 G0 {* P" ~" b$ o) l9 mfor /l %%i in (2,1,8) do echo %%i2 D- S3 @3 y0 c: t: f/ {( h+ `# T+ @
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
4 A, r+ i  l, I( Pfor /f %%i in ('set') do echo %%i( S* ^$ K6 o; M( M
对 set 命令的输出结果循环调用,每行一个
- K5 N4 h8 o9 _& efor /f "eol=P" %%i in ('set') do echo %%i
: n& J9 S2 T* i# O取 set 命令的输出结果,忽略以 P 开头的那几行% g2 d$ T) q8 X* q
for /f %%i in (d:mp3.txt) do echo %%i
$ H( q$ o. z4 L" M) M" y显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称* r* Y& B- V0 D5 B# j& n# K
for /f "delims=" %%i in (d:mp3.txt) do echo %%i
: b" V% a! b7 ^+ @. \$ S显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
3 N3 F+ c, |" b" o  x3 g# Z$ ofor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a' e6 i+ I3 P" L5 z- H
对 dir 命令的结果,跳过前面5行,余下的每行取第4列# z3 t7 A  R" n, q) J/ g
每列之间的分隔符为默认的"空格"- s4 D# U6 f" j1 {. K  Q3 ~
可以注意到 dir 命令输出的前5行是没有文件名的
. @) Z3 {6 s0 ^8 o, }for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
. y2 o! E# u8 x: v/ W' Decho %%a
& E6 l; W' Z% ^, vecho %%b
# ]8 S' t0 s" Q# _echo %%c, s" B4 }% K! f# z) ~1 C- M9 q, h
)
9 t. J$ t- |1 s. t对 date /t 的输出结果,每行取1、2、3列
) J. m+ G! Q) z1 H9 t$ i& v: p第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
3 M: b/ q8 J: R9 i, b/ Z' c分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
- L. P: h; M! x: e9 d其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
6 U' f6 g3 W( H/ x9 }0 nfor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b8 P# f; D% T$ U( X8 _& ^9 ~
取第2列给 %%a ,其后的列都给 %%b9 ~3 j( P5 w0 z7 q1 o6 s+ c0 N' }. [

# c/ @& @3 {6 J8 ?  `  Q38 subst (外部命令). H2 E: l8 x" u7 y0 m
映射磁盘。
7 i5 r9 ~/ |( T2 B& x/ Gsubst z: serverd #这样输入z:就可以访问serverd了8 r6 Q/ Q- }' s3 c* C
subst z: /d #取消该映射
& w9 L- @) m. ?subst #显示目前所有的映时
! f6 ~  Q) f  I; ~- W% g
+ B9 Q7 P, q4 T4 V0 V1 f. B39 xcopy (外部命令)( d, k" O* o2 d2 Y6 Z8 J9 K
文件拷贝. }. i9 W9 r8 \: E: W1 Q" i! `# K
xcopy d:mp3 e:mp3 /s/e/i/y* F5 C! g( l  X! `7 }* u5 k9 L. K7 A
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
% ]. n% ?8 \- i  u- m2 R3 p加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
& @: A7 b5 q3 K4 F4 \7 p
7 E4 J( i0 |; m; r. q% d常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退6 d2 E( m' @& b7 Y7 ]
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:
      ; }2 d& f) R% P( ?

    9 {5 n8 [: _" b4 E
@echo off
1 g/ A7 D- u1 |set p=aaa
6 H9 W, w. n% Cif %p%==aaa (
6 j" u: y$ s( mecho %p%  z& J3 A5 u$ [( Q, O6 S: O% }7 K
set p=bbb
% }, H5 _& h* I9 F* w( [echo %p%' u( f  F. A6 X
)3 d7 x, }& i" M8 k
pause
  • 截图:$ ]& [  x* I( t$ @4 h
  • 2.批处理.bat 文件中输出中文乱码
    4 y, A  {4 W6 o2 D3 A; e
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:
      ! ]' z, y9 x) U% Z8 b# c" ?& ]
    • 效果截图:0 F( j2 W, E3 _$ h

      * S7 @: l8 m4 U
    , N7 {  K( }2 x- D* j/ Q: s

: ?! @6 z# j& V

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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