扫一扫,微信登陆

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

搜索
查看: 1773|回复: 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 文件中输出中文乱码
  • 解决方法在文章末尾!1 K  P7 M) M3 D6 k9 G3 b% V! q
前言
  • 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效
    % Q7 o( J7 _9 D' f+ _( ?" I6 r
在Windows中善用批处理可以简化很多重复工作
什么是批处理?
  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
    , u  n- e; R( M) X; H% o. X名为bat
  • 目前比较常见 的批处理包含两类:
    # c. [; A- v7 u" A0 w- Q
    • DOS批处理和PS批处理。
    • PS批处理是基于强大的图片编辑软件
    • Photoshop的,用来批量处理图片的脚本;
    • 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
    • DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理8 `) y2 _- @- q4 ]. X5 x
  • 批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
    6 A) ?( P! G  p. ?+ s6 Q' n" c4 @1 T命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行
  • 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件

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

7 n. n" n8 s; y* Z; [% k+ n0 C: [6 c9 N6 Z+ }
Windows Batch 常用命令
6 O4 B/ X: C' Y' |# C# l0 |1 echo 和 @
7 ~: N- q! w& \2 ?: S! T2 H回显命令# d7 w" F3 F3 a% P, W- D
@  #关闭单行回显- {3 P- v/ |5 k% ~  x4 {: o" R5 V
echo off  #从下一行开始关闭回显+ [0 r. L" p; l  Y8 W7 y2 D7 h
@echo off  #从本行开始关闭回显。一般批处理第一行都是这个
  b/ U: ?8 G# N8 u. h* F9 Lecho on #从下一行开始打开回显
4 @. O/ b4 w+ D7 fecho #显示当前是 echo off 状态还是 echo on 状态
7 P+ ~$ [8 o8 X6 |" F3 }9 Yecho. #输出一个”回车换行”,空白行
& }' ^$ d) Z. {" ^/ q8 b6 h) {( p#(同echo, echo; echo+ echo[ echo] echo/ echo)( f) P! L# O! z3 P% V% e

* ^- u$ ]) A" N% u2 errorlevel
* J/ m) Z9 ~7 p1 R7 `  Lecho %errorlevel%
2 y0 i* i3 j: E$ l- k每个命令运行结束,可以用这个命令行格式查看返回码
. F! |! Y, |( G7 g1 K) L1 x5 X默认值为0,一般命令执行出错会设 errorlevel 为12 m" H, M% h3 `9 Y; k% r5 O

, k+ @7 k* G  w3 dir! S. B8 C! a3 }( \  L, p
显示文件夹内容% z2 c3 c" l5 a+ _; E- k; F
dir #显示当前目录中的文件和子目录
/ _9 z$ N; u/ N( Hdir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
  i3 k1 k9 f, ~3 ~4 \dir c: /a:d #显示 C 盘当前目录中的目录
) u0 w( `+ n- h$ B6 P6 t& Edir c: /a:-d #显示 C 盘根目录中的文件
1 ]3 d& `$ F* edir c: /b/p #/b只显示文件名,/p分页显示! P3 ?# a) M3 j3 x, H4 x, m
dir *.exe /s #显示当前目录和子目录里所有的.exe文件
9 b' h; c0 e+ n4 |  ^' K) [) K' z1 s8 V
4 cd3 I$ W/ a  q! P* s: z4 R+ C
切换目录
$ Q7 p5 R+ u$ N% j9 g5 z! Ycd #进入根目录
' ^' O" ^; k9 xcd #显示当前目录
7 y- M  p! w1 K) Wcd /d d:sdk #可以同时更改盘符和目录6 c/ G5 g7 m: B& L. A+ P
4 t, v8 G" ~8 a& p/ S8 z9 s8 ]! p
5 md7 `4 n2 J5 y9 `! k! C
创建目录
% e7 ]) P( v# ]: E2 Rmd d:abc #如果 d:a 不存在,将会自动创建中级目录2 n4 H/ h6 D+ y+ @2 A8 I
#如果命令扩展名被停用,则需要键入 mkdir abc
9 V+ O% Q9 a- G; Q# [4 Z# r7 u1 e& `& q4 G7 G9 l, n7 R
6 rd& U/ h# G* K7 r% P5 @0 T" Q# Y( |9 F
删除目录
- U+ t: d- W/ ^9 Nrd abc #删除当前目录里的 abc 子目录,要求为空目录# q& H1 x! I! `: f' H9 k
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式* @/ ~9 \+ n! f, W

+ e* T* _, a0 ?, i6 \7 del" A6 @3 m' T+ z; b5 u7 S- D' R$ C; H
删除文件, {2 z- L& V+ ~& z
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件$ i2 q' S5 k* Z" G# ]$ g
del /q/a/f d:temp*.*. J3 J8 f/ X4 K  q" C8 P  S
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录! h, D+ _( `" h9 u+ N
del /q/a/f/s d:temp*.*
) f% d7 {1 D) U7 Z$ a7 B& e: o删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
* x) K1 B- b# Q& u3 N2 b2 Y' A
& k" v* U" k3 }8 ren& o" q9 j. X3 P: W3 x
重命名命令
" u' O  I! S' Aren d:temp tmp #支持对文件夹的重命名
5 x6 g) \+ j) c6 t9 `: }) a1 N# \6 c8 a9 D4 R0 x
9 cls
0 V1 w5 q5 s. ?6 z& o7 u9 M) b; {1 ~清屏5 m( r, v' w: B
10 type
  d5 _9 X0 C! Y2 C0 |显示文件内容
3 k( X6 r! M" s0 l5 htype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码2 L* f. e& H+ t# l
type *.txt #显示当前目录里所有.txt文件的内容0 A* k/ {9 T, K" x2 b+ L$ C. |, s. [
/ m; ~0 R: {0 a8 t
11 copy' g7 x  K% ]( G2 [2 H/ U
拷贝文件
% t! _, R2 ]0 Zcopy c:test.txt d:test.bak
# i. E! _" p6 a) ?' U1 M7 e复制 c:test.txt 文件到 d: ,并重命名为 test.bak
) q2 f" }4 H4 t: l4 hcopy con test.txt5 q9 }  t# [0 D
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
& q6 j1 E1 E4 n" F2 Hcon代表屏幕,prn代表打印机,nul代表空设备  O% Z8 S9 j' H( n/ q
copy 1.txt + 2.txt 3.txt
& p8 R% h2 g3 p" ]- y& K/ ]合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
0 M* Z% n  X! ]4 V, T6 d如果不指定 3.txt ,则保存到 1.txt; g9 F) g4 V* H7 |$ M
copy test.txt +& ?5 W/ X" c5 X
复制文件到自己,实际上是修改了文件日期
) Z' _# a# _, B
4 G" t5 h% }* Y' C: q% q12 title
6 o. }0 l0 e& C% r3 E) P0 K设置cmd窗口的标题
$ Q% }# f- w; \- p- N1 d0 ltitle 新标题 #可以看到cmd窗口的标题栏变了
$ l& ~) V2 r: o; T3 z/ F& m/ a) e6 e+ ?
13 ver! w& o- l! s9 @4 S1 i7 W3 Q
显示系统版本8 A# _) n+ ]1 g! F0 G
) V' u: K3 k( x
14 label 和 vol5 L! N3 o' M/ y/ o# y  B9 \
设置卷标
& ~( X) `1 L) h8 o$ fvol #显示卷标6 Z8 ~9 `( s3 [4 X; X2 |
label #显示卷标,同时提示输入新卷标& s' `& k3 _& h+ `1 W( q
label c:system #设置C盘的卷标为 system, _  |5 T* r! B2 {* P" A

( p0 N; L6 M3 B15 pause
0 k: Y1 P0 m/ O9 F暂停命令
! C3 ~% F* D& a6 w+ Q7 k5 M. p9 r6 I% a6 X' s# W* z1 f. |
16 rem 和 ::
6 u4 W0 E% b& `9 c: J$ o注释命令' v& \- O( x5 ~3 N; E' C
注释行不执行操作
' J$ c" i7 c& {% k" m6 Y
/ L; i, T+ U: Q17 date 和 time  S: Y0 D: w, v2 r$ [* t. f
日期和时间
$ {. T6 X/ e. V: y! e! F* Adate #显示当前日期,并提示输入新日期,按"回车"略过输入$ Q  c: g/ O* M! z' N8 I0 b. g, M$ i( h
date/t #只显示当前日期,不提示输入新日期0 M; [+ j! z4 f! b: T# m
time #显示当前时间,并提示输入新时间,按"回车"略过输入6 [/ y7 ~# o6 a; c; V; u
time/t #只显示当前时间,不提示输入新时间# g& `. [1 }1 `) n+ N9 P5 Q

& D6 T; z2 y* q; p) \18 goto 和 :6 S, C( t: `' Y; D! W0 F0 l6 p
跳转命令
# ]' {1 k. D# B3 t1 ]:label #行首为:表示该行是标签行,标签行不执行操作
. Y1 |% X2 g+ X( {- lgoto label #跳转到指定的标签那一行* m9 c& A" ?. H8 U4 R. K
" c# }- k) ~. T0 s7 I
19 find (外部命令)* F" a9 b' D3 z# ]6 O
查找命令
# Y& E0 `, T  d1 v- Tfind "abc" c:test.txt. J* R7 Q3 ^' d2 I) A( V
在 c:test.txt 文件里查找含 abc 字符串的行/ Y# Q: a1 T: Y' i
如果找不到,将设 errorlevel 返回码为13 K9 w( a8 s+ S) Z  m
find /i “abc” c:test.txt
9 ]. y5 `* w# T5 u! c查找含 abc 的行,忽略大小写
$ U( Q% x3 V0 x  ~4 nfind /c "abc" c:test.txt
- g: |8 q3 V. q: _) e8 ]$ U显示含 abc 的行的行数
) N. u. g- a& c- U4 y; d6 G% X& ?) p- C& K1 A/ @, p5 w8 ~& `) P0 t
20 more (外部命令)
3 K9 t  m- h  T4 m逐屏显示
# n0 O) l& w! Z0 L' p6 e& Y; Kmore c:test.txt #逐屏显示 c:test.txt 的文件内容
$ I, D4 u  C/ V5 C1 [( D  l  b& L8 e
21 tree) E1 ]+ l+ b! E' a8 K! c* W
显示目录结构: d: `! n" p+ g# h- |5 V( L
tree d: #显示D盘的文件目录结构) K% H. {, {4 Q

/ ]% x' R/ b, v. c& J22 &
2 Q' I( O( Z" ?2 i顺序执行多条命令,而不管命令是否执行成功
1 B9 c; h. Q$ F0 i* M$ \* Y
; I7 g  a' g; n, y23 &&
! s+ f0 z3 B+ v* n. E# l* ~顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
5 X$ L) w, W6 zfind "ok" c:test.txt && echo 成功
( J1 O0 V9 i/ E6 i& k1 d6 r/ k4 @如果找到了"ok"字样,就显示"成功",找不到就不显示* H' M2 u8 G, I1 Y' W

4 I" Z* @) Y" S  z3 ^. _8 L, _1 l24 ||
& ~) @9 H0 j) A8 T* O顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
! Q" B( x0 ~  f7 M! b0 h, o4 {( B( }find "ok" c:test.txt || echo 不成功) E$ z# Y* v- X9 d
如果找不到"ok"字样,就显示"不成功",找到了就不显示% X0 `+ z& F9 Q6 e+ M# n" D" r8 Y
+ X) ~: Z8 {' u: B$ g9 X) e2 h9 z6 {
25 |* h- L* p! C& s3 L9 n- X$ C% W3 z; o
管道命令& f4 v% B0 i( {8 a- |! p5 l
dir *.* /s/a | find /c ".exe"
, r9 U) Z" M8 D) M4 }( e管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令; a; T1 d) C% g
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
4 L! h! B" W6 k$ _# H& Ttype c:test.txt|more  ?7 u; }) b" f1 ?( S7 v8 Y/ N2 ~
这个和 more c:test.txt 的效果是一样的0 W$ \. I% M; `2 b( E/ Q
- c/ R2 |$ J2 d% r
26 > 和 >>
# T( }; n1 ^2 r7 X6 _6 W% B输出重定向命令
/ H* H) i8 g1 t5 u* D2 Q' ]- g3 _> 清除文件中原有的内容后再写入
" R6 P- n/ u4 m5 O/ K>> 追加内容到文件末尾,而不会清除原有的内容, B. y, r5 H$ M" }: m  F
主要将本来显示在屏幕上的内容输出到指定文件中  P" d$ n0 N" H& e4 }( O2 f3 y0 g
指定文件如果不存在,则自动生成该文件! ~" I$ ~$ f, A# E% X0 ]  x
type c:test.txt >prn
" a3 f1 u2 A; x3 }' |0 P* F( _屏幕上不显示文件内容,转向输出到打印机7 }0 r) _0 |9 }1 g
echo hello world>con
" d$ f( R$ W8 \: S2 P6 A在屏幕上显示hello world,实际上所有输出都是默认 >con 的
) [  h& S  k& }# g# Tcopy c:test.txt f: >nul
1 s0 Z5 ~. x7 W1 e) q# E( `拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息" a& t9 T: H, w: w% @5 w
copy c:test.txt f: >nul 2>nul; K, W( l# g" B/ t9 O: [$ ?
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息4 m. r5 b2 M9 J* h3 Y2 o9 b
echo ^^W ^> ^W>c:test.txt2 |0 y. C" Y. q8 l
生成的文件内容为 ^W > W
! i! ^; e2 y) C6 f^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
; R4 l9 w: Z5 p& [3 D* `4 |3 _' C7 P3 F. L5 Q% H4 x( k& ?
27 <
, g' X  b: q2 U从文件中获得输入信息,而不是从屏幕上
: I! ?( H- Y) T  J0 ]4 P/ e- ~  H一般用于 date time label 等需要等待输入的命令
( G5 \' `0 {* `# v- [% Z  C@echo off
8 E2 b: Q: V, e/ G9 \8 zecho 2005-05-01>temp.txt
8 \( A% N8 _) v2 ]8 H: @date <temp.txt
& Q" P$ E  F: k7 c( _: Q6 S5 L( Edel temp.txt
8 c6 u6 b# z1 i$ D. ~4 B. d这样就可以不等待输入直接修改当前日期3 z" _1 r1 i+ ?" [7 L' W( m
) V) A" q# t7 W; n7 V; D3 h+ t8 G
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
2 Q$ ?; I- }1 f. f3 {命令行传递给批处理的参数! [. P* B4 L' o2 ^9 t
%0 批处理文件本身
) ]2 U6 a4 z3 o%1 第一个参数
' R) K( _5 L, @8 H% _. d%9 第九个参数0 n5 b2 l2 s6 b8 |
%* 从第一个参数开始的所有参数9 E0 N% i$ r3 X, D  J; f
批参数(%n)的替代已被增强。您可以使用以下语法:
: [8 r% x: _+ z2 y& [" X6 q%~1 - 删除引号(" ), 扩充 %15 Z" W: {- H: r
%~f1 - 将 %1 扩充到一个完全合格的路径名
. S& w! h8 I- N! V) t4 @2 s%~d1 - 仅将 %1 扩充到一个驱动器号
' K9 H6 j( r# p%~p1 - 仅将 %1 扩充到一个路径
6 `4 f% y$ E7 O3 X; `$ X3 \+ y%~n1 - 仅将 %1 扩充到一个文件名( q8 q& V" X% r: H1 {3 V4 }4 m
%~x1 - 仅将 %1 扩充到一个文件扩展名5 X( u& B! [, g$ t7 c# e
%~s1 - 扩充的路径指含有短名
% A: G* w/ L) }: R. g/ d: m%~a1 - 将 %1 扩充到文件属性2 ^1 s) M0 o8 s
%~t1 - 将 %1 扩充到文件的日期/时间
' M2 `7 \1 [+ `%~z1 - 将 %1 扩充到文件的大小3 N( g. [1 z4 S
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %14 k$ r( ^$ f5 I  [# l: x' o
扩充到找到的第一个完全合格的名称。如果环境/ \6 y& i9 d7 N, x% E) q# m
变量名未被定义,或者没有找到文件,此组合键会
; d, t/ Z7 Q8 I扩充到空字符串
& f# j( A7 O& M  g( n9 k可以组合修定符来取得多重结果:
* i+ g3 Q. d; B  S2 P- B%~dp1 - 只将 %1 扩展到驱动器号和路径2 R: R$ t) `, X/ ~% L7 [
%~nx1 - 只将 %1 扩展到文件名和扩展名- O7 |" |2 Q; v4 h" {' X6 s& Y8 o
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,. j, u0 A9 s- \7 x! v9 q
并扩展到找到的第一个文件的驱动器号和路径。4 l5 C* _. O, `7 N" D# {
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
& I, _8 Y" n" h+ x可以参照 call/? 或 for/? 看出每个参数的含意- z' P: k& d- D( p+ r
echo load "%%1" "%%2">c:test.txt
6 Y  a0 p" F* C- N9 s3 q0 L7 a9 I生成的文件内容为 load "%1"  "%2"
1 I; l7 V- d2 v. y) n/ x批处理文件里,用这个格式把命令行参数输出到文件8 m0 I! `" U2 ?- k% f/ m

" H2 q" a* Y; E. I) `, z29 if! F& X8 o2 S+ G; k8 B3 O+ g
判断命令
/ s9 m3 R1 O6 D+ X/ dif "%1"=="/a" echo 第一个参数是/a+ A' `- {; j  I$ D
if /i "%1" equ "/a" echo 第一个参数是/a* o3 L7 ~# u$ F2 p
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
# V3 X! i# ~$ o# bif exist c:test.bat echo 存在c:test.bat文件# }- n2 V2 W6 c. J* U/ b7 e0 R
if not exist c:windows (
9 Y7 y$ l# J" Z. ?- m) uecho 不存在c:windows文件夹
5 a, s3 M7 q6 f)
6 l- h. l! v  S& M! Q% \2 Wif exist c:test.bat (. S3 \: @5 a6 E
echo 存在c:test.bat7 P' t; @/ M7 f/ {
) else (
4 o/ n. v6 m5 L6 @echo 不存在c:test.bat
: }1 s+ g( U  l7 s% A1 k)4 X7 }& d4 ?, J, c
30 setlocal 和 endlocal
- @6 ^( T/ @& T& f5 a设置”命令扩展名”和”延缓环境变量扩充”2 d1 F3 z  k  T& T' B1 B9 y/ u$ y
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"8 n1 u  ?: I9 r: \5 H6 b
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"# l8 }: u+ G6 X2 Y7 a+ N
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"# s/ l& V' T% u+ \
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
& ]( }6 `: d) wENDLOCAL #恢复到使用SETLOCAL语句以前的状态- m  n- g; z; W% n2 ~2 v) }
“命令扩展名”默认为启用
. r1 M# P- q) q“延缓环境变量扩充”默认为停用0 a. U! U; f' M/ F3 K' X
批处理结束系统会自动恢复默认值
  g2 \7 j+ O- r. o) h/ a5 A0 h可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程3 i) j5 e, s" P; H
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
( Z$ a, \7 l8 r( a5 x+ Z保程序能在其它系统上正确运行
6 x' n* K" m8 w; m7 g"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
0 T! d, D4 J: f
3 s# X# Y# k9 G" Y: @31 set
$ Z: l& G' o% w" q# E  O# ^设置变量. W- }( x9 K6 _/ O. P
引用变量可在变量名前后加 % ,即 %变量名%' a: {9 x+ C6 d0 `5 Q- P
set #显示目前所有可用的变量,包括系统变量和自定义的变量- f+ d1 B: O4 O
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用  |$ A2 y7 k# B7 Q4 a4 [2 f/ b
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=11 W) Z! e, [; S
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb23 k0 @0 m( c) [, C0 A8 S
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2: W/ R. L; `0 x6 {$ F2 [) u( _
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
0 o! |# i. u2 Hecho %p:~6,3% #显示第6个字符以后的3个字符,即aa2
9 Q1 k( s& h& ^/ Z' yecho %p:~0,3% #显示前3个字符,即aa17 n% H6 y+ b) ^- }5 ~
echo %p:~-2% #显示最后面的2个字符,即b20 c& C1 |) n; e
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b; c* A6 N1 }7 K
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2$ R) Q. v& b  b# O3 |: X; a
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
0 [5 y) ^9 ?- {5 Kecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb26 F! R) S; O1 }$ \- l. P, s
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
/ W+ ]9 ^7 ~7 J! eset /a p=39 #设置p为数值型变量,值为39
& F3 W: m, s' m* Y$ l0 c/ O; {; {set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
9 w+ k9 R& R  e* E  jset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用- B: v$ z, L) n/ q( O( W0 B
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?/ u8 W2 y: U7 d, G& @! D$ ~8 m" V+ j' c5 @
set p= #取消p变量
7 U( i% s6 i5 U0 g3 yset /p p=请输入- r1 u& L9 E2 h0 R4 S: o
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p9 g: Q( S' f% B( C3 {' U; B1 t$ y
注意这条可以用来取代 choice 命令+ A, t! G0 [1 y/ ^
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如0 q3 N- C1 C% e' ?! w# w
@echo off
5 T$ r# Q$ _8 Y5 \% m' q2 q4 \: Cset p=aaa
$ B% F  v3 B' `" V& v9 X) X0 `3 Iif %p%==aaa (! ?' h4 R  M0 v. L5 }
echo %p%3 {" r# Z. B0 k4 M1 P( o
set p=bbb
* _) Z. @7 Z; ^echo %p%
" g+ K6 J; h  r. D4 |" I)
" |+ C3 A/ v8 D6 U5 C结果将显示
  p% d1 L% |% T& Y/ i& aaaa9 u* e$ [) N' k7 o+ ^
aaa, j8 y- w( L% a5 U; Q
因为在读取 if 语句时已经将所有 %p% 替换为aaa
6 }) n, ^: T* k* E+ e/ j这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
  x4 d$ Z6 l( c4 N$ g) I) t) I# [可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!$ m7 s# g: L$ V5 v7 I
@echo off
6 s: H/ K! P- j" iSETLOCAL ENABLEDELAYEDEXPANSION$ B' B9 c+ m9 k- \3 [! {
set p=aaa
5 F+ c+ q, z2 b6 Kif %p%==aaa (# I- m* v9 m( {2 p. k7 ~& X
echo %p%
2 C- O( m+ P4 j# ~. dset p=bbb
6 Z& v) Q. J8 J' [/ r( Q# B5 hecho !p!  Y; q4 U, X8 z/ J5 p. a! j* s% T
)- F* |8 ]6 H( [$ J% b1 }
ENDLOCAL. V7 J3 `, s( S0 n- G* j; s5 [
结果将显示: }5 V: q2 ?, \
aaa
4 |/ s' `* M2 _- F# tbbb
, ?& S4 u+ }9 G- v0 y0 d还有几个动态变量,运行 set 看不到
5 c9 z; m# b& K. t%CD% #代表当前目录的字符串
6 v( A+ b1 ]7 P4 g$ r8 `) n: ~%DATE% #当前日期) ], @2 t& Q3 R% i
%TIME% #当前时间
* x, B- E$ f7 D$ D& d4 ]! @2 t%RANDOM% #随机整数,介于0~32767( [6 K- u. @, e# ?. h1 `+ \
%ERRORLEVEL% #当前 ERRORLEVEL 值
! m7 p9 O- t# X* _( x%CMDEXTVERSION% #当前命令处理器扩展名版本号
7 Y# R3 v* y3 q1 O. y5 t( t' N1 z%CMDCMDLINE% #调用命令处理器的原始命令行
+ L8 o6 n& Q1 s2 q* h3 }2 {. T% m4 _可以用echo命令查看每个变量值,如 echo %time%
: [9 M6 _1 }! y  C4 }+ M3 v5 B注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到' ~4 q9 k3 }, {  f) v1 C! l
9 ^0 m* `; o5 u3 v
32 start) [; L# q/ a8 }& M% R
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
  n3 g+ m9 l8 A- F: O, a  B+ ~" G+ M( J2 t- G, ^& y
33 call, N& \6 s: x; g! C
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
) g; [$ G6 d% b有时有的应用程序用start调用出错的,也可以call调用
3 G2 v; T- z% P/ P6 P8 O* J5 F
3 j2 l$ U# f0 R$ R- Z34 choice (外部命令)
' |( j6 y, t5 @# J. n$ \8 f" Q选择命令
& `* T  f$ u& T让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……! ~) o' E2 n* t5 i! [  }3 ^5 M+ P0 g
win98里是choice.com# G5 ]* }, ^+ f, W- C& a# \
win2000pro里没有,可以从win98里拷过来1 L8 j, Q& k8 d, ]2 o, L- J" _4 o0 x
win2003里是choice.exe
. B+ i. w3 @+ u, ochoice /N /C y /T 5 /D y>nul1 Q: y7 G7 f3 ]
延时5秒# Y; z- ^% k5 U% w  C
6 r; n6 X" m% V( a) L
35 assoc 和 ftype
, L( Z8 v; j8 L) ]) M1 j文件关联
$ T1 T3 W6 i- J3 fassoc 设置'文件扩展名'关联,关联到'文件类型'
0 H5 l2 [1 ?9 L! d4 y# mftype 设置'文件类型'关联,关联到'执行程序和参数'
0 o4 T0 F0 k: {) x  j当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开! z" z: H  `. Q1 f& p
而是先判断.txt属于 txtfile '文件类型'
3 H5 j0 o! N# O$ y再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1% {' C0 k  W- E4 K
可以在"文件夹选项"→"文件类型"里修改这2种关联% E& t# V* U8 q- G
assoc #显示所有'文件扩展名'关联% n9 |' V8 ]! E+ \4 J
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
3 s+ e: w9 \( A* \( E- Zassoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.88 ~7 L) x$ U/ z3 [
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile/ p3 g# j9 o( @. Z' w% \. s; \
ftype #显示所有'文件类型'关联3 i; M, e& J: x* ]" J/ K8 u
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*: Q- w" l; Q  O& |7 B' c" {( ~
assoc .txt=Word.Document.82 z9 ?( e" f5 j! y5 N% r4 h) h
设置.txt为word类型的文档,可以看到.txt文件的图标都变了
9 ?& z/ O8 |( f( P& A; M- [$ Lassoc .txt=txtfile4 z  j; j: ^  j# c: V( ]2 ^3 Y
恢复.txt的正确关联% A5 t  y* k* |6 B
ftype exefile="%1" %*
) m; [7 N. P/ |3 \  Z6 D2 _% {. e恢复 exefile 的正确关联$ w+ n3 {6 V. o
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令& a. }' y% i  j) f* x1 d
" a8 ?' j8 m7 u: k1 [; ?: J
36 pushd 和 popd
! I- P( f) G5 I# \0 h* x切换当前目录+ \2 R% H% i, t! Q# a
@echo off: x" V+ t4 p" P( R( C  g- m6 h; ]
c: & cd & md mp3 #在 C: 建立 mp3 文件夹; M' \* |7 [5 S9 L* X3 [
md d:mp4 #在 D: 建立 mp4 文件夹
( Z" X( A' u- _1 r% K! z' y$ i  Vcd /d d:mp4 #更改当前目录为 d:mp4
( U1 l; T3 ~% H  e& q0 ypushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
- Z3 J$ g8 K  h$ bpopd #恢复当前目录为刚才保存的 d:mp45 ?1 x2 T( S. }

; C! e" {: T. m$ Z8 X37 for, }: b& B; n; c, O6 [
循环命令4 X8 V7 m1 y6 S% h
这个比较复杂,请对照 for/? 来看, _1 X1 S$ }* M( W, O& z7 z+ |
for %%i in (c: d: e: f do echo %%i7 y0 d" S0 ], L1 c* T& N
依次调用小括号里的每个字符串,执行 do 后面的命令% c3 M  ~& L. I) V( F2 H
注意%%i,在批处理中 for 语句调用参数用2个%
0 f8 V* W" [0 q$ y8 d6 V" o默认的字符串分隔符是"空格键","Tab键","回车键"
1 H7 x4 u, \$ V" hfor %%i in (*.txt) do find "abc" %%i5 g# O. p- f, m! m8 c
对当前目录里所有的txt文件执行 find 命令
: e1 h, J1 W! J) ?& ~5 _for /r . %%i in (*.txt) do find "abc" %%i" ~3 Q- X+ A$ M, s* `- Q" V9 m
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行/ b* J5 i$ F) A& n# @% Y
for /r . %%i in (.) do echo %%~pni
3 H* S- O" u& L! X" [6 v显示当前目录名和所有子目录名,包括路径,不包括盘符
- X3 `- ?' {1 V$ Tfor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt0 {# L; A: g6 K' V
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去0 y8 [3 k8 `" O" T8 V' U3 {( O
for /l %%i in (2,1,8) do echo %%i' h' z. h9 V, y2 _! ?( C
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1% i; e' _5 H, m5 Q* t4 i8 }
for /f %%i in ('set') do echo %%i8 s! j! @7 p' n  j! H2 l. ^; e
对 set 命令的输出结果循环调用,每行一个6 ?) r' e) k3 o3 O" Z$ e
for /f "eol=P" %%i in ('set') do echo %%i
% V8 c! S' i  o( S取 set 命令的输出结果,忽略以 P 开头的那几行
* n9 L' l1 C2 z# W0 ^3 Pfor /f %%i in (d:mp3.txt) do echo %%i# F8 v$ ?2 v' U  s
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
) M- x; T  X2 D$ N) Cfor /f "delims=" %%i in (d:mp3.txt) do echo %%i
- W* w* D( h$ Y显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称& ]# g8 _* e- q- \
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a2 a1 c! k# I6 _1 Q! S% r, `
对 dir 命令的结果,跳过前面5行,余下的每行取第4列' I9 R9 N+ f; J$ K3 T* d" v
每列之间的分隔符为默认的"空格"! @" Z% b& P# ?* |4 ]& p8 E
可以注意到 dir 命令输出的前5行是没有文件名的
0 l* t6 Y. V2 i8 s/ \! Y! Rfor /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (/ q7 i3 X4 T8 A1 W; c* I) r$ }' T) J
echo %%a
  d, R1 c3 J7 o2 yecho %%b
  Y* O/ M1 X7 S: @6 y( ?echo %%c$ i$ ~* G* T* K3 v
)
% \& p4 c" u/ }3 J对 date /t 的输出结果,每行取1、2、3列* t8 C3 Y# S/ V" j: v( r) |0 o
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列& j; _, L: z. P  q5 d3 i. i3 d7 \. m
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
1 A2 L- P# p6 K% M" U( Q/ s/ W其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
- G' t1 t5 t2 G) [) \( _for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b+ }" P: G1 A9 {+ ?# W, x" O& J
取第2列给 %%a ,其后的列都给 %%b  \- O8 m+ N4 G4 q% `: z

1 N3 a% f4 L/ l! \38 subst (外部命令)
. O! \1 t7 o# i. u. B映射磁盘。+ o9 }3 ^& R5 ]1 T' g
subst z: serverd #这样输入z:就可以访问serverd了. A$ {& }$ f5 i6 R. h  t
subst z: /d #取消该映射
5 A! {0 |; P. v2 J5 zsubst #显示目前所有的映时9 s: o# N% s( u8 n* w7 T

/ k' [" c. |( p5 _39 xcopy (外部命令)
$ [; ~# ^8 B, K文件拷贝1 O/ G9 `* f: f
xcopy d:mp3 e:mp3 /s/e/i/y  W0 s0 w3 r6 d7 V9 R: W- F
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件& ~0 ~- w8 u  t$ P4 _2 K1 a
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问4 K( \( G+ R1 h0 |$ U% X3 G( K

7 Q# ]: r4 u! m8 u* I7 a+ k! E常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
    - m- m1 b/ r4 G0 X" F3 c+ h, T: [' s
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:
      $ h9 x: r$ x; \# p2 c3 w$ r( O9 ]

    8 C! Z  m$ `" ?7 o* ?1 z
@echo off
) {/ F/ B: F  }. Rset p=aaa
* x3 @' B2 n# s3 \, Gif %p%==aaa (
( C0 N0 \- J0 M7 mecho %p%! {/ ]3 f5 Y0 X2 l! Y
set p=bbb
# v7 Q7 @9 k0 B/ Fecho %p%# G6 d1 ^" u. v4 Q+ f# F1 @) D# f
)
; Z, L5 V  n. w1 w# q# Xpause
  • 截图:. J6 g" @6 ]' a0 f6 b
  • 2.批处理.bat 文件中输出中文乱码

    0 F% h9 M6 K8 W( Y7 {( X( N
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:1 h0 w/ S5 \0 U
    • 效果截图:
      9 c$ e& r1 G- w1 D0 a$ i( e; C$ I6 W$ x" f' F2 N
    0 a7 ?* }/ P% N) k* `/ N
: z5 V; q. z3 m. {

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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