扫一扫,微信登陆

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

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

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

+ v4 j( Q# {0 m5 Q+ rWindows Batch 常用命令0 X7 u" ]1 Q; F
1 echo 和 @7 I9 l  l/ Q# v6 i
回显命令
# l# k( m, h1 a, w, P# c- U@  #关闭单行回显  U3 Z; [2 w' p$ m
echo off  #从下一行开始关闭回显
; R) R% A/ |2 F- z$ y@echo off  #从本行开始关闭回显。一般批处理第一行都是这个2 x* M# v2 z% Y% i5 K% p$ a* v
echo on #从下一行开始打开回显+ F: Y% u' A8 A& f( Z
echo #显示当前是 echo off 状态还是 echo on 状态! S$ k( ]1 w. E" G/ J
echo. #输出一个”回车换行”,空白行; R/ j3 ], A& R1 a& P
#(同echo, echo; echo+ echo[ echo] echo/ echo)
" i: d1 r+ P1 m0 |& ^# z& p& U' o5 |' s( F; I4 |8 d
2 errorlevel" L  n0 e* R. f- \0 d) b; N
echo %errorlevel%# F) _, v3 Z) f  a8 ~
每个命令运行结束,可以用这个命令行格式查看返回码" {3 R. k/ R1 p9 G4 b7 j( A
默认值为0,一般命令执行出错会设 errorlevel 为12 j& N8 K1 ^( v/ {# v- V. |- d

4 @  |, ^1 t$ x0 C8 l; Q9 H* D3 dir5 d7 L% M0 u- X0 N+ n! s1 A- l7 f
显示文件夹内容
0 N: b3 t+ _! ?0 h4 X) s  Ldir #显示当前目录中的文件和子目录
+ _; k" x, L0 H2 K9 B. ndir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件" h  N) g. r3 o1 z: y
dir c: /a:d #显示 C 盘当前目录中的目录  |# d% h7 O& P- a8 ?
dir c: /a:-d #显示 C 盘根目录中的文件
! v4 a' Z7 r$ Vdir c: /b/p #/b只显示文件名,/p分页显示
7 u. _# W' q; [0 w6 Fdir *.exe /s #显示当前目录和子目录里所有的.exe文件
4 b7 S0 Q# u5 H" b1 d  ^: k  W6 L7 }6 i, K# P
4 cd( x4 a* ?- E! T9 F3 n
切换目录! M' q& s+ F0 \3 X/ y  s
cd #进入根目录( X5 e" e; A5 _
cd #显示当前目录
. n( T* y% ?2 g5 a4 Y! Ocd /d d:sdk #可以同时更改盘符和目录
# s9 X4 E7 a/ d& I8 v* G4 Z6 `  v% i! n2 u' g
5 md8 P& N$ J& f" x! X( _* w% [( e7 H
创建目录
$ C/ j$ K+ q7 `* Y6 j$ n8 t. F9 xmd d:abc #如果 d:a 不存在,将会自动创建中级目录
; p6 A0 O4 `+ Y: O- ^7 v4 n#如果命令扩展名被停用,则需要键入 mkdir abc( i9 w: k$ x# b6 s* R# Z" A
# C" Q/ M$ u" W2 p+ L
6 rd
% P4 a) \  l& k/ y2 t删除目录9 x; f  @% k8 {- k5 e
rd abc #删除当前目录里的 abc 子目录,要求为空目录; D; F+ @) c( }) h! ^2 U( J" F
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
# B5 }4 Q0 e- F, Y4 N7 p; [: D1 L" m" ?% }# c' A( k* ^
7 del
- ]- h" y8 B- @) a' B* C删除文件
" L, b+ ~$ i; a# s8 x3 W$ Ddel d:test.txt #删除指定文件,不能是隐藏、系统、只读文件/ F% ~: ]- |9 A: j
del /q/a/f d:temp*.*2 @* P4 {; D  _, N& ~, M
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录$ }, j6 z' l5 U* W# f$ \
del /q/a/f/s d:temp*.*3 l- `5 Y; w$ Q* s, ^: g2 n
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录, D0 b; c6 ~& g$ i  a- w9 Q. ~
; H1 ~. D9 R  |, k( I
8 ren$ E  \1 E" F/ F" K
重命名命令
# y/ ^8 Y. L' s. u3 H/ k% V; Tren d:temp tmp #支持对文件夹的重命名7 T; X& c; I# O, u, E- U

; `/ v3 e. r( s9 cls* y, \$ \" f& E1 g! Y2 ?0 |% H
清屏0 z& K" T$ a3 y* r4 M- k8 _
10 type
, V( k5 e+ N8 z  d显示文件内容( }$ V+ D3 W: N* E/ M1 f
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
2 I  k- ~8 r) W  f& y# |; e$ ~4 Ztype *.txt #显示当前目录里所有.txt文件的内容
- ]9 T/ U& a) p9 y5 u8 ^3 q9 l- ?4 P/ n( L3 E
11 copy
  J/ `, `1 X. x5 X2 ^. s拷贝文件+ r5 x, l5 @+ z6 `2 T5 B3 w
copy c:test.txt d:test.bak- i  h. h3 W/ v3 [3 f6 ~
复制 c:test.txt 文件到 d: ,并重命名为 test.bak4 o' y: ^7 l4 Z
copy con test.txt
  n! G- r/ |' n& c% u1 U& L+ C从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
8 P1 \3 M  |4 A2 x" d1 Y9 fcon代表屏幕,prn代表打印机,nul代表空设备+ t8 z8 a& c" p* e1 @
copy 1.txt + 2.txt 3.txt
6 _& Z: f2 I+ U: h) ]合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
9 A/ \  V/ k$ C6 C如果不指定 3.txt ,则保存到 1.txt$ x* k0 _- U6 }3 l/ X6 q+ J/ h7 W
copy test.txt +# {( O/ }! P) [6 [! l/ k+ w+ f8 {- _
复制文件到自己,实际上是修改了文件日期* D4 ?9 f. r3 V
; k4 D* K) S; [+ u% A" m
12 title" s/ m' d, k, e2 k! D. T3 O/ y( N1 j8 y
设置cmd窗口的标题+ e$ u* t4 u) Z% D
title 新标题 #可以看到cmd窗口的标题栏变了* _2 b, g1 T, t) ]( Z  @, y' u
8 y+ E* Q* q. W6 q. g
13 ver" y0 Q& H+ O3 D9 R  t+ u" u! v6 r
显示系统版本
+ D. ?) s! l5 d1 f% E
, \1 w/ f" K$ @* F14 label 和 vol
6 L( o  h* j, P2 R设置卷标
' j: s& u) b: ~  U5 V  q; m2 Avol #显示卷标' |7 }: g9 J( P# a/ C# H0 `
label #显示卷标,同时提示输入新卷标- U0 a5 G- q5 W& Q
label c:system #设置C盘的卷标为 system
9 S$ t, a$ e3 K3 G6 U) f9 {3 m' t& X: R( z4 s3 K6 E3 P
15 pause8 ~+ e( A8 u3 C. r$ Q. t
暂停命令
9 I0 g: k% A0 x8 U5 M
, q. u0 w9 v' K2 B  k16 rem 和 ::: O, H" h! H: H3 M; N, J% |, b6 K
注释命令
% F8 K$ {. s; ~1 J6 x1 w, ?9 N, u注释行不执行操作9 X7 {# a* \) h* t& S

3 p3 _! T) Q5 U" K  h: B. H" j17 date 和 time4 v- D! Z, k9 X3 ~. y
日期和时间
% i: \& K, r/ c: j+ zdate #显示当前日期,并提示输入新日期,按"回车"略过输入
* F. @, |5 u8 ~, o5 W# D& h- X" odate/t #只显示当前日期,不提示输入新日期( y, J: f& T3 J0 r
time #显示当前时间,并提示输入新时间,按"回车"略过输入
4 i. Y! }# S. g1 Ntime/t #只显示当前时间,不提示输入新时间$ w3 t9 R* l1 h. n( T+ M5 x
& f; y& a9 A" _
18 goto 和 :7 F$ _- i" @% P: w3 Z
跳转命令% `0 d: C$ g2 s  x1 U0 k! P5 W
:label #行首为:表示该行是标签行,标签行不执行操作% M4 D' E4 ~$ _: P! ^) l
goto label #跳转到指定的标签那一行6 s9 p5 d9 g: }+ v( m: a
! b2 e. Q7 L" l2 z# V! h* k4 g, F6 i
19 find (外部命令)
* \9 I: D% c) s7 y- g查找命令3 I' z8 K: x9 g
find "abc" c:test.txt
: R( `3 X2 `3 `" b$ G7 C# f4 w5 O在 c:test.txt 文件里查找含 abc 字符串的行! X' i; t3 E' c, ^+ w
如果找不到,将设 errorlevel 返回码为1
  ^. x3 t7 J4 Z5 U0 ]# \; sfind /i “abc” c:test.txt
% z1 r$ J% w6 G( H6 D+ |. {1 Q查找含 abc 的行,忽略大小写, _6 e/ l/ W/ S: |1 L
find /c "abc" c:test.txt
: ]  a% D$ j. s9 A1 N7 L, ]显示含 abc 的行的行数
! k: i9 N, v& f3 N  S
# K  Z5 O6 A* x20 more (外部命令)/ f. J" T6 |! L7 C
逐屏显示
, U, c0 J) @7 e% t8 g% hmore c:test.txt #逐屏显示 c:test.txt 的文件内容
+ z. p" o4 d  U7 P( H: H( Z$ g8 K* d" U$ Y2 ^4 U) p7 S
21 tree
. D0 S  _2 R5 K显示目录结构, Z0 E# ~6 N, Y: i/ Z
tree d: #显示D盘的文件目录结构  N& ^7 Q2 A7 ?) a; f+ s

( Y+ K8 Q& X# k4 L4 S* ^* H22 &
/ S, M$ Y" [( N- v顺序执行多条命令,而不管命令是否执行成功7 x) V- m) {6 v+ H, f. _
1 q$ b. |1 V  x& C- C
23 &&6 u0 [/ t$ @+ P2 M0 ~5 _
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
1 |- i0 M  Q/ [% u% Tfind "ok" c:test.txt && echo 成功
: C" T: b8 j+ C. y; Y+ p如果找到了"ok"字样,就显示"成功",找不到就不显示
8 d7 Y2 B. u& w5 y$ g
& a! j3 j* y. W& r24 ||
8 _) E( U" g4 Z/ h# B5 y顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令) Z5 D+ p2 v+ p4 p2 Q+ |
find "ok" c:test.txt || echo 不成功& s- z! a6 h1 j6 A% A4 f
如果找不到"ok"字样,就显示"不成功",找到了就不显示4 x& n& J- E3 m7 e9 h+ V# I7 Y8 s- `
7 U4 i9 s- ]$ R% H) D
25 |
+ F- O; ?3 |  k% y/ a管道命令2 c' j# M' H8 `' s) I  m
dir *.* /s/a | find /c ".exe"8 P5 H3 t" g+ q
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令/ g0 }# r2 L$ u+ u! E( G+ g
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
: h- n5 O4 V9 @: I" m0 r1 I6 [type c:test.txt|more" J( X0 m0 y8 X( h
这个和 more c:test.txt 的效果是一样的
  ?. {8 V- ?& ]% S% N
& ]5 y  C4 F" Z! ]1 {26 > 和 >>; r1 _$ D5 }5 S0 k/ X% I& c
输出重定向命令5 \- M( `* |  z$ {2 c" `" N
> 清除文件中原有的内容后再写入* o  y  _* {$ I' B
>> 追加内容到文件末尾,而不会清除原有的内容
1 b1 S2 s1 k& e- j! x5 Z主要将本来显示在屏幕上的内容输出到指定文件中/ ]% E; E* k* @+ Q  E- b
指定文件如果不存在,则自动生成该文件( G' l0 w: X( V4 x# P) e- u2 ~
type c:test.txt >prn
" G/ s2 y% q' g% a. o$ |6 Q( Y9 p屏幕上不显示文件内容,转向输出到打印机; B0 H0 f% Y, U( s
echo hello world>con7 f& T0 J) w/ D( Q2 E" s+ }& ~
在屏幕上显示hello world,实际上所有输出都是默认 >con 的' E  u" A! O) u# x( ]$ E
copy c:test.txt f: >nul! M' z! y* x4 w; |2 o6 u7 b
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
$ a* V  T" N3 Z* _/ p! r1 n) w+ mcopy c:test.txt f: >nul 2>nul. J9 w. S  Q! Y
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息. C  v0 H) o3 `. k
echo ^^W ^> ^W>c:test.txt
: B3 w( Y5 n: s1 b1 b, y4 r  O生成的文件内容为 ^W > W
$ e* s( U* m) E4 A2 ?3 l) M  F, v! W^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号' ]4 _9 ?8 f- W; a/ f- ?2 h
6 e5 e) Q" }) M
27 </ I! A; g, H1 T$ r3 o8 H, k
从文件中获得输入信息,而不是从屏幕上1 j. _/ N3 y4 f3 L2 \9 `& M
一般用于 date time label 等需要等待输入的命令
" V+ f9 ^: \! P6 }@echo off& {, E. j8 e" w! ?: D
echo 2005-05-01>temp.txt( D+ g) h8 F! W
date <temp.txt
" x$ T5 J4 j, }: Cdel temp.txt+ r5 @: w/ S. ?' q2 z, _# N
这样就可以不等待输入直接修改当前日期3 @% q0 w/ M+ Q: i& Z" [4 G1 n8 [
3 P4 l2 q  }  `- ^* R
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
( y: B" y7 q' z, g4 P命令行传递给批处理的参数$ t6 w  h& u6 I8 f: J
%0 批处理文件本身$ f; n. h% J$ o% R/ d
%1 第一个参数
" x+ p, A7 N" B4 h%9 第九个参数
9 l( |, y2 `! C! r! r6 E%* 从第一个参数开始的所有参数9 Z6 G0 d# W1 n) h
批参数(%n)的替代已被增强。您可以使用以下语法:% j. ^$ B: K5 s; {- W  f
%~1 - 删除引号(" ), 扩充 %1
1 \) _) b5 Q* v9 [9 t4 x%~f1 - 将 %1 扩充到一个完全合格的路径名
0 J& M, h4 q* `! \: K9 ?; K%~d1 - 仅将 %1 扩充到一个驱动器号
" b. p1 e& j# ]& y%~p1 - 仅将 %1 扩充到一个路径
# P" a2 D1 |3 u! X0 p! `( Q  f%~n1 - 仅将 %1 扩充到一个文件名; K$ ?7 ^$ r  F! J
%~x1 - 仅将 %1 扩充到一个文件扩展名
2 _* I2 t2 k! R%~s1 - 扩充的路径指含有短名
& `5 I1 @/ D" }9 R1 n& V%~a1 - 将 %1 扩充到文件属性6 n* J( D( c8 d' h/ B3 Z. }
%~t1 - 将 %1 扩充到文件的日期/时间
1 d* |& N, t" K' Y# j%~z1 - 将 %1 扩充到文件的大小2 E/ @8 ?5 f0 [
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1- G6 u+ g, m3 |: Z
扩充到找到的第一个完全合格的名称。如果环境
; G; s. n2 n0 t9 S: ]  [( @8 V变量名未被定义,或者没有找到文件,此组合键会
( ~# O$ H$ ]2 r. @# R  @扩充到空字符串
  N) ?. d- `2 }% n0 @8 d8 o% F可以组合修定符来取得多重结果:
/ u7 v# R/ x. A" D. j%~dp1 - 只将 %1 扩展到驱动器号和路径
4 L) I7 |) |& T6 M" Q%~nx1 - 只将 %1 扩展到文件名和扩展名
; S. A2 H: F! I; h' b%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
2 g/ f+ v( B: }并扩展到找到的第一个文件的驱动器号和路径。
/ L; @5 u- v0 ^" R: Y0 F%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
0 f& r: b# L6 t) ?( O7 i/ Q$ t可以参照 call/? 或 for/? 看出每个参数的含意
$ L, @. U# C) v  ]echo load "%%1" "%%2">c:test.txt/ j" t/ E* F5 j+ x7 y7 \
生成的文件内容为 load "%1"  "%2"
. d; V1 L* k. e' z批处理文件里,用这个格式把命令行参数输出到文件7 x, [3 Y1 g/ U, e& g& `. p6 x

- y/ u! v( a! l; F" m* p! a# s29 if, L) ]# p$ t( K8 I$ r/ E
判断命令) g- ^' L2 }' U# a6 l$ @
if "%1"=="/a" echo 第一个参数是/a
2 S2 f2 M  ^. q- C7 y% U% Oif /i "%1" equ "/a" echo 第一个参数是/a
% X' I2 T6 E  a) I7 d* E/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?# r% Y! X9 g) p+ x. H
if exist c:test.bat echo 存在c:test.bat文件9 l& v% a8 ~% W! Y, S" n" c6 S# g
if not exist c:windows (; o* G+ F6 r5 R; Z2 ]6 S8 z
echo 不存在c:windows文件夹
) W5 M8 ]: l" L# o. r/ J. s) M0 W)2 k7 l' k  k, X/ I2 W
if exist c:test.bat (. l! }% n) ^9 @4 `! A
echo 存在c:test.bat
6 s: F3 N0 E( m+ b! ^) else (0 x2 f1 V& v# h( }0 Z
echo 不存在c:test.bat  l2 |) X: D1 y
)
. X+ W9 K1 K- A0 C9 S, z% d30 setlocal 和 endlocal$ \+ @8 b% r+ G0 q: W
设置”命令扩展名”和”延缓环境变量扩充”! b" K' [9 n7 B" ~" w+ }8 v
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"! s" G3 l5 u0 f6 y- c
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
2 K) Z) r0 P( O2 SSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"$ N. B$ v6 W( {; _
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
' M& ~3 E" q* g4 kENDLOCAL #恢复到使用SETLOCAL语句以前的状态4 f0 F" C2 g# |& h8 l
“命令扩展名”默认为启用
0 {1 Q7 H, W3 K, q( n& }5 i2 c“延缓环境变量扩充”默认为停用
2 J6 L+ m, W$ s8 y5 P2 H, _批处理结束系统会自动恢复默认值
2 I! T6 u6 n+ @可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
7 J1 A0 |1 F' Z% z& a& S2 T/ E" T& f序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确' @: H% b9 r0 G# q
保程序能在其它系统上正确运行
" q) x+ u2 q% [, p3 }"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程- A0 C# ~/ X" c  B- {7 X) p
9 Q( Z  H- L7 D  z! L
31 set
* y3 `' [4 g8 R7 G6 w& L5 B+ f! K设置变量
) N; v  r8 o: F( I* f引用变量可在变量名前后加 % ,即 %变量名%1 w2 [4 P3 V* q% m* I9 ~
set #显示目前所有可用的变量,包括系统变量和自定义的变量
3 b# m. R# i, e) d/ @echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
2 u% }5 z1 W) i7 e6 {8 Jset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
  p+ Q: J" a2 P$ m0 Iset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
! P' k2 j" Y+ Y9 \: s1 q$ eecho %p% #显示变量p代表的字符串,即aa1bb1aa2bb25 V, l7 h* t4 W% f9 \9 }0 q
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
' f8 ^8 w) f+ vecho %p:~6,3% #显示第6个字符以后的3个字符,即aa2+ ?5 i: o, l! p$ ]' G0 e. V5 s: M
echo %p:~0,3% #显示前3个字符,即aa19 j: t0 ~" Z- @$ a" h8 K9 d
echo %p:~-2% #显示最后面的2个字符,即b2
1 b2 t* F! P* s4 T, E9 C3 recho %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
- ?  _& o1 J7 T* eecho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
# b- w4 Q- t$ Z" k  B; F/ ]echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb29 C  T2 t2 k  s5 D
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2+ g: K3 x1 P; L; K
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb25 _& K/ l9 c6 b8 p
set /a p=39 #设置p为数值型变量,值为39
2 M( _1 L0 A/ G% n) B5 E* {3 Lset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
( M, e7 @6 F! bset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用3 A9 Z6 ^7 [( p( U* ^9 t+ f
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?& d( F" o3 Q$ }; `6 E- Y
set p= #取消p变量" n3 B) p2 K' Z
set /p p=请输入
' g% W3 P2 w* u8 P3 I* b屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
: F, W' D7 i  A( @注意这条可以用来取代 choice 命令
2 h2 ?- S5 i( r" _  h7 P( x3 I注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
0 }. y2 k: q4 e@echo off
3 R; a4 Y4 u! C) Y; b% gset p=aaa
/ w# |4 q' W5 |) e6 ]: O. mif %p%==aaa (; E7 O( v0 C4 Z- {
echo %p%* t7 V8 b- w3 }
set p=bbb
7 s5 Y! I& G  Z# |echo %p%3 G# u" R. j: y/ q, w7 S/ W
)
* D% \0 r; z) M- Q' P7 j4 T. a结果将显示+ H. B( ]1 c" j! \) B- q
aaa5 u4 E% }7 R; K" O1 g! @8 `
aaa
8 z, \$ ?4 d8 O0 \) q因为在读取 if 语句时已经将所有 %p% 替换为aaa! ?# g" s% ~9 O7 X
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
# S' {/ |' N  K: I9 {8 _可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
, f5 N0 m" q! e, s. a+ `9 [@echo off6 T) L% V( Q) P0 c0 }
SETLOCAL ENABLEDELAYEDEXPANSION
: N) G4 w- b- q+ x! Xset p=aaa
2 R- L5 @7 [. D1 Zif %p%==aaa (7 R% f/ j% X- W+ _8 A7 Y
echo %p%, P: ^+ ^% d& F. b% d3 Y
set p=bbb. }0 ^+ i7 R+ D6 h% k: L0 ^- X1 q
echo !p!
0 Q' \7 j. i7 C# k) S2 |9 M- n)
+ V4 N5 l$ ?) wENDLOCAL  B) o; `3 X/ Z* ]
结果将显示
7 s2 m7 z& l. p" }. f) v9 e1 Caaa
" y3 Q" C1 t) u5 P* Q( ubbb
: r0 T: N3 Z4 ^; ^) [还有几个动态变量,运行 set 看不到. a* y# F: }% K' l+ N3 ~
%CD% #代表当前目录的字符串1 r. _* N) v5 u, v6 y2 e6 w
%DATE% #当前日期" w8 A  N( J1 U& {
%TIME% #当前时间
( a3 x# i) l  M! L%RANDOM% #随机整数,介于0~32767
/ V8 y% A! d* G& [/ i%ERRORLEVEL% #当前 ERRORLEVEL 值
7 n( l0 B. A7 V+ T/ k- Z%CMDEXTVERSION% #当前命令处理器扩展名版本号
- F' ?3 E5 ~. F9 ]7 W5 o( j%CMDCMDLINE% #调用命令处理器的原始命令行
$ B' H/ I  k% ?( R; }8 Z( j可以用echo命令查看每个变量值,如 echo %time%
* ^( a4 t) a& v' E注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到% x; y6 k1 `% \  {' w) v, J
1 s! d  |9 j: ^# }4 _. K; t
32 start5 A1 K- L, _9 R
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
* ~$ Q$ k" x, [* e7 `, W+ o* b! m; E
33 call0 x( m6 y( h4 m3 @
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
# u! }" T+ v7 j2 k6 H' f2 \有时有的应用程序用start调用出错的,也可以call调用
( b) w, x* i. L1 \/ G$ E7 g0 `3 n1 _- ~# D# e8 p, E
34 choice (外部命令)1 o% t" G; N6 ]- O6 m
选择命令
* R4 P, [7 _/ h1 P让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
- V2 v' W3 r0 R2 @9 M3 @win98里是choice.com
+ p. }- o  ^8 \: t: uwin2000pro里没有,可以从win98里拷过来$ x/ ?1 L9 Z  h) t
win2003里是choice.exe
7 U8 |5 o/ l* T% ?. W$ [, ~choice /N /C y /T 5 /D y>nul: O2 M1 J4 {. j# H% G2 |
延时5秒
  B9 X% L; n: l% y/ ^: m
2 [2 y8 e" F+ a" w6 f% r35 assoc 和 ftype
  F6 W, z7 \3 ^7 \文件关联( O2 O8 x: J( j! T% ]+ Z
assoc 设置'文件扩展名'关联,关联到'文件类型'
. a# A3 J6 ]9 d4 T/ n  Vftype 设置'文件类型'关联,关联到'执行程序和参数'3 g# f. w6 T( @1 W* ?
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
" r6 U. S1 ^9 [1 K7 l而是先判断.txt属于 txtfile '文件类型'
0 ?6 J6 i" D0 }+ \- m9 L再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1" g. B9 j# }# X: ~/ b  [/ S8 G
可以在"文件夹选项"→"文件类型"里修改这2种关联
$ c- v9 X7 h0 r9 \3 nassoc #显示所有'文件扩展名'关联
+ s) F  E- Z0 X8 A" L3 q$ }$ _9 W6 aassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
# |( u8 @2 s: \assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
/ q6 x" O7 K1 N0 Cassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
( y( K& {# T( aftype #显示所有'文件类型'关联
) K$ `  s6 H; r( Z0 r6 \/ |ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*- z: L! j# F2 I) Q) M' r: R# R
assoc .txt=Word.Document.8
. e1 Q6 S2 K" e0 {设置.txt为word类型的文档,可以看到.txt文件的图标都变了
  ~( o4 R  t8 Y/ Passoc .txt=txtfile
0 x3 j+ I" q; }: W* T% ~恢复.txt的正确关联$ m7 H) m' D# j9 C* z: w6 v
ftype exefile="%1" %*
4 @. ]1 H. L0 h1 \; T( Q- Y+ E恢复 exefile 的正确关联
; f& ?" ]4 W8 h& t( K3 L如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
; F4 }. s. \% `4 H6 A1 X8 B% d! ]' ?) G8 ^$ g6 M. N
36 pushd 和 popd* X; s# T4 Q" z+ w0 H' s
切换当前目录# ]2 v0 J0 j1 W4 s: L9 I
@echo off8 v5 t# k/ X; \6 `5 H" G# L
c: & cd & md mp3 #在 C: 建立 mp3 文件夹& N* ?7 B! b: ?! B! O4 O4 E6 J' F4 [
md d:mp4 #在 D: 建立 mp4 文件夹! q6 c! X' a9 x& U+ W
cd /d d:mp4 #更改当前目录为 d:mp4* A3 x+ \: H' V4 q- N7 x& P
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
( a% U  m* @# D  B- i3 ypopd #恢复当前目录为刚才保存的 d:mp4
! G- G# h2 }: u8 T( |# o2 h2 \# c- H7 i4 \; m
37 for
0 \+ v7 k( X2 g- W3 l循环命令+ y, @& y, \/ K) F
这个比较复杂,请对照 for/? 来看
! Y2 i4 U/ L3 P# k7 L2 m7 |for %%i in (c: d: e: f do echo %%i
5 ~, n" h; B2 {3 v6 P) ^+ y# S依次调用小括号里的每个字符串,执行 do 后面的命令- |0 Z0 _2 T: u9 h9 L0 U
注意%%i,在批处理中 for 语句调用参数用2个%
0 o% |- {$ I# h- m+ v默认的字符串分隔符是"空格键","Tab键","回车键"
2 L: ~7 a( a* L, k# mfor %%i in (*.txt) do find "abc" %%i/ X4 C( W  K* D1 Y- S8 [
对当前目录里所有的txt文件执行 find 命令
) l0 G9 o% x* W- D/ s# Lfor /r . %%i in (*.txt) do find "abc" %%i& j7 [2 x4 `2 {
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行, x3 Q0 \, R/ ]* o
for /r . %%i in (.) do echo %%~pni2 s& y$ y! j' Z( p" U
显示当前目录名和所有子目录名,包括路径,不包括盘符
* V  z% {1 j9 tfor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
: e7 ]; ?0 y: h2 N! a* l2 N% ?把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去2 ^7 L! i- W! Q! }4 e) I8 `
for /l %%i in (2,1,8) do echo %%i
9 J! N. ?3 e: g5 \8 y8 T# D2 Y生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
$ r" p, s4 d- [8 C) `8 Afor /f %%i in ('set') do echo %%i' l5 I8 t! W& a7 Q+ _% [5 u! }
对 set 命令的输出结果循环调用,每行一个
3 R) ^* S. o% E! n- q+ A$ Z5 [for /f "eol=P" %%i in ('set') do echo %%i2 f- o' P$ T3 n
取 set 命令的输出结果,忽略以 P 开头的那几行
' j4 S$ B' {, Q% B& A7 L. {for /f %%i in (d:mp3.txt) do echo %%i
; }  {' l0 }4 P( ^显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
* ^) Q! [- G6 a" v* A6 mfor /f "delims=" %%i in (d:mp3.txt) do echo %%i4 z. ~+ Q! s5 {7 @; ?, g! ]( a$ @% f2 k
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
3 C- _0 d/ o" |; t: J5 v+ bfor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a- N/ z& H3 J; H$ F
对 dir 命令的结果,跳过前面5行,余下的每行取第4列
, `) y/ U" y; ~$ k$ B. |/ ~每列之间的分隔符为默认的"空格"5 z) c2 E( e1 l1 o3 y: X0 `
可以注意到 dir 命令输出的前5行是没有文件名的. \: ~4 ]5 p5 n3 I# F: V9 Z& U
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
+ O/ P/ Z2 x) C. aecho %%a
# L. G5 W9 ]1 h& [echo %%b
* x+ u7 L. r% J( cecho %%c
  e% C* H! T. r2 l4 s3 H! W)
& o# C4 u; C- y& y" @# C: V对 date /t 的输出结果,每行取1、2、3列) J$ |) b/ M5 m7 E6 v: p
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
, e1 O8 ?1 [# E8 R分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
6 D. H- N3 Y. W其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的* T2 F) _  L# _# |  X- _! @  K# o# b
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
7 Y1 j# f9 [' f$ Y* ?8 _取第2列给 %%a ,其后的列都给 %%b0 F  s& B+ e* z0 y! v3 X

/ q+ H: u+ v) A2 C4 c8 \$ F6 h38 subst (外部命令)2 r3 o: z  ]1 L* k. ~
映射磁盘。
: v6 m/ N; T1 Msubst z: serverd #这样输入z:就可以访问serverd了
* W3 E$ w4 W. G. a- L, Esubst z: /d #取消该映射# d! ]! f5 O% {' h9 r
subst #显示目前所有的映时6 l6 Y. T8 C9 E% h: G

( ~! z4 i2 ]8 L, q( N. m+ Q39 xcopy (外部命令)
& c2 z8 B) f* s2 ?5 X$ j) ]  M' S文件拷贝
; u! @& a9 \. y2 jxcopy d:mp3 e:mp3 /s/e/i/y
+ X. V. q8 u- R+ X复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
$ I/ I# M; [6 J, R$ b5 P6 \3 C$ y* [加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问$ E+ W  n/ X" A6 B

) f, ~) q! g" l2 i常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
    * A" [" F, L! p4 s  d1 S
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:% R+ n# N3 B" m; b

    " b) b; x3 j$ U0 h- ^6 ^# z
@echo off( O  m; \/ }1 b
set p=aaa2 H7 a$ ^6 n( |4 q8 h8 {
if %p%==aaa (
+ J6 i8 P2 j1 e# A9 x6 h0 ~" Secho %p%# R, F6 J5 d) d2 T3 M& X1 B5 o, K. ~
set p=bbb- {7 s1 H' `! z# k6 ~+ D" W
echo %p%
' @4 z8 \  T9 c2 V! x)2 c, T/ I' C" F0 h6 V
pause
  • 截图:) d- \# N8 v( |2 t6 c
  • 2.批处理.bat 文件中输出中文乱码
    / c# d& Y0 W# g7 T' T" D; {
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:
      ; e. e) l4 D4 n& _
    • 效果截图:" t9 y* ^$ E- h. M8 L( T$ B

      . c6 y# v3 u) g: ?! R

    ! a5 x5 Y+ e% M4 b4 x& N; [9 i

3 M, Y6 ?( B3 m1 \7 Z2 d. _

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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