扫一扫,微信登陆

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

搜索
查看: 2046|回复: 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 文件中输出中文乱码
  • 解决方法在文章末尾!
    0 P3 A0 P/ a, G6 z
前言
  • 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效5 x0 Y3 _, _- Y5 I5 ?
在Windows中善用批处理可以简化很多重复工作
什么是批处理?
  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
    / _6 I2 u. o$ |( J: |# I0 j/ c  w# t名为bat
  • 目前比较常见 的批处理包含两类:
    & ~, V4 p  c" L! G4 [9 R* z- m. _
    • DOS批处理和PS批处理。
    • PS批处理是基于强大的图片编辑软件
    • Photoshop的,用来批量处理图片的脚本;
    • 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
    • DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理3 L- b  \8 G, E& T6 M
  • 批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的9 X9 W/ w4 @! ?# j& c. y  S
    命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行
  • 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件

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

- r* a$ h/ A  m' {3 M! e) Q) e2 k$ L' Z3 ]0 i/ K4 i' s- E$ F( L- {
Windows Batch 常用命令6 @, |* z5 P$ B5 ~& N0 u
1 echo 和 @  x+ ^( D  x$ y" u! ~) @
回显命令
5 Z  l6 J2 c; D0 j2 b8 P/ t@  #关闭单行回显  p5 W/ i; }* d2 C1 @% G2 v7 m+ @
echo off  #从下一行开始关闭回显
: Y5 h! q- m; [( f@echo off  #从本行开始关闭回显。一般批处理第一行都是这个
8 v) @" }# o6 k4 uecho on #从下一行开始打开回显
7 I& |& }% A. L1 f$ m7 h5 hecho #显示当前是 echo off 状态还是 echo on 状态6 q: j* ]) G5 s; y3 P" Z, V3 q
echo. #输出一个”回车换行”,空白行2 R! D5 v$ U5 c2 m# b# j
#(同echo, echo; echo+ echo[ echo] echo/ echo)1 n# e' j! _; y7 V. P# y! }

$ |$ O/ ?% b3 L/ w* \& g9 V2 errorlevel) F) r% u/ W- m+ |/ V+ P/ @, c
echo %errorlevel%4 H* s: C0 e( O1 @7 D  v3 x* O4 ~
每个命令运行结束,可以用这个命令行格式查看返回码+ `4 w/ y5 Q: J6 Q$ g
默认值为0,一般命令执行出错会设 errorlevel 为1
2 o6 e( u" Z* y% j
! _" W4 q" a9 o: S$ D- d3 dir
, t- M2 T5 c  M, z4 o& y' B! E显示文件夹内容
3 D5 t4 I9 L, X2 xdir #显示当前目录中的文件和子目录
( |% F8 g1 V! |7 L( o5 v; ^$ ]dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件; u9 z6 }. _$ v3 O; k' U5 w
dir c: /a:d #显示 C 盘当前目录中的目录
# h) S0 r1 u( d" {, vdir c: /a:-d #显示 C 盘根目录中的文件, s1 K) R' J* ~  b# _% r& L
dir c: /b/p #/b只显示文件名,/p分页显示! g8 u) K2 h5 q6 `
dir *.exe /s #显示当前目录和子目录里所有的.exe文件
) z2 t' |# x/ u. h9 W* h) f' q
% C" Q1 \! q- O3 c4 cd+ z6 {+ O) @/ {% I- \7 ?
切换目录% O8 ^: t9 `) v: Z* B
cd #进入根目录0 N  w6 m8 I5 M5 e7 `! n& d$ M) ^
cd #显示当前目录7 V; x# E5 h5 _% N# ?% d8 d
cd /d d:sdk #可以同时更改盘符和目录# }: U' [( L) `+ m- `# n
9 C* p& C7 }( w: r9 ]; S
5 md
* J1 ~/ u7 \% i( F5 i( `+ b创建目录
# G3 p1 \  p( a8 y; s' {md d:abc #如果 d:a 不存在,将会自动创建中级目录
; W) j8 F* c( a* H2 m; J#如果命令扩展名被停用,则需要键入 mkdir abc
. ~" S2 j. G9 `& _( ^" g7 X8 D5 c3 L$ f# n' q/ l* {
6 rd
5 M& R; ?% ?) {% D$ a+ t" Q# v删除目录
( i& m4 m) c; U' D: srd abc #删除当前目录里的 abc 子目录,要求为空目录
/ n  \0 I& `7 S5 nrd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式- {5 E( H! y% ^
3 x# r, o1 E- F/ @" y5 h; i/ k
7 del& N3 L0 b3 k6 F* Y  X+ P
删除文件& z6 b- Z$ S7 d6 u7 V, S! Q0 x
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
% R1 @2 p- C5 ?* J4 l1 h/ Mdel /q/a/f d:temp*.*
: C* u0 W; @  X5 ^5 ~删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录; K! b+ ^  a5 T( q) x. I8 D0 V
del /q/a/f/s d:temp*.*6 A- \) S5 n6 Z  J$ A% C. G+ V1 a5 E
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
  l$ m" {  v$ e: f9 \3 Z! d8 `- y+ x
. a- n2 X9 V: m" {6 o8 ren/ W  {. E. R" f
重命名命令
- G8 ], b/ P1 Z* uren d:temp tmp #支持对文件夹的重命名
1 o( M+ c& k: u! A
$ Q& u( D/ z8 ]+ e2 D" R9 cls( o) I2 L. |& u: \, l
清屏2 c9 |: b4 R, L1 Q% z* M+ j9 W
10 type
+ t& B3 n/ G( d8 v显示文件内容
# D* @3 R. d1 P' @0 E6 V) M) u* ytype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码  r) [8 z( R* f  R5 _  x" U! J  ~0 f
type *.txt #显示当前目录里所有.txt文件的内容( z) i+ z  \, M$ O
% J3 M( b6 f* z8 O2 b, Y' Z& G% Z
11 copy* @; M( m; ^6 {. P% ^: {
拷贝文件* H0 Q8 a. U1 q. s$ V/ }( _( v! I0 v
copy c:test.txt d:test.bak
3 }  |/ z- A: M0 h- k% y" ^复制 c:test.txt 文件到 d: ,并重命名为 test.bak9 W: b! ?( h; P
copy con test.txt+ j; K* q- `0 k2 R% H
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
: M8 _' _9 }$ M: }+ A6 {con代表屏幕,prn代表打印机,nul代表空设备' I1 M1 f7 U+ t+ Q8 \& X' t9 M
copy 1.txt + 2.txt 3.txt
' @- P+ p. a( e/ h8 D合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
+ @- t; h  }: t4 g+ w/ C6 H如果不指定 3.txt ,则保存到 1.txt
$ |( \: d) y! L; E2 K  ncopy test.txt +" n+ h, u2 }" O( Q
复制文件到自己,实际上是修改了文件日期8 o, f" c: y- I* ?' s+ c

- U0 h2 d" r- U% n12 title
/ \( Q- z2 f# s- x% Y7 y0 V- t: f% t/ a设置cmd窗口的标题. ~# S+ A6 w. m: d+ g" ^& y2 V
title 新标题 #可以看到cmd窗口的标题栏变了# F8 S7 ?/ h* r: e# i' g

$ k# \, N+ d; n( t2 D13 ver. h3 ~$ y& d# w/ p6 o
显示系统版本
# G( e# W8 o7 X( d: |% y3 H' `& c# Z
2 R+ x* n0 \7 H* G( K14 label 和 vol& F7 E  s6 w% g8 b8 k
设置卷标
- R* h, ]: g0 s' f: A/ Lvol #显示卷标& }' C8 a. P+ O$ v  K- Y
label #显示卷标,同时提示输入新卷标
7 C( s7 d$ b2 s6 J( k' Glabel c:system #设置C盘的卷标为 system
3 S, f4 h5 x, y% Y5 t2 e
% O9 W* o5 v8 |$ d) F2 q15 pause
* {# j% U& {3 a暂停命令% b8 w' ?4 a8 m' Y- C

. Y; a2 h/ h  \$ A3 [$ {0 E; V16 rem 和 ::' F& _, M+ l' O2 b. @
注释命令
0 R: ^; \8 @; `0 K2 a5 y0 r/ |注释行不执行操作
: m; T. B2 X( Q: `& s9 e  L" w; t! U: X. X2 q# y; R
17 date 和 time
8 J% x3 J6 \9 S( L: r& D6 u日期和时间
- F& S3 X( y5 k" m7 _' Idate #显示当前日期,并提示输入新日期,按"回车"略过输入" b7 H+ `" }. U9 P8 `
date/t #只显示当前日期,不提示输入新日期7 [, h" R% ?3 {% R* Z
time #显示当前时间,并提示输入新时间,按"回车"略过输入" E0 M1 }+ Z' L3 P' v$ w+ a; r
time/t #只显示当前时间,不提示输入新时间" l+ _3 ]' ?  w( C

; {5 j9 P8 q8 D. ^$ A% E18 goto 和 :
# h% m, B) D1 [% q) S+ ^: W- N跳转命令
. D  _3 ?) b# _; b- F$ J, D:label #行首为:表示该行是标签行,标签行不执行操作
$ J# L  J4 c3 E( R0 vgoto label #跳转到指定的标签那一行
$ o" W! u* D, m
! ^1 L2 `4 `1 O/ H4 ~19 find (外部命令)& P$ ?3 C2 f" N$ }) I
查找命令! u# L7 O/ R2 W
find "abc" c:test.txt
$ r% X; ~' J4 k1 w: E' a在 c:test.txt 文件里查找含 abc 字符串的行5 O# B' w) D$ |+ h; e4 c
如果找不到,将设 errorlevel 返回码为10 R4 A2 @. d* w
find /i “abc” c:test.txt! v  s+ i& q$ M
查找含 abc 的行,忽略大小写! m: I# M8 F9 J5 A3 O
find /c "abc" c:test.txt
! h5 x$ H/ ^5 J! F显示含 abc 的行的行数: ~+ \8 n" p5 ]

! Y9 N! J% Y, n& U( U20 more (外部命令)* H+ @$ {5 s- u- X" A& ?  b" _* K
逐屏显示
( b: {  @9 D% D) jmore c:test.txt #逐屏显示 c:test.txt 的文件内容7 T) D& q9 |9 C3 X% t* O

. l$ S6 q( h. ^9 x9 x" }. S21 tree( B5 l, i1 y8 W3 K/ x; g& E- _
显示目录结构6 q. }: A# g$ o% T1 \+ W6 z
tree d: #显示D盘的文件目录结构
4 v* ^) ]' K( D7 `1 g6 P( k: ?4 E5 e( F& U; [2 `
22 &# }, s; p2 i0 x. `+ X) E: t
顺序执行多条命令,而不管命令是否执行成功
4 k" d5 N6 b4 d& G7 i0 Z
: `; [, @4 S/ A23 &&
  d- F! Y; \0 C3 N" a顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令2 z7 {1 _, s3 `" m. H
find "ok" c:test.txt && echo 成功$ E: F5 B: e7 X: w. \+ z1 e
如果找到了"ok"字样,就显示"成功",找不到就不显示
; U" p, x/ T; Y; _
- m9 S' p' t- ]. o24 ||
" K6 n" |) e' I: I5 p6 }% H( l9 R顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
6 A4 [1 ]7 E5 S" @7 Nfind "ok" c:test.txt || echo 不成功' e  `. D! s. m+ S
如果找不到"ok"字样,就显示"不成功",找到了就不显示
, R- G5 a( G7 z3 B$ r2 |8 }! e0 ^; _" p, Q9 S, N9 D& Z
25 |: U: v7 w- }0 N$ I7 r9 b
管道命令
" @3 v1 r* U$ b+ A3 k3 z) Vdir *.* /s/a | find /c ".exe": Y0 N& I5 {( N' w+ ?4 f
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
; x% w3 A* b; j该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
& Z6 `2 p# E, Etype c:test.txt|more% F* ?* x6 m+ W' M9 s+ E- b+ Y
这个和 more c:test.txt 的效果是一样的
. |0 O% E' D' k' p- o5 m2 G( S# p- m# v1 [, k/ c/ f
26 > 和 >>
* o* W$ Q3 x+ W  [输出重定向命令
. [$ R- N* t5 b0 ~2 i> 清除文件中原有的内容后再写入& r. e2 D4 D1 m" G- B
>> 追加内容到文件末尾,而不会清除原有的内容
+ d$ e" p) U* Z5 w主要将本来显示在屏幕上的内容输出到指定文件中
% M2 Z  D* {( @0 t$ l指定文件如果不存在,则自动生成该文件. e; g- u7 \  p! v9 v/ e
type c:test.txt >prn: T# Z* T+ Z1 H" {
屏幕上不显示文件内容,转向输出到打印机' J5 e5 `' Q$ U+ v6 n! n
echo hello world>con
: |2 E+ p/ m1 [在屏幕上显示hello world,实际上所有输出都是默认 >con 的" _2 j7 ?5 l4 u" l+ X; \
copy c:test.txt f: >nul3 S1 X! J3 T. i1 D8 r: y" t
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
" |1 ?+ c- M# B' H5 zcopy c:test.txt f: >nul 2>nul  I  v( ?9 @) O3 @3 s: Q9 h
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
, ~7 r* `# w, C3 zecho ^^W ^> ^W>c:test.txt& }' e" ?% {5 y
生成的文件内容为 ^W > W  u1 d+ {. o* J- I( v' X
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号3 X+ `& y  S1 ^/ R6 X

! H; ]8 ~* s% ^& a27 <' G6 G0 w5 s: c8 K8 E7 C
从文件中获得输入信息,而不是从屏幕上4 |  W* v3 q- E8 K6 [* A
一般用于 date time label 等需要等待输入的命令
, P$ w- V5 [- ?& o( e@echo off
0 V: K; Y7 R; l0 ?echo 2005-05-01>temp.txt
* E% Z; d  \, [& ~date <temp.txt) `# i5 o" r# |2 v/ H- W, ?
del temp.txt
  I8 w- Z& P: ]) \; I# h这样就可以不等待输入直接修改当前日期
  O5 \- |/ ?  v4 ?$ _6 M' C- _5 o: z3 E& u8 M8 K
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
! h1 @4 c8 J  T- h命令行传递给批处理的参数7 x0 F- l& R% k" v2 M
%0 批处理文件本身
) M% A' I. m3 t7 m( ?; N%1 第一个参数" `0 d7 w! ^" E+ ?5 v+ P8 `& m
%9 第九个参数' P! ~- |0 W- z0 P
%* 从第一个参数开始的所有参数. N9 i2 S( |- w  W1 J$ \
批参数(%n)的替代已被增强。您可以使用以下语法:
! Z( j9 }' }5 }# a1 k%~1 - 删除引号(" ), 扩充 %1
* y% t: V8 v* s%~f1 - 将 %1 扩充到一个完全合格的路径名
/ _1 A9 H( k8 Q7 m& J%~d1 - 仅将 %1 扩充到一个驱动器号0 {: ~' h% z. F2 N- Z; e
%~p1 - 仅将 %1 扩充到一个路径$ n1 R. M$ L" e( N0 q: f
%~n1 - 仅将 %1 扩充到一个文件名
+ I3 p6 p* k" O' q" j  x# v%~x1 - 仅将 %1 扩充到一个文件扩展名
1 g. b6 m, p' ]) [  b%~s1 - 扩充的路径指含有短名1 u  \; ^& n0 I# `
%~a1 - 将 %1 扩充到文件属性2 r% q; C! e0 ?% T
%~t1 - 将 %1 扩充到文件的日期/时间& a4 Z+ q) R( {' k. n- [- ?1 Q
%~z1 - 将 %1 扩充到文件的大小
( O0 J) a) ^: u0 P8 z%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1; Y: M; \; K# d
扩充到找到的第一个完全合格的名称。如果环境
' r; H! |! y/ e7 i  g& Y4 ~# O2 K变量名未被定义,或者没有找到文件,此组合键会5 ~1 s* R8 X! @2 J
扩充到空字符串: d$ K$ A% g) L( w
可以组合修定符来取得多重结果:
5 e& B( y+ \. U6 {5 |%~dp1 - 只将 %1 扩展到驱动器号和路径
) n  K/ Y1 u$ t' S%~nx1 - 只将 %1 扩展到文件名和扩展名
+ @* c6 i9 W. o2 N4 [' C5 u%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
- i* g" b# Y5 K$ @9 S并扩展到找到的第一个文件的驱动器号和路径。8 V$ M! I  s, [# Z4 C* y
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。  K7 h) X1 M5 o, w  c
可以参照 call/? 或 for/? 看出每个参数的含意3 T  E# E! s" q1 h( s0 }/ Z" O+ Y
echo load "%%1" "%%2">c:test.txt# s$ E. d: |' Z1 P
生成的文件内容为 load "%1"  "%2"# A) C$ y: W, {9 ^, z4 h$ r' ~
批处理文件里,用这个格式把命令行参数输出到文件
8 ?7 F6 @; \4 [5 b6 P  [* [' ^# D: J$ I) `" p
29 if
4 y) W. g. g, k. o% A判断命令1 w5 ], k, f* S! i6 z
if "%1"=="/a" echo 第一个参数是/a. ]8 o  D4 B. M& n# g. s
if /i "%1" equ "/a" echo 第一个参数是/a
9 K8 I2 }& a! k$ h+ p! h/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
; c' f& }/ b2 b6 ]# `if exist c:test.bat echo 存在c:test.bat文件
' W) A8 F! [) N! r. Y" P* ^! mif not exist c:windows (
0 x" y1 w' I$ hecho 不存在c:windows文件夹/ M. `9 k/ i* Z! `6 W1 a  I( {8 b
)
; q8 y0 H; j2 H) S# Mif exist c:test.bat (; z- z( ^7 v) g# Q7 g
echo 存在c:test.bat
, v! O7 [4 Z2 i8 L  ~+ z) else (
  N* L3 L  [9 _$ o8 _; }3 |echo 不存在c:test.bat* Y7 y+ K0 L+ q1 z" u0 M! T
)0 @% y1 J# ^- e. M
30 setlocal 和 endlocal6 G9 q+ m: u0 Q% v* V; [
设置”命令扩展名”和”延缓环境变量扩充”
% Y, [( B& X# {SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
5 I7 _2 [( L0 P8 F9 X# A4 WSETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"0 Q9 s6 `% Z1 o- N7 d
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"! k. {  F$ J' `# V) ]9 g% q
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充", `1 _, n- `% M" a
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态
2 Y! ?: K' A/ Z“命令扩展名”默认为启用+ {$ M& E. j) T9 }% R- B: I6 O
“延缓环境变量扩充”默认为停用
( m* M5 C( a- d: h批处理结束系统会自动恢复默认值4 ~2 A! |3 |5 z1 h: i6 {
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
, F7 U$ x' i$ E$ }8 S序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
; m) o' c8 k# Z. `* g" S  S保程序能在其它系统上正确运行% L' G+ `- v  t1 p1 e
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
* i+ E0 ~+ H3 U0 w0 k; A6 {: C1 y* X* ^, }/ s) x1 ^; u
31 set( `8 ~' S* k- D& A# W. z8 K
设置变量) @: j) S  H3 A. Y- ]3 e
引用变量可在变量名前后加 % ,即 %变量名%
# D9 Z! |; i6 P! nset #显示目前所有可用的变量,包括系统变量和自定义的变量3 h  }* G0 u# w* W3 ]
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用) C/ F2 @2 Q$ \* F5 `$ v
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
) H$ W0 u1 ~  g- A' P; J9 }2 hset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
: p% e4 T3 i9 g! Y8 D2 O- u# h! Recho %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
. f  M1 B, m6 t4 ?/ eecho %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2# ?1 J! ?2 i7 M7 |& J% H" \( @
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa24 a6 J. o9 T$ L
echo %p:~0,3% #显示前3个字符,即aa1% d, K" c  W* T5 H; Z
echo %p:~-2% #显示最后面的2个字符,即b2, Z. g8 D3 m- c, U$ Q5 L0 @
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b+ ]% d- s9 H- u2 F  F
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
  n0 K: O! Q! Jecho %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2& G' T6 F" o( A8 C; I; ~
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
+ q6 I9 t3 S: S6 n! p( F3 u* Kset p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
% ^# u; T5 r" H' Iset /a p=39 #设置p为数值型变量,值为39: j; S! n. @4 A( K
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3+ z7 U5 o9 s# U1 r, l+ i1 Q
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用% ?5 o0 I) v& `* k# n5 p6 F. g' X
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
# x* J5 c! k! D4 J# ]( {set p= #取消p变量
1 l. r  s5 c' r! W* fset /p p=请输入+ t  `! q6 i3 {6 C
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p$ }) ?/ y1 w" a  d( b- D. i6 F
注意这条可以用来取代 choice 命令
! T2 U0 N- H7 s* r. \注意变量在 if 和 for 的复合语句里是一次性全部替换的,如3 z7 ]) F5 {8 ]/ d3 _3 y
@echo off
  i' w% @0 @% ]0 U( Q1 A, sset p=aaa
( O7 G% I3 w0 d7 z$ i, c2 R& Xif %p%==aaa (% R* {9 e; M$ Q  \3 N
echo %p%, |$ y9 i6 j3 O! |( ^
set p=bbb
) n- ~# m% S, A0 Q3 |2 `echo %p%
+ L0 u( M1 A" a5 A1 i" m$ r$ I)5 E0 B+ m. U1 l& Q
结果将显示; W0 S% ~. |9 X& H8 n, ^; s5 d
aaa
7 c- P! {6 s+ ~  F4 ~5 d" Naaa
' t2 C! M  P7 q1 V因为在读取 if 语句时已经将所有 %p% 替换为aaa6 U7 P* k9 T  L% R
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"/ i6 e' o9 K; a9 j  L; K+ i- Q' Z
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!  F& u( J; e5 ~1 ]
@echo off/ r  t& E- F4 [
SETLOCAL ENABLEDELAYEDEXPANSION6 R. i0 z; e9 I. \* c* {
set p=aaa5 H" z4 Q$ s* g6 j
if %p%==aaa (
! C6 t, f& a$ eecho %p%
7 p) H3 b+ F% h+ ^  h9 d) eset p=bbb7 a9 }! z/ _# R  D& Y" U
echo !p!
( Q. v" Y  m  ~% G' o. X)% M' l3 P4 j7 M% b2 }
ENDLOCAL
: x$ f% q/ ]! B: f; m结果将显示0 A: P  Q0 m2 I+ ]; T
aaa
6 z9 i2 y! m6 W- Z/ H3 S8 _! O7 `bbb
+ z3 ^9 R8 n. \) V& @还有几个动态变量,运行 set 看不到
" l5 A" d! C3 K2 O%CD% #代表当前目录的字符串7 d% `$ J& S0 Q0 X2 C! E
%DATE% #当前日期7 I' o1 m8 Z, `; k. c
%TIME% #当前时间8 d7 m4 G5 x& O! I& a+ c# N' C
%RANDOM% #随机整数,介于0~32767) I- c% w: j, ~
%ERRORLEVEL% #当前 ERRORLEVEL 值# w& M+ W$ N1 g( Y
%CMDEXTVERSION% #当前命令处理器扩展名版本号# j' l! Q- Z8 O. y4 t
%CMDCMDLINE% #调用命令处理器的原始命令行
" p! m: }0 z5 m+ I可以用echo命令查看每个变量值,如 echo %time%
! U$ B  U" w' p) `; X注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到% \: d) ~5 ]0 x& d
2 z8 {# f( X0 z0 r# y
32 start
. k) [6 ~  H! l  i批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
- F! b4 R8 m# s( r
% ]6 ~7 i' c! M( m33 call
  D$ S/ s- r% e+ q3 F! \, v批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行* j1 ]: s- }4 f: F
有时有的应用程序用start调用出错的,也可以call调用
& W+ [) V8 g  D9 k, M! ?( v# O7 Z. r5 A- t7 O' i+ T
34 choice (外部命令)0 J+ K( K* e1 B$ O
选择命令  J- u3 q; X& x8 T
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
  {& r! g9 y8 w2 O9 ?win98里是choice.com  F/ i8 }. P# e9 [
win2000pro里没有,可以从win98里拷过来
) Y: i8 s* W7 I3 Uwin2003里是choice.exe5 o. p$ R$ N  N# k0 ?. P
choice /N /C y /T 5 /D y>nul$ }% I0 j# n( `" F6 e$ M
延时5秒
& N8 W; E7 r( [9 u+ L6 Z- [5 _# n3 N& a( Y; S7 i* E- E( L
35 assoc 和 ftype$ N8 E' \& |! E7 W8 v
文件关联; J) T! d# B' m) s. E: \( a
assoc 设置'文件扩展名'关联,关联到'文件类型'! y8 h0 Y7 y! C. }3 L: A  O
ftype 设置'文件类型'关联,关联到'执行程序和参数'
7 E6 E+ q& l+ h7 Z* Z/ P0 Y当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开7 A$ \8 A* l5 v$ F. c) K4 d
而是先判断.txt属于 txtfile '文件类型'5 \" K" r9 M- _; m' Q: n
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1& b: n$ g8 F9 w: }* W
可以在"文件夹选项"→"文件类型"里修改这2种关联( A" R, S* p" ]7 q2 ?$ \
assoc #显示所有'文件扩展名'关联
. d1 ]0 |" r7 r2 Yassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile2 `* s0 Q& w  m$ G
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8" @% S* X, b' M$ C
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile' c% v0 D6 f8 Y$ f+ ]
ftype #显示所有'文件类型'关联* Y) p( @7 q2 {9 e  [$ n* |7 d
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*9 S0 P6 c0 u; p1 P3 p
assoc .txt=Word.Document.8
7 |% V# n. `# ^" V4 i/ u, i设置.txt为word类型的文档,可以看到.txt文件的图标都变了1 z1 P( I+ r: m/ t
assoc .txt=txtfile  @- @; N" t0 O) i
恢复.txt的正确关联6 T' e( w  e' s! Z0 n
ftype exefile="%1" %*
7 F5 w# X( W( |- f  u! ]4 \" B. d4 n恢复 exefile 的正确关联  t  X& R- q3 h  q+ r7 u6 b
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
, |1 i! R" d; o" E, ~  N  l! [% w; Z! o; @( _
36 pushd 和 popd9 m, Z' g- y+ i* A, r3 d3 V
切换当前目录
8 r7 y' [. e- D2 |+ p/ s@echo off
7 E+ B9 V4 ?5 J% K/ pc: & cd & md mp3 #在 C: 建立 mp3 文件夹
4 ?+ L+ d+ i+ lmd d:mp4 #在 D: 建立 mp4 文件夹
" d4 B2 f" m0 |; V6 Kcd /d d:mp4 #更改当前目录为 d:mp4& k* B5 t- L4 ^; ^, D; F
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3% k5 D: a3 f  \& e0 o3 m
popd #恢复当前目录为刚才保存的 d:mp4
( f) y+ u" t% S; o3 q6 E
: l! u/ l( }: Q( r" {4 Z3 ^37 for
7 [& B. x: s* v4 b. _循环命令) e9 H$ H, _4 c/ W- Q$ n( o
这个比较复杂,请对照 for/? 来看
. }( a5 z' V6 u! j5 O/ g2 lfor %%i in (c: d: e: f do echo %%i
. T9 u# i2 e" s9 w' C依次调用小括号里的每个字符串,执行 do 后面的命令
; A: e6 i: f. ~/ A注意%%i,在批处理中 for 语句调用参数用2个%% i( p/ g4 K# r8 k, H& N8 M' l
默认的字符串分隔符是"空格键","Tab键","回车键"/ A. D2 v: r5 _) G3 J
for %%i in (*.txt) do find "abc" %%i
; J9 w( `8 |/ [1 E+ T$ q% M对当前目录里所有的txt文件执行 find 命令
0 a8 }8 y, a; \1 T4 X( Ifor /r . %%i in (*.txt) do find "abc" %%i" m& K: E& l( D; D- ]2 I" [1 `; j% m
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
- P% X: N1 d/ d. xfor /r . %%i in (.) do echo %%~pni
' A% K3 D( m; m显示当前目录名和所有子目录名,包括路径,不包括盘符
  N; n2 @) W. ]; C9 K1 Vfor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt9 ~( M5 E' I% R' X, r
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去3 s8 F0 g% \) G$ a0 `
for /l %%i in (2,1,8) do echo %%i
- q8 S. \* P- O: h生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加15 Q4 C* P+ d! t& ]
for /f %%i in ('set') do echo %%i
$ N2 R; W3 e' n( c对 set 命令的输出结果循环调用,每行一个) j6 A6 c0 ?9 ~# A; ]. S
for /f "eol=P" %%i in ('set') do echo %%i! u* T& _! F6 X% K6 h
取 set 命令的输出结果,忽略以 P 开头的那几行
/ p# h; ]% g7 H! P/ p8 I1 dfor /f %%i in (d:mp3.txt) do echo %%i
% f. D8 x" L- G; s3 H2 [$ D2 @显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称3 q) v  G: f: o/ [
for /f "delims=" %%i in (d:mp3.txt) do echo %%i
# s( n% }# [& K显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
6 o: d( P$ V/ a4 m' u: H) rfor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a; |2 y; A5 K/ t' C5 [8 Q
对 dir 命令的结果,跳过前面5行,余下的每行取第4列$ P- m/ O& R0 b. L: b3 @; Z
每列之间的分隔符为默认的"空格"
% c% u$ y* `! j4 ]8 h# j可以注意到 dir 命令输出的前5行是没有文件名的
# t1 `' \' g# H8 [% x, j. ~for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
% [7 _0 F! X% i& [echo %%a: ?% e" e5 ^+ n/ y
echo %%b
/ I6 K0 }2 m- T5 J$ i, {, ]' h7 Techo %%c' y8 S0 D$ E5 G( L1 p* S
)2 G3 _) F9 p4 q& F" |
对 date /t 的输出结果,每行取1、2、3列9 q+ L/ ~% f2 j8 M; M- {' b
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列* b0 A( D9 f' O. ^
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
7 W- Z5 v: r6 l3 T* p7 Z其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
; ?5 j) i5 J8 X  r, Jfor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b1 V! @0 v9 h; v: @2 s1 C
取第2列给 %%a ,其后的列都给 %%b! d4 R5 _% R( _$ Q* u# w

$ h; [7 d& Z# d  O' W. h38 subst (外部命令)! C6 ]4 }7 }  G; s; u$ j
映射磁盘。9 s# Y7 v6 s/ i
subst z: serverd #这样输入z:就可以访问serverd了
# |+ F, }9 `- q* tsubst z: /d #取消该映射1 P6 g  X& @+ y% |/ x  z
subst #显示目前所有的映时5 P" ^( k- ~) I/ u7 A

+ ?6 W( X* s; X3 t5 ^; n: A39 xcopy (外部命令)
$ \5 I3 o3 X: l文件拷贝) N$ a4 W7 G% v8 e) F
xcopy d:mp3 e:mp3 /s/e/i/y' r# \1 d) V; f+ f
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
5 u$ L9 R7 M) a% r8 [加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问0 F9 S1 i2 e0 h8 q8 J/ o. p6 Z) A
( L4 L1 x7 M$ S& J; T
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
    ! ]! i9 Z" [: \! c, H. Z
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:7 [7 n' D: v) G4 l+ d7 E
    9 O3 G* q) s8 c: _# Q
@echo off- W4 }# j8 _, a) Y' @1 D
set p=aaa
" W& q$ M4 G4 F& v6 dif %p%==aaa (
( e! @; g' X# I8 U. Necho %p%
4 h& H0 B% J, a" ]2 o8 E! m( Qset p=bbb
$ h( V# I( G; _* {* {/ J: U- L2 u7 J, ~echo %p%9 [- e. A. d# e3 D' G/ X
)- `  Z9 t! u& e. D; [0 p. s& T
pause
  • 截图:) L5 D; D) N/ ]9 k5 z
  • 2.批处理.bat 文件中输出中文乱码

    " @" u/ C2 y* j" ]1 ^0 d
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:
      ( z! l0 @) P) z- J# ~) h+ Y' d9 O& I
    • 效果截图:
      3 Y0 _# W1 R* [5 P4 M, `* T# j; G7 n, J

    6 G7 l7 Q2 P3 F
: Y9 k; @! U- V

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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