扫一扫,微信登陆

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

搜索
查看: 2196|回复: 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 文件中输出中文乱码
  • 解决方法在文章末尾!
    . c+ g9 t. w4 k- @! L8 c, n
前言
  • 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效$ l/ b; D" T( D+ M8 z5 N4 y
在Windows中善用批处理可以简化很多重复工作
什么是批处理?
  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展/ ~# A( k- g( n5 Z5 R' C
    名为bat
  • 目前比较常见 的批处理包含两类:
    % V7 }: y! _4 K" c. I7 v
    • DOS批处理和PS批处理。
    • PS批处理是基于强大的图片编辑软件
    • Photoshop的,用来批量处理图片的脚本;
    • 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
    • DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
      ' ~0 G# q2 L% V
  • 批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
    " X7 w. C' P* o( h; p8 r命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行
  • 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
    7 C. j* p/ t: Y* z1 _( e+ w: p
怎么创建批处理文件?
  • 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
  • 一般情况下,每条命令占据一行
  • 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
  • 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出+ t6 v; r3 n4 p& h7 [
批处理命令简介
  • echo
  • rem
  • pause
  • call
  • start
  • goto
  • set
    1 W4 ]( B2 m, E  j
批处理常用命令总结批处理符号简介
  • 回显屏蔽 @
  • 重定向1 >与>>
  • 重定向2 <
  • 管道符号 |
  • 转义符 ^
  • 逻辑命令符包括:&、&&、||
    & ?  R2 z, r: U( M6 a0 Q0 X4 M
常用DOS命令
  • 文件夹管理:, f: |8 E: @. |5 L
    • cd 显示当前目录名或改变当前目录。
    • md 创建目录。
    • rd 删除一个目录。
    • dir 显示目录中的文件和子目录列表。
    • tree 以图形显示驱动器或路径的文件夹结构。
    • path 为可执行文件显示或设置一个搜索路径。
    • xcopy 复制文件和目录树。% Z3 b) R: B  v
  • 文件管理:
    ! ]0 f' w6 w' m2 i( q
    • type 显示文本文件的内容。
    • copy 将一份或多份文件复制到另一个位置。
    • del 删除一个或数个文件。
    • move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
    • ren 重命名文件。
    • replace 替换文件。
    • attrib 显示或更改文件属性。
    • find 搜索字符串。
    • fc 比较两个文件或两个文件集并显示它们之间的不同- Z" `0 T/ }$ m, q; }9 K
  • 网络命令:! F: u  t6 \0 f
    • ping 进行网络连接测试、名称解析
    • ftp 文件传输
    • net 网络命令集及用户管理
    • telnet 远程登陆
    • ipconfig显示、修改TCP/IP设置
    • msg 给用户发送消息
    • arp 显示、修改局域网的IP地址-物理地址映射列表
      ) j+ U) K0 z( G: q0 n
  • 系统管理:% n. L( {1 R/ S
    • at 安排在特定日期和时间运行命令和程序
    • shutdown立即或定时关机或重启
    • tskill 结束进程
    • taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
    • tasklist显示进程列表(Windows XP Home Edition中没有)
    • sc 系统服务设置与控制
    • reg 注册表控制台工具
    • powercfg控制系统上的电源设置2 G' ^, ]0 Q0 G
    . \' W2 \" k- ~& p+ h
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?

6 M6 C4 o- q  k* W6 I% G7 Q" e% M( g! H( _! C! r
Windows Batch 常用命令* t0 z7 u( u# z% d1 r8 E
1 echo 和 @
$ M) O  a' p( m3 c+ q8 [回显命令, z" }  I. a- z/ y: F% y" x
@  #关闭单行回显
( t6 m: _& Z5 W: v5 o4 techo off  #从下一行开始关闭回显, J+ ~! V4 O' j1 c" h# y
@echo off  #从本行开始关闭回显。一般批处理第一行都是这个( z& M/ S1 ]. A
echo on #从下一行开始打开回显
% m' w3 E8 ^3 s! A1 N" D( V  ~echo #显示当前是 echo off 状态还是 echo on 状态
9 V- x3 O- M3 B( N1 w5 G8 Y9 t0 Fecho. #输出一个”回车换行”,空白行1 O; H6 |+ X8 w3 d
#(同echo, echo; echo+ echo[ echo] echo/ echo)) s: r7 z' s1 q" I& @
/ H! E: x2 ^4 e
2 errorlevel! _8 n8 h# r/ j
echo %errorlevel%
. M+ @- G2 J3 q6 k- G8 |每个命令运行结束,可以用这个命令行格式查看返回码
+ f9 M$ g) ^% N$ C2 j默认值为0,一般命令执行出错会设 errorlevel 为1
2 V" Z. x+ j5 c7 U3 l/ T$ e( D  l3 O6 g
3 dir
4 t( |7 L% A! ]8 y显示文件夹内容
3 V- {  y' m" L+ A7 udir #显示当前目录中的文件和子目录& c, Z0 j; P/ K* q
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件: i4 j. K; f5 O4 K$ r
dir c: /a:d #显示 C 盘当前目录中的目录
8 Y0 S4 x! k0 h. ~& L9 d' ldir c: /a:-d #显示 C 盘根目录中的文件
! W4 @& K& g% p+ u$ W  E( vdir c: /b/p #/b只显示文件名,/p分页显示
1 _/ \8 l9 n* [5 f! g, _dir *.exe /s #显示当前目录和子目录里所有的.exe文件
% @8 A( v: R: r
1 s# i* L8 L( m& S# m  @4 cd
3 ^' b5 U- ^- @# A- u( p9 ]切换目录
3 \, r8 B& i/ D0 l7 s2 K! H) ]cd #进入根目录( S' o. G$ n# l
cd #显示当前目录) I2 f" t& K! }3 Y4 _1 T
cd /d d:sdk #可以同时更改盘符和目录
& [" c! Y  K2 N4 v0 J
% _) A7 z% ?: _8 H5 md. Q) N5 n! @( g1 s
创建目录1 s* X7 }/ a! |0 I1 }: i; t
md d:abc #如果 d:a 不存在,将会自动创建中级目录
$ i( N1 o7 z% b1 O) `) I, ]#如果命令扩展名被停用,则需要键入 mkdir abc. W  V9 y' \$ \1 Y
2 d  ]3 u9 p; t( R4 x* r6 }/ U8 x+ D
6 rd
1 P1 I, t; p; y2 A' F1 y删除目录
4 y/ m, z6 I( p6 Z2 K/ E9 H, Trd abc #删除当前目录里的 abc 子目录,要求为空目录
) |7 i# Z( a4 O8 p! lrd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
' O) n6 C% ]* P# M2 c4 g4 E' S: X7 h  [' i+ }1 t
7 del
! p4 v2 \9 r% i% \- G! l  W删除文件7 x: F4 @$ ~# d" |
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件9 C  D' P3 y& W& ]. `
del /q/a/f d:temp*.*
1 I- \+ Q/ ~* l7 s. j; P删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
: \8 N6 w) j4 V) k% r7 Zdel /q/a/f/s d:temp*.*
$ P; J* l. W. W3 [; E' f7 f删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
  [/ h& ]: ~0 v4 m% |
/ Q( x6 t0 n) j1 T3 `# V" n, K. D; C8 ren
7 I5 `& q" D" d+ a重命名命令- h. a  L; J' a# K/ H) A
ren d:temp tmp #支持对文件夹的重命名9 n$ w/ }1 v" q6 I# n, p0 L4 q! ]
/ W- _) ^; s4 c0 ?
9 cls
0 D1 j4 Q, z) X( w清屏
! P5 E5 X; S+ ~# L2 Z# w+ `10 type3 R5 |  U/ E( _
显示文件内容
1 _" I$ ~, i0 \) w4 h: Q% f2 @type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码# r3 p0 r8 @- i$ L. S9 Y; z
type *.txt #显示当前目录里所有.txt文件的内容
: U$ `% ^* y) @7 D* T! n  ~& G$ o, I( S2 i* k& _- f9 }) l) l
11 copy; G: h% s  Q7 }) g4 m( L' {
拷贝文件1 q' Q9 d( `' \! U6 S! {
copy c:test.txt d:test.bak4 A6 i3 K5 h% ~7 i* N) q" Z
复制 c:test.txt 文件到 d: ,并重命名为 test.bak! o6 T9 u6 [' H9 [
copy con test.txt- ^7 c# o9 i/ B7 v& q
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
4 X- Q7 L8 e  |con代表屏幕,prn代表打印机,nul代表空设备
* a* {$ D" g6 b' g) A" ]copy 1.txt + 2.txt 3.txt
. \2 d/ z# B  t# ^5 |% X# |合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件, j8 N7 M/ N% m0 s9 y
如果不指定 3.txt ,则保存到 1.txt- G: V# w% `& ~) ?  J; n# r  l( P0 W
copy test.txt +- y. {6 N% M" p1 `0 I: i: Q
复制文件到自己,实际上是修改了文件日期
, i, K" |/ D9 Y" B7 O. {2 A2 g
8 s6 e3 a8 J% v/ x12 title+ f) u3 Q8 w9 t9 h
设置cmd窗口的标题5 i( m5 D4 Z! k- X/ l
title 新标题 #可以看到cmd窗口的标题栏变了
3 f2 A) B3 d* Y2 U- d  P% B1 {# a) C/ `& Z4 l% K0 X
13 ver
9 l- B7 B0 }* m' I7 V" ^9 V' z显示系统版本
$ g( Q" Z& Q- L$ N3 `0 \0 L# R: b) U. c
: a+ ^1 E" T. b: p, M14 label 和 vol
  T8 A" |5 H9 A) B( H设置卷标
0 X% W, q/ B2 k; l) y' Jvol #显示卷标: [' E$ P) l- L  U
label #显示卷标,同时提示输入新卷标
4 c5 b7 Y7 W; w, v1 W! Qlabel c:system #设置C盘的卷标为 system
' h- f* a+ H1 v' ?
7 F/ x% s! M8 Q; h4 {7 o15 pause
- P( J& W$ s+ S  S+ u1 e" ^暂停命令
' d8 n8 V+ [3 K
7 S; @/ M6 ^* X% Y) k% {16 rem 和 ::
- R* y& z% @: F$ l) Z; h) B注释命令7 {, o0 s2 @* E4 L" F# R
注释行不执行操作* X5 A7 A: ~& H# ?, n$ N
  h$ j5 q$ U9 C& k2 ]$ t2 P
17 date 和 time) i- k  `% I' A: R
日期和时间
+ v& [2 t2 Z) a0 pdate #显示当前日期,并提示输入新日期,按"回车"略过输入/ y0 N. Y- E* q- ?4 w. O
date/t #只显示当前日期,不提示输入新日期3 z( B8 ], I! `, q+ k. R( Q" U. ]
time #显示当前时间,并提示输入新时间,按"回车"略过输入
$ I5 m6 K! C" I( |& _9 \time/t #只显示当前时间,不提示输入新时间
, [0 o1 x7 v* J  }4 |7 s: Y* ]5 U! p* ?  o
) M( W6 e: y, j/ l0 ?9 L" M18 goto 和 :
- J8 P9 i- Q1 X跳转命令
) u' G8 m4 J2 U+ X8 j) Q:label #行首为:表示该行是标签行,标签行不执行操作
- Y8 m2 m7 w( `* ygoto label #跳转到指定的标签那一行% y& y. v2 @3 ~+ G

% m: E+ S1 G) v! k$ O19 find (外部命令)) F) L3 U. ?% r3 k; h$ O+ a+ U! t
查找命令
" Y3 e7 j5 `6 {7 E0 c$ efind "abc" c:test.txt1 T* L6 v# V7 D8 p* p
在 c:test.txt 文件里查找含 abc 字符串的行4 E/ Q5 n2 c: O7 [  j
如果找不到,将设 errorlevel 返回码为1+ W2 f1 n- x# s0 @
find /i “abc” c:test.txt
, I# u5 q5 c1 [查找含 abc 的行,忽略大小写
/ g3 u% n+ M4 n) C1 }$ @' lfind /c "abc" c:test.txt
& z$ U# G6 U( `; }% {9 G显示含 abc 的行的行数: `5 o- Z) |* A" v7 |
/ W1 [4 k' g+ U) }3 e* Q( }
20 more (外部命令)
& r% v) N7 {2 Q$ k3 z8 {逐屏显示) {- ^/ j8 z1 w% W4 x
more c:test.txt #逐屏显示 c:test.txt 的文件内容
1 E9 |2 t( @5 o* }) ?- V0 ~2 d- ^. ]- @2 x
21 tree! R+ W& M2 g  V
显示目录结构
+ k  Y+ U, g" }9 ^" _1 ~! Qtree d: #显示D盘的文件目录结构4 X' e& Q0 d" h4 X$ ?
+ a# N! r, P* |; ?$ w
22 &) t2 P0 J5 m; q3 w7 O0 K
顺序执行多条命令,而不管命令是否执行成功
. O' u8 W1 t: _$ k" k/ a+ d6 H8 t) e
4 D' s" S# z7 T! e2 O# D23 &&# c4 W5 e. X" S; m7 w- K! A9 e
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
, z7 e/ Q5 E. ]0 H! w  I7 ^find "ok" c:test.txt && echo 成功6 l2 }& r! _. G; @* H
如果找到了"ok"字样,就显示"成功",找不到就不显示+ W/ {" z( ^/ l* w0 j. J
1 c: J( g1 ?( ?# C# Y
24 ||! j; I4 C  D- f3 o* ]+ M! o) c/ G
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令$ p- \0 e8 N0 @) J$ o8 w0 e! H
find "ok" c:test.txt || echo 不成功8 p$ \6 ?! c! ]1 t
如果找不到"ok"字样,就显示"不成功",找到了就不显示- N( d, u4 R+ {+ t" k4 F
7 Z& @6 d1 y  s
25 |- V6 J- |7 i8 a" G$ h* Q# h
管道命令
$ A( T8 a  @. u( N* Mdir *.* /s/a | find /c ".exe"
9 C& e5 W8 q2 p; p管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
  r. K# ]) a( k0 |7 c: |* _该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数# N$ I+ D9 Z1 g$ R
type c:test.txt|more
6 }* n, @9 U9 t0 P# k" F& Y5 [这个和 more c:test.txt 的效果是一样的8 e& H/ m/ W' O) V5 r" g
3 ~1 R0 k" j+ X7 L) H( O0 m
26 > 和 >>
  e9 `/ }2 e/ m6 f% ?' ~0 J输出重定向命令* b2 b7 C5 a; @) n1 Z
> 清除文件中原有的内容后再写入; T- V# x  U# N- r4 f, p( P
>> 追加内容到文件末尾,而不会清除原有的内容
0 r% D' }( u. T6 o3 y4 J( Z主要将本来显示在屏幕上的内容输出到指定文件中
! M  j  C+ D6 P6 _2 k指定文件如果不存在,则自动生成该文件
" q9 G$ p$ M, u. `" C9 |type c:test.txt >prn$ F! }2 I' B$ |8 _6 _4 [4 Z# O
屏幕上不显示文件内容,转向输出到打印机
6 ]* L5 b1 I6 m% Kecho hello world>con1 E' J. \8 U, n0 g
在屏幕上显示hello world,实际上所有输出都是默认 >con 的
7 X2 u, J- f3 S- Acopy c:test.txt f: >nul1 @8 N+ J+ `) K' B0 h9 R6 p/ ]
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
" \  q& y  ]7 l2 w- U8 Pcopy c:test.txt f: >nul 2>nul5 Q) o; `9 ~  [1 _" Y5 s" O! V
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
9 @. s5 k3 W1 M3 aecho ^^W ^> ^W>c:test.txt% e! h" P8 s- I% y% J% M
生成的文件内容为 ^W > W2 [0 G7 O: g. ~
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号* o* c; _/ S" K

4 `9 m# k! U  ]3 i, d27 <
1 a* J5 `/ G1 h8 C, H) _1 @/ |从文件中获得输入信息,而不是从屏幕上
8 C! Y, j3 L$ R# ^! E1 g/ H一般用于 date time label 等需要等待输入的命令2 J* G0 Z! c- Z( [! f; b9 x" e# G
@echo off* U$ f! T  O. \, s: r3 N( p- x2 g
echo 2005-05-01>temp.txt, y/ p; l8 I1 s" ^' `& I1 D! f9 G' u6 U
date <temp.txt+ p( R0 T2 a3 x4 L' k
del temp.txt
% l' o( F: ~4 I3 k3 n+ Q0 A2 v这样就可以不等待输入直接修改当前日期
$ e7 P- H8 h5 N
$ D& K$ y  ?, N28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
' {0 m& e/ i: J  \命令行传递给批处理的参数' n7 d6 W4 `9 n- s9 H$ P+ y
%0 批处理文件本身
2 p/ q' T1 |: s8 V%1 第一个参数9 T. I# H# G) _: e9 O) J/ v. k
%9 第九个参数
* P0 D1 y9 h0 o4 z" T* O8 v( J+ k%* 从第一个参数开始的所有参数
% A6 O: V  _6 _% e0 L批参数(%n)的替代已被增强。您可以使用以下语法:- W) m" `9 r7 L" V4 a- V
%~1 - 删除引号(" ), 扩充 %1
# N1 L2 M7 z6 B6 V6 ^! d2 D%~f1 - 将 %1 扩充到一个完全合格的路径名
2 q; m5 |" x! z' X' c, L: X%~d1 - 仅将 %1 扩充到一个驱动器号; g0 [4 h9 d' e: i# t2 d8 i
%~p1 - 仅将 %1 扩充到一个路径
* b- o6 g2 Z4 I' @) _/ i6 _%~n1 - 仅将 %1 扩充到一个文件名
  y: e: \' G4 o, g2 {. J' l3 t%~x1 - 仅将 %1 扩充到一个文件扩展名
% @8 ]0 y! P0 z7 |%~s1 - 扩充的路径指含有短名
9 }6 j9 }3 q) [7 ]%~a1 - 将 %1 扩充到文件属性# x% O% ~9 T2 J) a2 p1 C
%~t1 - 将 %1 扩充到文件的日期/时间5 a" I- a0 t% a* S% G  Q2 j
%~z1 - 将 %1 扩充到文件的大小
" ?* M( o9 `. G# F2 H/ S' O) J%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1- H7 y8 H  \# Q2 q) X) U
扩充到找到的第一个完全合格的名称。如果环境& U: ^2 o  A# ?- d1 A8 ^- @. A
变量名未被定义,或者没有找到文件,此组合键会
' T3 c- @& J( S9 E$ S( R  ?扩充到空字符串# E' N5 b0 i+ ]4 E& T3 j
可以组合修定符来取得多重结果:5 N, x3 M- X7 j/ J$ }8 c
%~dp1 - 只将 %1 扩展到驱动器号和路径
1 m  F4 v5 i" U7 Q- I+ z%~nx1 - 只将 %1 扩展到文件名和扩展名
0 o+ q' O& `& l7 x+ z# w%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,& N! Q% _8 O3 h' u
并扩展到找到的第一个文件的驱动器号和路径。
, V6 e8 Y0 f' w7 K: n0 s%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
# z  X8 ?  `" U可以参照 call/? 或 for/? 看出每个参数的含意
! o: i3 @) T! B8 y' F' \0 Fecho load "%%1" "%%2">c:test.txt
1 }2 l. N. @1 p5 I' G% B- s0 e生成的文件内容为 load "%1"  "%2"; ~2 ~( f5 \; q& u8 w
批处理文件里,用这个格式把命令行参数输出到文件
% M' E, ^2 }0 z0 G: Q  E  E
2 \' U( b# C) N1 l2 [29 if
6 p% m2 q2 R8 Q+ \. i- ~" a$ y' g判断命令: m4 o/ N: @: ^" q
if "%1"=="/a" echo 第一个参数是/a
0 h  C" J( {9 H6 {- `; aif /i "%1" equ "/a" echo 第一个参数是/a
& U# `3 B$ G6 q, X; O/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
; S6 @8 C9 ]: `/ n, \& ?5 bif exist c:test.bat echo 存在c:test.bat文件7 Q5 Z  B* o# i7 t1 X( v8 k
if not exist c:windows (
" {' N0 U. O# |0 z8 L/ }4 \& _echo 不存在c:windows文件夹( @1 e7 W! G7 P+ v
)6 O2 M& s, I' y1 K
if exist c:test.bat (" r5 H6 R( a/ i7 K" Y" O: ]  V! D# r
echo 存在c:test.bat
" G0 q( {1 Z8 O% w- V) else (# w  F. D+ d$ n! N% h2 t/ o6 |
echo 不存在c:test.bat
5 _; m( \; ^5 I. X  [% X# |)( p* N* b6 K! }" p& q7 C2 D7 N
30 setlocal 和 endlocal
& W5 H: J' V! b' y设置”命令扩展名”和”延缓环境变量扩充”
3 P9 R5 F% i0 P1 p! X9 xSETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
% S* }) O) X0 \7 H  \3 I% D5 }SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"1 H( s! Z7 u7 ^
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
+ x+ Z" \2 O2 a; p/ s5 m2 X9 }SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"  d) f, y5 _/ k) W! r, U1 a
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态& }3 w1 e3 B! }6 Q% L/ \% O7 W
“命令扩展名”默认为启用4 O' z' v" A% P9 r
“延缓环境变量扩充”默认为停用3 N2 ~) p" h; a( x+ u8 G. g$ f
批处理结束系统会自动恢复默认值
, x% `' d* `% i' d- B  o% @$ r可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程  g/ A) l  ^; {2 D8 Q
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确3 R8 Y- F! n* {. U1 |1 b. B
保程序能在其它系统上正确运行" Q# d+ o6 i3 a4 o  f
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程# Z/ P& @- K2 d, n5 u# n
5 x2 ~6 a* c# H& Z. m
31 set
. G5 L: B8 i+ e! `设置变量
9 r$ X8 m* c: h" u( @1 Z( c引用变量可在变量名前后加 % ,即 %变量名%' [! a; W5 v7 T  ?& b8 O4 y
set #显示目前所有可用的变量,包括系统变量和自定义的变量
; K; ]4 P& i0 P" N& a6 E9 cecho %SystemDrive% #显示系统盘盘符。系统变量可以直接引用7 m- S7 r0 }4 n
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
! V% W, n6 q/ S, Y; Hset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
% O0 k, s$ @  @4 _  U0 F) _echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
4 [* S: s1 ~+ b; O! j5 b5 yecho %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
. ^2 G# J5 o3 n0 G- T$ G" `! ]echo %p:~6,3% #显示第6个字符以后的3个字符,即aa26 i/ D; m7 y/ d; w- c- c7 G
echo %p:~0,3% #显示前3个字符,即aa1' J, X6 n8 {* y5 p6 p& `* h, E. }
echo %p:~-2% #显示最后面的2个字符,即b2: E' o; D$ P  z# b0 j: M
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
3 I3 ]9 D( c  F, {' G$ j+ b) {echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb24 x! y: H! J( d: a* h- R6 Q# l+ \
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2# X7 N  r: ~# U: c+ g
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb29 q& ~, Z: H, ~* D: n% O
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
5 w1 ~0 K0 r  P& E3 S+ V' Sset /a p=39 #设置p为数值型变量,值为39
$ S2 R; h, C8 M% C- `: G# Tset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3! N, a3 n/ q4 C. T7 q" n- c$ K
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用9 s6 p# a# R1 V' m+ Q
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
9 c7 h6 N5 B" X3 b8 kset p= #取消p变量
9 K' _  l# X5 }3 s' }* ]( ]" S6 tset /p p=请输入
: x, V9 j: F8 N% a8 D2 i屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
  A- f9 l, |; r! q* d注意这条可以用来取代 choice 命令
# n4 q: f3 E" z, A% x注意变量在 if 和 for 的复合语句里是一次性全部替换的,如3 B* |- P* n9 S! O
@echo off
: ?8 `6 b- ~% n9 g% P& eset p=aaa* d) ]4 R; x8 [$ O  e
if %p%==aaa (
% [0 o& G+ T$ k# B7 ^9 S+ E* necho %p%
+ u5 P4 p9 T& v. Dset p=bbb  I! S& [! }0 y/ y
echo %p%
1 U0 k% E! u3 T% \4 F)
& _# [( V' @) _3 s. n$ R结果将显示* B( X0 g7 y% m3 n# x" D
aaa6 ^& G0 G9 O1 H% n1 A& ~
aaa* V: O1 q( H" f+ _( ]
因为在读取 if 语句时已经将所有 %p% 替换为aaa5 j3 ^4 |* k% ^6 o* J4 B
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"# T8 M6 u2 Q$ X" E
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
7 S3 l* B, x2 M" ]! r3 A- h@echo off
: j+ `, t+ y2 }" |) T  OSETLOCAL ENABLEDELAYEDEXPANSION
! ?% ~0 V: M; V! v2 v$ Fset p=aaa
5 b! p. U- k( X- v$ |- rif %p%==aaa (
/ _4 _! x" d8 h  ?; |# i  Gecho %p%
* ~9 a9 V# N! |7 w" f# fset p=bbb
/ A6 C4 @9 G4 L1 k2 ^' Q" t  ~echo !p!
0 ?8 ]3 q/ g: B/ b' U( t; M)+ K' ?, C& I$ ?- N
ENDLOCAL. d% n$ a% p" ]3 a4 H) E* J8 o
结果将显示; q+ Z/ e7 B7 Q) P9 h) R# o
aaa9 P; M! r# ~5 b& y8 s- {
bbb
6 G3 t! a3 s2 f/ C' Q还有几个动态变量,运行 set 看不到) g4 V6 M( p2 Z5 a
%CD% #代表当前目录的字符串/ @( o- T8 l$ B) M" n
%DATE% #当前日期
# k2 H3 g  ~7 @3 @# v%TIME% #当前时间
, V* d5 ]$ c7 D1 p1 W5 V, i/ {%RANDOM% #随机整数,介于0~32767
7 O' M4 }- c& Y) a%ERRORLEVEL% #当前 ERRORLEVEL 值
- l: q( w" q  x+ D7 ?/ Q  m; ?%CMDEXTVERSION% #当前命令处理器扩展名版本号
) w7 i! |& S' x8 b2 o%CMDCMDLINE% #调用命令处理器的原始命令行
: k6 b1 G2 b; ?可以用echo命令查看每个变量值,如 echo %time%' u( x; A2 o: I8 |  \9 a
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
0 e' ^3 a& `! O* d3 L- A0 k4 \  V+ \
32 start5 V" G! f  Z, N2 ~9 s1 H4 x
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
3 y5 J1 a/ F5 q7 n* M$ N- j8 Y4 u2 S4 S
33 call
' e# A0 V& c7 X5 ^- }批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行6 j& M3 [: I! f: E0 L8 b5 h
有时有的应用程序用start调用出错的,也可以call调用+ k/ x: E4 d7 ~' b
) r0 z  ^- {& ~5 M$ M( {
34 choice (外部命令)# r' u' s9 @& v  E# m& E; G+ H
选择命令
$ G+ \) _5 n) c  Y& W, K让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
* e" U8 Y" D3 hwin98里是choice.com
$ H( r4 `/ y: S& s2 z1 n, Vwin2000pro里没有,可以从win98里拷过来* d7 a; S( e/ [3 G
win2003里是choice.exe  v' W- _/ N' k' x6 a1 ^
choice /N /C y /T 5 /D y>nul
" ^3 `/ _) Z0 l( H, n% h延时5秒
- s& H8 [1 X4 M3 J7 s0 r/ U. C& A2 ^% b: a0 `  G
35 assoc 和 ftype
4 h/ y- v  g0 Q, W3 p文件关联: W$ v7 U3 N, g
assoc 设置'文件扩展名'关联,关联到'文件类型'
/ T) k$ I& V- b" d5 ~/ V3 qftype 设置'文件类型'关联,关联到'执行程序和参数'  J6 B2 [. T' P0 a9 C! x. @
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
/ Z( |' k" j+ R( O1 f; v而是先判断.txt属于 txtfile '文件类型'
! Y) y( u  B2 v+ ?9 m7 a) Q再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
  ]4 V6 n& F; o# _4 a可以在"文件夹选项"→"文件类型"里修改这2种关联
1 T) g* }1 {6 ^- \1 z! ]assoc #显示所有'文件扩展名'关联% a" u- j- U2 t% H: p! u
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile6 |! z7 e$ F' m$ m4 j  ]4 E/ M. K
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8% [0 q4 h" O9 o4 P% U' H
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile$ C/ t) O5 _8 B6 H- s: C9 j
ftype #显示所有'文件类型'关联: k# n5 c  q4 S
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*( c. ], s5 g2 \4 k4 y5 z
assoc .txt=Word.Document.8
# m; f7 D. g$ v3 V% ]+ J设置.txt为word类型的文档,可以看到.txt文件的图标都变了
2 o1 l7 o& |( D  g7 D, c% T0 ?assoc .txt=txtfile' J5 ~+ g  s' {6 ?# @5 t
恢复.txt的正确关联
+ }- U9 E# G+ M# y$ l6 @" Cftype exefile="%1" %*
  b! I) o8 p; w; Y5 x) F恢复 exefile 的正确关联
& U7 J2 [5 [; v如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
: V8 V! o0 v- q5 z. s1 K# \' O' S) f1 E/ }  C9 l
36 pushd 和 popd
) ?4 C8 \+ S$ K+ i5 O- }切换当前目录4 y. k" e( H' X9 D6 g2 N, ^% Q/ T+ H; ]
@echo off4 s& ]5 n' t' p+ K! F$ k" U
c: & cd & md mp3 #在 C: 建立 mp3 文件夹
! J- e$ a# k2 x4 S! i7 ?md d:mp4 #在 D: 建立 mp4 文件夹3 Z- @0 j9 |7 o" p5 Y
cd /d d:mp4 #更改当前目录为 d:mp47 S+ k4 L: {; H9 i2 ^, q: L. G
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3; X* q) b1 l' T' ^7 P
popd #恢复当前目录为刚才保存的 d:mp4
3 k2 Z! ?  u% L, ~$ A- A6 p( f1 H$ T& b. i, M8 O- S
37 for
5 w$ H# q& Q* p/ V, D) x2 |循环命令
0 I, f* V5 b# ^这个比较复杂,请对照 for/? 来看" |0 F* S$ H% L# \; Z
for %%i in (c: d: e: f do echo %%i
; U: E' j; F- o- C+ l依次调用小括号里的每个字符串,执行 do 后面的命令; F  m" j+ Q8 U( a# O
注意%%i,在批处理中 for 语句调用参数用2个%8 y+ h% [5 L& ~# W* s* Z
默认的字符串分隔符是"空格键","Tab键","回车键"
) f9 _3 C: T) C! k8 W) L2 }for %%i in (*.txt) do find "abc" %%i  a$ p( ?1 \0 D
对当前目录里所有的txt文件执行 find 命令4 w7 Z$ _# G: ]4 ]' v
for /r . %%i in (*.txt) do find "abc" %%i
; O# L( ~- m% k4 p5 A9 R& ~在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
9 t/ m& Q3 e: O, l$ g8 C' ^# Lfor /r . %%i in (.) do echo %%~pni* q7 h+ ~* a9 J( P1 v* N) G0 [0 f7 V
显示当前目录名和所有子目录名,包括路径,不包括盘符: t+ M8 [6 g6 c/ I
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt5 o2 L6 H5 f6 m( w( x/ |! ]
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
/ }) v% l; I4 K* o8 I5 mfor /l %%i in (2,1,8) do echo %%i7 }  k" X5 y! b7 i+ ]+ y0 ]+ s
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
$ N9 g9 C  [& ~4 s, e% yfor /f %%i in ('set') do echo %%i
1 J" c" U( n3 p! q5 p3 O2 D对 set 命令的输出结果循环调用,每行一个
5 r2 e9 j9 h, M0 H6 b8 w! |for /f "eol=P" %%i in ('set') do echo %%i
( n- H! v* y6 J! r" X+ P取 set 命令的输出结果,忽略以 P 开头的那几行0 {( U1 c8 [/ f3 t( }9 C
for /f %%i in (d:mp3.txt) do echo %%i
: [  s4 H6 g- X' @& u% {显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称9 i' ]/ I) @6 q3 W( N
for /f "delims=" %%i in (d:mp3.txt) do echo %%i9 ]6 t2 t! F% R4 e, ]! I7 K# a6 @
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称; C$ k/ f6 j( n  t; l; ^
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
) {" V- t! L3 M0 T对 dir 命令的结果,跳过前面5行,余下的每行取第4列) T4 c9 }  S, r6 x$ Q6 |7 Z1 V( {
每列之间的分隔符为默认的"空格"1 I; n- A8 R4 S8 L
可以注意到 dir 命令输出的前5行是没有文件名的
8 M2 k0 T+ N8 a% nfor /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
: p) w0 e$ H: z' recho %%a
" ]( |1 d7 c$ _+ i! z. Aecho %%b  Y1 A% j7 Y: [2 q3 |
echo %%c
. y2 \: k9 C" p" })
5 b+ H" ~9 J" R3 }7 Z& ~8 n对 date /t 的输出结果,每行取1、2、3列! M* K, w# F3 Z1 F0 L0 R5 ]) b
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列; d. k% \  ]( ~0 j
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
/ `$ F, a$ B8 e4 ?, a8 S其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
* Y* i9 \1 c6 A; \( cfor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
2 J1 ]) L8 v  g" O% [6 r取第2列给 %%a ,其后的列都给 %%b
0 v# x4 D2 U' j( ^" O1 g6 e( b
38 subst (外部命令)
$ |& M: y7 s2 p+ w1 c1 e  Z% B$ r映射磁盘。6 m% b5 c% k6 u" h) w. R; [5 Q
subst z: serverd #这样输入z:就可以访问serverd了9 u5 H, D' V" M& l
subst z: /d #取消该映射' A! j! V7 V7 e  t; A' t4 `/ q) Z0 O% ^
subst #显示目前所有的映时. ?" X4 n/ g) y' J

& J; A7 U% K9 c# ?39 xcopy (外部命令)7 c" i/ X: V7 V$ ^
文件拷贝$ R" h2 W( `3 Y1 \0 p0 C9 C+ c( B, j, b
xcopy d:mp3 e:mp3 /s/e/i/y
( [, m6 u' F6 ]4 C  z; ]复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
: B5 n% F6 N* T# g3 f* K加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问% _3 h' a1 p9 A
9 }/ H' o* z' |. d/ _
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退3 }: Q5 A  O/ P. C
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:/ J3 g) ?% H5 V6 n  C0 e8 i
    * {) _% H( h$ v2 c3 l- b
@echo off
( V7 c3 P9 E4 \0 J6 }set p=aaa
/ w- x4 `. P  _+ i( e. h  Nif %p%==aaa (
  f8 K. ?7 \1 a( e9 c0 becho %p%
% ?6 \, e" I4 s% |+ i( C; ~8 lset p=bbb' Y5 {8 W* j( _6 }: u( R( W
echo %p%
' u2 @4 P! c8 N2 j: U: R8 ~0 _! S)8 d) i# y9 e6 Q
pause
  • 截图:
    2 ~6 B* I/ |; Z
  • 2.批处理.bat 文件中输出中文乱码

    9 @. z7 o; K2 ^
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:' W+ k( l  y7 X% F; i) i
    • 效果截图:$ h$ E& I' k( M7 E: M4 i& [0 i

      " p  W! v6 C# _; h% H
    " E* f* P0 g; F9 X

+ s. t0 n* Q/ w- y- N* {* T+ {5 L( q

本帖子中包含更多资源

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

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

使用道具 举报

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

本版积分规则

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