扫一扫,微信登陆

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

搜索
查看: 2063|回复: 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 文件中输出中文乱码
  • 解决方法在文章末尾!
      K% z/ p* H( R) Z  R! T
前言
  • 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效
    1 I) R! Z3 n/ p+ F7 Q
在Windows中善用批处理可以简化很多重复工作
什么是批处理?
  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展7 R7 q$ k) M9 L5 t% G! C
    名为bat
  • 目前比较常见 的批处理包含两类:

    2 W( f. @1 K7 W) f
    • DOS批处理和PS批处理。
    • PS批处理是基于强大的图片编辑软件
    • Photoshop的,用来批量处理图片的脚本;
    • 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
    • DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理/ R4 n* d5 v% x  H) O4 ~+ [
  • 批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
    / L" d8 h/ m% W  Y7 J7 Y命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行
  • 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件

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

    . a0 E. B  W6 J: b# D
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
$ b% _, |/ G1 @- M
. Q# l: M" g9 L) m( `5 Y
Windows Batch 常用命令* p! i3 e& I2 X/ b- `$ H
1 echo 和 @
, b0 x4 @" v# B8 E( k  g8 Q回显命令9 T% h8 v% z. O, F9 _
@  #关闭单行回显) B! ?# F3 K- ~
echo off  #从下一行开始关闭回显
( V4 v; Z1 B( h- {: s4 c' b. U@echo off  #从本行开始关闭回显。一般批处理第一行都是这个, I& b: h( A2 k
echo on #从下一行开始打开回显( i* F1 x# T/ P8 T
echo #显示当前是 echo off 状态还是 echo on 状态
' C7 {/ X8 [  g: t0 V* g+ Q( q8 ~; _echo. #输出一个”回车换行”,空白行+ B3 D- D) P! N# ~& n, |
#(同echo, echo; echo+ echo[ echo] echo/ echo)8 @+ }1 A5 s! c
+ u% N+ x3 a- k( G
2 errorlevel9 e8 q& }9 j  j- ~2 }
echo %errorlevel%/ K+ A9 n% V  ~5 ?
每个命令运行结束,可以用这个命令行格式查看返回码
$ n. n8 M  M" L默认值为0,一般命令执行出错会设 errorlevel 为14 Q( \; l# M, V% T! Y
4 \# N* \( ^! P9 E" g5 y
3 dir
7 R8 S. T8 u6 [: M* K. ~/ ~显示文件夹内容
1 |: p9 e5 L6 u3 }dir #显示当前目录中的文件和子目录
; m! Y+ P7 e5 k1 [dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件5 e0 S& I$ S9 B  O+ o+ j* o; ^9 b, N
dir c: /a:d #显示 C 盘当前目录中的目录0 q" R9 c: n/ ~, z! b
dir c: /a:-d #显示 C 盘根目录中的文件
# X" j; |- v- f5 a$ p, {' f: Hdir c: /b/p #/b只显示文件名,/p分页显示! w+ V$ F) I/ A" x' X
dir *.exe /s #显示当前目录和子目录里所有的.exe文件
. ?! P' P. I) F0 M
/ |3 y4 W4 h& F4 H. ~0 Y# \4 cd
- o0 d5 [/ c9 J/ x* B切换目录
  k( ?  ^# H3 u3 V: r- xcd #进入根目录9 f7 J; m/ l7 p, `
cd #显示当前目录
7 E( z7 s6 w7 ]3 ~) Pcd /d d:sdk #可以同时更改盘符和目录3 D4 s" J! q; ^2 B
- n6 P. p5 {" y3 u$ G
5 md6 P& T2 `3 r% w/ l/ {5 B# j% A0 q
创建目录( k1 @$ C9 I! Q0 q
md d:abc #如果 d:a 不存在,将会自动创建中级目录
  m& \; m  Q+ X, L#如果命令扩展名被停用,则需要键入 mkdir abc
: O* |9 @* m; v6 w& N% U; j% x; }) p" k0 C, ]/ t
6 rd6 A  ^+ X. F+ z
删除目录, X& n' E' i  ^* B! Y5 \' a2 X
rd abc #删除当前目录里的 abc 子目录,要求为空目录
9 J0 l  v! `8 \5 y' X" p# Qrd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式1 Y  r# n, \8 u4 _" }

# I, \, B; O1 T: R3 m8 D7 del
( _1 L$ A  G2 N0 \3 r0 \) Y+ `  m删除文件% O4 l$ }. F3 R
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
9 r4 Q; P/ w) n% d" x# Edel /q/a/f d:temp*.*
7 j" y. \( L+ l2 R9 X删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
; l) d- U' W% @del /q/a/f/s d:temp*.*  g* a6 U" o7 v2 }- J
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
! `' {1 b+ L, ?& K- t
; O$ O. h; u: {# S3 s% Z8 ren; r4 P$ w9 [0 F& |+ e: y9 J% ]. F) U
重命名命令
5 T: C1 [+ e* v# y4 m2 dren d:temp tmp #支持对文件夹的重命名- H, U, i; c# c' V5 D2 v6 x4 Q0 G

/ u2 F6 d; z* B( b4 z) L  }; j9 cls
! ?; ?4 q& n5 I. `% [9 x) |清屏( q: T! \* N; B& [, Y- e0 c1 C
10 type7 G! ^6 t2 }$ \8 \/ l! z
显示文件内容/ n" a1 w1 y1 @. m- }: h% U3 l1 A
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
/ U' s- t" J' t2 n2 d) ?type *.txt #显示当前目录里所有.txt文件的内容- u  r: E' h: h/ f% b

+ b2 K: i$ }0 g' O11 copy5 u, i- _0 u5 _1 {  `6 U
拷贝文件7 o( I* p$ A) p7 F
copy c:test.txt d:test.bak
* z9 X' X6 _8 p& H" @; f复制 c:test.txt 文件到 d: ,并重命名为 test.bak& Y: n7 s( x( {( a
copy con test.txt
* F9 Q0 y  F% L' J6 [, R& L从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
0 E1 z' E9 a9 T3 D3 |1 P) h! \/ Ccon代表屏幕,prn代表打印机,nul代表空设备8 \! O) A" S( e8 b, y# }% |+ e- K
copy 1.txt + 2.txt 3.txt
+ r- u7 K0 \4 J' |合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件7 ^! P8 {, y- ^5 \, f9 p: M
如果不指定 3.txt ,则保存到 1.txt
: D5 b+ l+ b1 x2 ?% Hcopy test.txt +# Q1 W) M  e; j
复制文件到自己,实际上是修改了文件日期
( x) c. [) ^& b4 B8 U2 w5 ^. e3 J3 q. p9 ?6 H# v: b" k6 u$ ^
12 title
% v# K0 @4 w. y" s+ Z0 x设置cmd窗口的标题% i* G6 _/ }+ L
title 新标题 #可以看到cmd窗口的标题栏变了4 @& ]$ v) A) d
6 V7 B1 d; h' c/ S
13 ver9 u! H: y% m! k5 ~  N; o
显示系统版本
' |* S; r* j; Y, i5 u8 L" ?* p' o1 r' x4 g6 l7 D
14 label 和 vol
; ]4 x2 ^5 A7 }- S; ?: J/ ]4 ^  d设置卷标. R5 r0 X& k" e
vol #显示卷标: E  M: ]5 c9 P/ v6 q/ ^0 O
label #显示卷标,同时提示输入新卷标
& ?, p; P$ p2 B7 D' O$ jlabel c:system #设置C盘的卷标为 system
- ]# {6 [( \) ?( i) Y
+ Z1 R; S/ e1 O' D15 pause% r% M- N) {* l
暂停命令
7 L. \3 M( h! A1 _% t. v
4 G( h4 q8 r" j  i( W16 rem 和 ::9 r: B4 g1 z5 [
注释命令% _/ j2 y" a! l' e* f- P1 |! X: E% k( u
注释行不执行操作2 J& ]; j1 n4 B3 ^  t: ]

: b; e! P2 |7 y6 `17 date 和 time
( T3 s9 q5 O) X+ P日期和时间
! d8 y2 a4 n: A* jdate #显示当前日期,并提示输入新日期,按"回车"略过输入
1 q' @2 O% h# P7 Jdate/t #只显示当前日期,不提示输入新日期
& L0 v( W6 ]: ^time #显示当前时间,并提示输入新时间,按"回车"略过输入
. [# f: S: s4 O2 \7 rtime/t #只显示当前时间,不提示输入新时间
8 U, B, k5 O# g" A1 j0 H
5 Q, [& F% F. A  r7 O1 @18 goto 和 :, I/ f% {+ S# I$ V2 r
跳转命令) z% c0 w+ ]+ q' S/ `$ m6 a( g
:label #行首为:表示该行是标签行,标签行不执行操作! f0 W: R; q' t6 r3 N
goto label #跳转到指定的标签那一行6 ?; W: T/ i+ g6 e9 t% H
. i, }9 G3 X, l' d% w
19 find (外部命令)& i  X$ u5 ^; c  Q! [; m# w  H
查找命令8 {8 y) S+ s) s# K$ F! l
find "abc" c:test.txt
& p5 s% V$ w+ c8 x8 C5 e在 c:test.txt 文件里查找含 abc 字符串的行$ ?. i: o9 w) h0 m, J
如果找不到,将设 errorlevel 返回码为14 ~2 D. Y: s, |( b9 r
find /i “abc” c:test.txt
/ Y' x7 W" N9 ^7 E5 `' l查找含 abc 的行,忽略大小写, N/ U7 x0 L( ^& \# u* Q
find /c "abc" c:test.txt+ D% r! Y# C8 X
显示含 abc 的行的行数
+ D+ W5 S: S4 x( `1 E& t, q, C4 W0 |
20 more (外部命令)
! q/ ]" T4 |+ p# x& x* l逐屏显示
6 j. I- p5 F: [! C% I5 S+ ]: mmore c:test.txt #逐屏显示 c:test.txt 的文件内容
2 b6 f# L" J/ W' x( U, f; V& @8 |$ `3 @6 i5 @
21 tree* N8 h3 M2 b1 ^0 W3 j/ v8 @) Y* ^
显示目录结构9 u6 F! b: U5 T  ?) }) h$ e
tree d: #显示D盘的文件目录结构% i0 c2 L+ h; w: {2 m" ?
7 k/ y+ y( F; E$ ^5 o# N% D' N; `
22 &: A4 O7 F) |( \# O/ U3 _
顺序执行多条命令,而不管命令是否执行成功6 s# D$ X8 l2 f' {+ n8 n
& }. P. _* x$ ^
23 &&9 a0 a7 Q2 J. }
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
3 z/ B: D$ G4 ffind "ok" c:test.txt && echo 成功
4 y2 r: N* ^% X; z如果找到了"ok"字样,就显示"成功",找不到就不显示
: p2 H3 P" i* }( S3 S* s/ W6 i  G. x# r) ]# q4 g' @0 I
24 ||
4 |6 s& M# i7 H$ T) l顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
& }0 y# O; }" M, v+ _! a" xfind "ok" c:test.txt || echo 不成功
9 z/ ?$ Q( r  b% ?) ?如果找不到"ok"字样,就显示"不成功",找到了就不显示
( \; r6 ^# S- ]; Y7 w) o) r
# u* d% C4 [4 X2 Q$ K! Z* C25 |' f+ H5 [* ~1 B( v  S2 D6 ]
管道命令& F( Y7 n0 N0 d
dir *.* /s/a | find /c ".exe"
- ^7 k* X- i3 |管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
* ?& o- u) Z& u" e" j该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
6 R, J6 {& B  ~- q) t- rtype c:test.txt|more. W2 ]4 Z, y. C( _( P0 a9 B
这个和 more c:test.txt 的效果是一样的
7 T: E8 F2 A9 t. B2 H% X7 S
1 V, k  G0 z1 s& Y1 J9 l7 Q) s( T26 > 和 >>
3 W5 k  o; r9 R. d% m( E输出重定向命令
7 y5 G. C- Z/ f5 l: j7 s; V> 清除文件中原有的内容后再写入
: E& _) t: z. u0 v+ f& i5 \. G>> 追加内容到文件末尾,而不会清除原有的内容* X: X1 w9 [- L. D( k; L7 D
主要将本来显示在屏幕上的内容输出到指定文件中
' W  n" F* w/ j$ n指定文件如果不存在,则自动生成该文件% U7 _; S! s4 X: L: e8 w3 Y+ [
type c:test.txt >prn5 W% T: _: f3 a* W- x# `5 B
屏幕上不显示文件内容,转向输出到打印机
- s! [' K, ~  _2 e3 j7 Vecho hello world>con6 M% \: V7 J7 s2 y2 E* K# P
在屏幕上显示hello world,实际上所有输出都是默认 >con 的9 b5 v4 V; P% M. ?6 e
copy c:test.txt f: >nul4 l9 K3 X; b' k' }" ?& q
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
  y7 h9 v# O$ e7 `" Gcopy c:test.txt f: >nul 2>nul2 s* M* u" M2 E& J
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
7 W9 Y2 O# q: I0 gecho ^^W ^> ^W>c:test.txt% M- \' n& i& b" f$ M& |
生成的文件内容为 ^W > W. q6 h- h+ ?9 {( a) ~3 M( e. l
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
. ~: C- f; F" F+ ~3 M# X* u, O( K) v
8 \; S. B6 S3 s$ A8 Z% A27 <4 u+ X3 p6 K: F  u; J
从文件中获得输入信息,而不是从屏幕上& j8 r, X  n  s; e9 u2 c3 T
一般用于 date time label 等需要等待输入的命令
& V8 Q2 y* ^3 y: I% P& K@echo off
. a9 y& ~9 @7 X, d" {% i/ Oecho 2005-05-01>temp.txt% ~. C& M! Z, f( O. p$ x
date <temp.txt
8 }( t: c0 z" ]: R! g  f/ adel temp.txt
& U. Y, W( i% c这样就可以不等待输入直接修改当前日期
2 e) v& `* j# ]7 o; L9 W$ s2 x. \4 ?( z8 L  ^* M
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
4 i0 {! S" s7 a. N' }. N( d7 z9 J. u命令行传递给批处理的参数. e, j" l+ e' f# r) t! u
%0 批处理文件本身. I1 U- j# R' d$ c1 Q
%1 第一个参数
% i  Z$ d4 Z- E- t5 J3 g* O! b; f%9 第九个参数
2 ~% z# o9 @  {! }; ?+ r3 ?/ o, R%* 从第一个参数开始的所有参数
- G8 E- N  y, l0 t" _9 q: r' D( D批参数(%n)的替代已被增强。您可以使用以下语法:* f4 A2 D+ g6 [$ _* {/ V6 Q* L
%~1 - 删除引号(" ), 扩充 %1* Q& n8 t2 e" m9 `
%~f1 - 将 %1 扩充到一个完全合格的路径名
6 a' u/ B  V. g" d  T% M! S%~d1 - 仅将 %1 扩充到一个驱动器号8 f2 y- }6 i! {/ B, A% j3 T+ j
%~p1 - 仅将 %1 扩充到一个路径, E* o! A7 R( ^/ v
%~n1 - 仅将 %1 扩充到一个文件名
- |+ ]3 C6 r& ^4 J" Y%~x1 - 仅将 %1 扩充到一个文件扩展名8 ?8 Q; v; l, u" f* ]
%~s1 - 扩充的路径指含有短名$ d# P5 Q6 i2 [  @6 l0 c+ H* M
%~a1 - 将 %1 扩充到文件属性
8 j/ O4 s# \* _  r6 r# h8 @: Z%~t1 - 将 %1 扩充到文件的日期/时间
  ?$ s2 u  P# g%~z1 - 将 %1 扩充到文件的大小
5 M  S' ^2 x, `* f0 H: H%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
0 z* U. Z  e$ b+ E% @) ]' i% U- x扩充到找到的第一个完全合格的名称。如果环境
, l  U% M1 O) ^变量名未被定义,或者没有找到文件,此组合键会
' g  ~% V* a( U% q. _+ E扩充到空字符串# h2 E* t8 V5 j: O. @
可以组合修定符来取得多重结果:
' o1 ]  i+ Y1 x/ `. d%~dp1 - 只将 %1 扩展到驱动器号和路径. H& x8 u- V$ D7 w
%~nx1 - 只将 %1 扩展到文件名和扩展名8 l2 ?( Q: ]  O
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
  a( Q# D. x9 w# @9 f4 p0 U) G并扩展到找到的第一个文件的驱动器号和路径。
* ~9 s; Y+ |" i! W7 A- k%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。! n9 B6 N6 f- x# F* j. Y- ~( e
可以参照 call/? 或 for/? 看出每个参数的含意
6 q* o  }$ y* A1 B7 r% Yecho load "%%1" "%%2">c:test.txt  E1 ^( m- Q' u5 F+ O! K5 f
生成的文件内容为 load "%1"  "%2"
. T) W- K' r, p/ ~批处理文件里,用这个格式把命令行参数输出到文件
6 `& V9 L! r7 B
( G' l- i# j' }' C! ]/ V29 if8 P) g2 P6 x' r/ w* s( L
判断命令# m+ x' Z  U6 J9 a' q" E
if "%1"=="/a" echo 第一个参数是/a
. ^5 u; r2 o! E# P; sif /i "%1" equ "/a" echo 第一个参数是/a
3 I' w# L% N5 A4 A+ E/ J/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
1 P1 A# b% ~0 E: ~if exist c:test.bat echo 存在c:test.bat文件3 W7 e0 T; {0 S1 x# {9 e* u
if not exist c:windows (
# X( b# `/ \! I  |  t: Mecho 不存在c:windows文件夹
9 B9 ^, i; [0 l" B)+ R' p& {; j; C- C/ r
if exist c:test.bat (7 A3 H7 P" `, r7 H& G
echo 存在c:test.bat
% M7 w  K* x* I+ b  e) ?) else (2 u! Z, ]: t! g* ]$ A( d4 X' Q
echo 不存在c:test.bat
( h* T  B9 i1 `3 y& \0 d6 n6 U5 f)
5 B$ {' U$ C, k30 setlocal 和 endlocal2 i7 S" {& Y& ?
设置”命令扩展名”和”延缓环境变量扩充”4 J( W" ]+ Y# T
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名". O1 E" ]  M# }1 |) T2 C) K
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"' u! Q4 T( t3 b- b8 [/ X2 N
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"" I7 s9 U% R7 f& V. r4 {$ N
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
; p; }1 s+ i: y( H) eENDLOCAL #恢复到使用SETLOCAL语句以前的状态
. ^+ o. n0 w+ m8 u( e; _# g' B“命令扩展名”默认为启用
" P, c) Y4 L1 B“延缓环境变量扩充”默认为停用
6 d- W# E6 j6 G8 @$ s批处理结束系统会自动恢复默认值
  v% n3 b- \# j3 s/ J4 \3 r) i可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
+ ~5 c- U4 _! d) i* f7 L序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
# U; [& {) J* r  ^保程序能在其它系统上正确运行
9 |. R2 G# Z# E"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
4 ~) a! y; P# ?. Y2 t" R# ]0 w5 i6 M  K+ }& n) @& H
31 set
3 J7 B! @5 Z, H, U$ {& f设置变量
* b% ]2 }4 `9 [1 g7 {; c引用变量可在变量名前后加 % ,即 %变量名%2 w. q# d' Y' Q$ }
set #显示目前所有可用的变量,包括系统变量和自定义的变量4 U( L  I: ]8 _9 P  f. p! P, s
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
% t2 N; Q: Z' ?7 f3 o. Iset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1' t3 w. h/ I. I3 G& y
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
( u' Y# O+ o9 j+ K5 L# secho %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
+ m* ]& l5 o. E; T) qecho %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2: H0 d# A$ @* q
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2: |4 H0 K, _4 M& B; u
echo %p:~0,3% #显示前3个字符,即aa10 a, b+ S- w! x  I( {% J3 V8 M: J
echo %p:~-2% #显示最后面的2个字符,即b2
; o0 Y. ^  o# d9 eecho %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b% ?9 J& P" m" q1 H4 O4 L
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2/ \  K6 r7 B4 F. F
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
6 ]* w4 w& E6 e7 d. C* O: ^echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2( H5 A0 j" {; [5 m! T. R
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2  a+ R4 w/ R7 r* n8 O' Y
set /a p=39 #设置p为数值型变量,值为390 P9 t2 R! D2 O5 h* E
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=31 z' [  V5 J6 |. j2 }
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
! G" C+ s. K# ?set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?4 N$ d% x2 O* t
set p= #取消p变量
- b, A( h- |" Fset /p p=请输入
. S6 T$ R/ N% W" m8 X! L屏幕上显示”请输入”,并会将输入的字符串赋值给变量p6 \5 Z$ z% K& N- e# K7 U
注意这条可以用来取代 choice 命令# e0 o, A4 t: b* ^
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如* ~9 l1 T8 N# k7 W
@echo off& |5 g$ }5 ]) y. z+ T
set p=aaa& u& D# @5 ]6 S3 l0 y+ q+ n) Y
if %p%==aaa (4 I. v" r( k  R( v4 l* \' Z+ k1 p
echo %p%4 q) c+ |8 g' m' P1 G
set p=bbb
7 ?) Y! j. d8 v8 A, L9 c6 Necho %p%1 F1 O) u" o; ^% \
)" H1 R/ `0 c1 }
结果将显示. c5 ]9 h, P: R# k- q7 D! P) \
aaa
" Q+ C& i1 N, Y0 c" oaaa, K% `/ v9 z% C# X: A2 |1 Z
因为在读取 if 语句时已经将所有 %p% 替换为aaa- F5 d9 ?- I1 y8 l, G; o  N
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充": r0 z; i+ z1 F# ~4 l; s) k
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
' u" i. @* N: A3 h, v$ W% r# h@echo off0 i+ K$ Y  o% f/ W( ^) q- }
SETLOCAL ENABLEDELAYEDEXPANSION
, L% h4 o  q" U) x! dset p=aaa
# |2 i  E5 s! M" |9 Z( o/ f' N# xif %p%==aaa (, m9 D5 v0 b' p1 p* {' K
echo %p%
8 z$ S# T- F+ _4 R: h4 K7 m% \set p=bbb" J5 r# e; X, E$ V
echo !p!! w  i% M8 x$ `* r9 A
)/ C+ e, P6 C& i3 I. q0 Z1 q
ENDLOCAL
& ?) _8 H5 z7 u3 l! S结果将显示
% u2 K. Z# g2 K) T8 Raaa: J  L! Y, g) d- U$ C
bbb& R- m* t( l6 H8 ]- [6 S: }
还有几个动态变量,运行 set 看不到, v; f) U9 L2 R! K5 I% b. ^
%CD% #代表当前目录的字符串0 g* k  c+ t0 _; I4 v+ ~
%DATE% #当前日期
7 I. X3 L# _" q% y. N, @( u%TIME% #当前时间
$ G: B' a8 a' H4 `. A" E%RANDOM% #随机整数,介于0~32767  P- e; J9 |/ F0 @+ p  u) ~. x
%ERRORLEVEL% #当前 ERRORLEVEL 值
2 T; T7 T1 q6 @' T2 \%CMDEXTVERSION% #当前命令处理器扩展名版本号
% U2 {- h! O9 F6 U( o8 d( B+ @: O* G6 ^%CMDCMDLINE% #调用命令处理器的原始命令行
; o4 b) Q9 Q# p* ?5 Z% h' V, E, _可以用echo命令查看每个变量值,如 echo %time%
' R/ D5 j8 O5 Q4 @注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到8 h! g$ Y( c+ B' |* f( ]1 \
/ h6 u' j- L) D
32 start5 H2 T& n$ A" j& L
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
8 S/ o" u, h! S, P6 b! C  P) i. H+ a1 ^
33 call4 ]7 C1 r9 o. I
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行0 R) D" x+ K6 `/ o; ^' |% F
有时有的应用程序用start调用出错的,也可以call调用
, p2 g7 R( |7 f% k* H2 [' m& D' Q( y- l9 I$ r2 I
34 choice (外部命令)3 k0 V; S5 |  C! g6 c# p4 V! l
选择命令
$ U5 M8 J3 c9 g  j让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
1 l; ]9 l" \3 A" twin98里是choice.com+ J$ w- m* T. [) S( A! H8 m* J
win2000pro里没有,可以从win98里拷过来' v- w# Q7 u3 |7 j3 Y
win2003里是choice.exe7 s( J2 W) D% o- q7 U
choice /N /C y /T 5 /D y>nul: T$ B7 }6 j* D0 h
延时5秒
3 F* b+ H1 _) f. A; @8 N+ ^" w6 q4 N9 u* ]  k
35 assoc 和 ftype
' @6 Z8 L8 u3 \+ E/ Y( \文件关联
% ^" w5 Q0 \- R: H* [assoc 设置'文件扩展名'关联,关联到'文件类型'
, Y: Y# ?% {( E' Q6 K/ P$ E/ Kftype 设置'文件类型'关联,关联到'执行程序和参数'( Q& d3 M$ f  V( f
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
3 K0 H# a  c& V6 e6 O9 q而是先判断.txt属于 txtfile '文件类型'4 y& y1 F$ X6 a6 v+ q% e, S
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1; A. M2 c5 X0 f3 z( S
可以在"文件夹选项"→"文件类型"里修改这2种关联
# x+ s# d$ u7 q; O% c1 Aassoc #显示所有'文件扩展名'关联7 t0 }# R/ ~( R
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile5 N" l' @+ S/ C) B. D' `0 p
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
/ ?# }9 p, G' Qassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile# u/ l( w) S; y
ftype #显示所有'文件类型'关联. e: l& r& _% q% |8 Y
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*1 U7 ^! a- j* U2 t# K+ L8 ]
assoc .txt=Word.Document.8
* s# e7 a; f) o% w7 s+ u8 _3 C设置.txt为word类型的文档,可以看到.txt文件的图标都变了
8 M, B, h" J3 a+ uassoc .txt=txtfile
/ n& {0 P) w* d" }% E8 r恢复.txt的正确关联
7 E- o3 F8 T" I* m3 M8 k0 i: b! Lftype exefile="%1" %*
, e0 d( w4 d$ {* L5 b( }恢复 exefile 的正确关联( [3 d1 B( p" i# u2 D2 f
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令3 @& R5 A( r4 S+ @* x, G; |

- k+ g9 t$ [3 t5 Y36 pushd 和 popd6 q7 l+ l3 d2 U) b: k& J8 K% H
切换当前目录* Z! s2 P; h! r0 V# O0 ~
@echo off
( H' t0 h0 j% g+ ?! M4 _# r5 jc: & cd & md mp3 #在 C: 建立 mp3 文件夹. ]& i6 _/ G: i0 e
md d:mp4 #在 D: 建立 mp4 文件夹: c" A5 Z9 z. `# e7 |/ H. Z
cd /d d:mp4 #更改当前目录为 d:mp4' T* ~3 B1 \# [4 @3 }. l$ E
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
* f3 H1 ^+ u. C, {. A  Q7 Kpopd #恢复当前目录为刚才保存的 d:mp4! d- Q* K4 A% S2 B; I

3 H5 m( Y) p0 X37 for1 N) b- B% F. d2 ]
循环命令
0 ?  @& q+ _/ A* ]/ z这个比较复杂,请对照 for/? 来看# g5 J; e, a: _1 o
for %%i in (c: d: e: f do echo %%i
8 j/ j. N4 O* Y% ~% \依次调用小括号里的每个字符串,执行 do 后面的命令
% H! u. t0 M" S5 q/ D注意%%i,在批处理中 for 语句调用参数用2个%" q% D! j8 q9 C7 S9 b0 I; [# y
默认的字符串分隔符是"空格键","Tab键","回车键"
0 X- J. a7 f, pfor %%i in (*.txt) do find "abc" %%i
) L' M  e6 d& x! {对当前目录里所有的txt文件执行 find 命令
% |% l5 ~1 c& @: X8 B3 b, [1 ?1 Nfor /r . %%i in (*.txt) do find "abc" %%i3 E# M6 g+ K' b9 N/ K. N
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
, Q; r, Y: X" O5 n% z' X: Jfor /r . %%i in (.) do echo %%~pni
; g& H9 h9 v& l; n! Y显示当前目录名和所有子目录名,包括路径,不包括盘符
! f& y+ L3 ^( R. v3 k$ kfor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt$ M8 A3 h4 [3 @- S1 D) o6 j
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
- t( h& R0 i- u( D0 Qfor /l %%i in (2,1,8) do echo %%i
+ I; e) |: E6 u( ^  \; T生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加15 C- p$ k" Z* }& j
for /f %%i in ('set') do echo %%i4 Z6 J, U9 `7 ?" W4 t2 A2 }( J
对 set 命令的输出结果循环调用,每行一个  _2 F8 f0 }: g
for /f "eol=P" %%i in ('set') do echo %%i
& [: \2 \! E4 _$ E/ I" `& F# V取 set 命令的输出结果,忽略以 P 开头的那几行
& _$ t5 j( D7 vfor /f %%i in (d:mp3.txt) do echo %%i6 h6 r1 X! f8 y* Z/ u
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称2 `& c% w$ Z" U/ b) F9 G: w. Q
for /f "delims=" %%i in (d:mp3.txt) do echo %%i( _+ b# e7 Q# _
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称# E, e3 W) U4 \1 b
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
& @" D/ }, u: N3 [" u对 dir 命令的结果,跳过前面5行,余下的每行取第4列7 x9 X$ E  s3 ~+ y
每列之间的分隔符为默认的"空格"
& b: p) c3 G4 d. R7 b# _, P4 U) ]可以注意到 dir 命令输出的前5行是没有文件名的; ~! n; N9 U  j  e( V
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (0 F! x$ H7 R- L) O9 v+ y9 D
echo %%a, ^* R" G5 F/ u0 S, n/ K4 }; X7 U
echo %%b
7 K3 S# [/ e  f1 K- decho %%c6 b3 I, B6 t+ I$ G5 @9 T8 a) g
)
' V7 H! P- N: [+ J% W对 date /t 的输出结果,每行取1、2、3列; ]7 S& W9 T" o
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
+ Y9 t. w8 }. c* P' J) d分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"0 ~- x4 H9 H1 m+ ], N5 E/ [/ V, z
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的& d/ k* C- V; }3 N/ Q! A" C
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b$ f# ~, o* p' i8 m. p8 E. l
取第2列给 %%a ,其后的列都给 %%b6 j" S4 Y, P0 N# A9 z8 i

0 H  s9 P% O5 M38 subst (外部命令)
3 r, v' t4 ^% \映射磁盘。
. l# L0 k2 Z* j" |. nsubst z: serverd #这样输入z:就可以访问serverd了
$ i0 `" c" l* w( j( B! |1 D3 _subst z: /d #取消该映射
: Y. }2 w- h0 jsubst #显示目前所有的映时, I  s5 ^1 V! S- a
  x+ }  U# ~, {$ a8 p
39 xcopy (外部命令), ~* E, O& U5 |
文件拷贝
2 H% Z( b& S- ?2 g5 }3 r# Rxcopy d:mp3 e:mp3 /s/e/i/y
' O5 M2 n7 c) ~. o/ L- o' n7 H2 a复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件! p; _/ _' ~% V3 N% p
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问, ?7 K) X$ h; `  |
0 M! y6 `- v( L( L- |4 Y
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
    " v8 e6 m" |/ k% G- O
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:
      # [# T2 y0 F2 F' a

    . K; L- t! c9 ^. J  i* h* k% [7 `
@echo off( g# u* s. c4 h* b5 N
set p=aaa+ k- [& I: Z& C  r; `- |
if %p%==aaa (
/ h& F8 ^8 C7 D7 c  ?* ?2 l) m! _echo %p%9 d; S! f6 Z, y2 P7 G: e" A
set p=bbb( S$ Y, z# @- I8 |/ f1 j
echo %p%- Q2 j$ h9 P% m0 g+ u( k
)
' N" @) [# d( l& Z0 m2 L! Qpause
  • 截图:( i' M& R- A( h. s3 l7 y
  • 2.批处理.bat 文件中输出中文乱码

    7 l  g% V2 o& A' Z1 c0 i
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:  B; Y* N2 D+ W7 q6 F
    • 效果截图:; ~  y7 u  N3 i8 r/ Q& f, u9 _

      8 u( c+ [6 B4 g2 a' ^2 A" Z
    , ^3 o/ x4 x  g5 W# s$ u
) h4 n5 j% v5 Q) U" m! U+ N* l

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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