|
|
发表于 2021-6-25 19:48:12
|
查看: 2567 |
回复: 0
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!$ w d& q: G1 d5 N* J# @
前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效
% A5 _: c0 G) @* U1 r
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
, a$ M( e Z' Z* j' T名为bat 目前比较常见 的批处理包含两类:
) ]) ^3 t0 Z$ `! W- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理2 ?/ Z- A0 U6 Y: T$ M
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的( E3 g( h: v- c5 `: a
命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件 0 Y' u3 W4 S0 ?9 o2 m
怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
4 d- P7 M4 U0 ]8 A' Q2 u S 批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set
) B5 D" W1 u/ r+ s) \9 p H 批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||/ r$ Y" [, K; Q; a
常用DOS命令- 文件夹管理:0 _( P6 U( X8 e" r
- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。6 @' r3 J# `0 i8 K% B% Z+ b
- 文件管理:7 X. V+ j: ?% U3 ?2 k
- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同
! s1 [- M$ Q: V% Z# X- y- }; Z9 _
- 网络命令:; b) l0 m3 r4 k+ ~, v( Q I
- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表7 m7 \9 Q: g6 K* k3 _
- 系统管理:
) L6 U* X5 ?! d. W# f* `7 w4 C, ~5 }- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置, d/ {5 |* ]+ F0 ~2 K
9 ?4 E z9 i: g% ]9 p$ W. D
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
2 a+ R2 ]1 y4 h1 J6 t
$ V9 O; f' t" ]9 eWindows Batch 常用命令8 Q6 L( C1 V5 Z3 a+ u7 Q
1 echo 和 @
: W) v5 N0 y7 \回显命令+ l( O/ k! i1 D* n; W
@ #关闭单行回显
/ O, I1 Z3 W* [0 e. l# ?4 K: Mecho off #从下一行开始关闭回显7 M0 a) a+ b9 Z* F! b
@echo off #从本行开始关闭回显。一般批处理第一行都是这个
4 ~0 J8 I$ }5 Q2 H. T% K. Recho on #从下一行开始打开回显( u. A/ o4 ^0 T' l z9 Q
echo #显示当前是 echo off 状态还是 echo on 状态7 g* q; d& v, t2 B# m
echo. #输出一个”回车换行”,空白行9 |; i( e: A L) R8 f9 Y
#(同echo, echo; echo+ echo[ echo] echo/ echo), _7 R( o7 g1 N
/ m( p2 L$ q0 k1 N4 x' C1 C2 z2 errorlevel* k$ z. m! H4 i
echo %errorlevel%" s3 v4 P+ v, @0 L, |
每个命令运行结束,可以用这个命令行格式查看返回码
& W! C0 C/ T+ J, W7 t默认值为0,一般命令执行出错会设 errorlevel 为1
/ U* E; z$ ?: c6 y+ i/ \* C# q/ x1 H
3 dir3 f0 U A8 o0 B0 [& N2 ~3 b w0 i
显示文件夹内容, L t( W7 g, J7 |: ^/ H# } u% v
dir #显示当前目录中的文件和子目录
, r6 ?& x3 P2 d ]! N& Edir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件3 E9 {, g4 w* U# M) m5 O7 `7 z
dir c: /a:d #显示 C 盘当前目录中的目录( D3 e' c" I- o$ _; U
dir c: /a:-d #显示 C 盘根目录中的文件/ X1 i/ e! `; X9 V4 Q% D
dir c: /b/p #/b只显示文件名,/p分页显示
2 ~% P4 m/ K9 Y6 Idir *.exe /s #显示当前目录和子目录里所有的.exe文件7 J! p% Q$ \% S; D" v
4 L& `5 L7 |! U$ E/ _; D7 f4 cd+ n- z8 Y1 `& q3 E& L
切换目录( i% M# o' X$ G* \7 \9 V+ _
cd #进入根目录
) d$ j+ I! _+ s& h( `1 b! rcd #显示当前目录" ^ J. R4 x1 i, O }* k& I& N; w
cd /d d:sdk #可以同时更改盘符和目录
+ |6 D {+ ?4 G% A0 d0 \" Y5 N2 o3 r
5 md
5 M7 \# a. E7 B8 f3 W6 W8 r创建目录/ M1 N2 H, T5 Q' O, t! J3 U
md d:abc #如果 d:a 不存在,将会自动创建中级目录1 k0 o4 _3 ?" q& c8 I
#如果命令扩展名被停用,则需要键入 mkdir abc
3 T. G' }) c6 E$ y2 V% T& j( V8 }; {
6 rd. G" m: A/ J6 h, |$ u
删除目录
/ c6 ~7 F6 x( mrd abc #删除当前目录里的 abc 子目录,要求为空目录5 n, r y$ D3 e: G% |" X$ e0 n& Z" d
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
1 T5 `! |: g3 d6 |- l/ q& p1 m9 n5 F9 }$ X
7 del
; ?' b B% q2 q7 z8 O# i+ a删除文件9 N" A! b& e# b [
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件! o0 ?7 q. `& K3 i x6 a+ l3 v2 F6 z
del /q/a/f d:temp*.*
/ O$ x' z6 h: c删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录1 h' q* z( Z7 z
del /q/a/f/s d:temp*.*/ i, _& L7 K% Q. p+ D o4 S0 K. u9 Y
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录1 h3 G) e0 E; J( k1 o
# i1 M! t0 s, f5 `4 Z3 A: z8 ren
1 `, F9 o: ?$ g9 ?) h$ X/ C0 h重命名命令$ e# D1 L9 h% m) b3 Z3 r
ren d:temp tmp #支持对文件夹的重命名
0 _( f% m! B3 \# N; B" c) Q. F" B1 J) ^+ ?- |
9 cls( x" J7 `( K, x0 H
清屏 `. N: ^' q- Q, t2 ?) C
10 type8 \$ V' R9 [$ m- l
显示文件内容
2 g" E, L. b7 z* R" htype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
7 D3 B. v4 D) _5 |. F/ Ntype *.txt #显示当前目录里所有.txt文件的内容. s m+ H5 h' |3 u0 g2 }9 Y* i
- q4 b9 I: L1 i. e
11 copy
4 g- m5 d/ I9 p% ~- p" G8 B拷贝文件* |9 F( w/ \6 \! }
copy c:test.txt d:test.bak3 K- J1 f, j. b3 H3 {
复制 c:test.txt 文件到 d: ,并重命名为 test.bak
. t% D. G' F! i' Y' _- m0 h x ?3 Y/ r% icopy con test.txt
% r7 |8 q" C4 l# G0 g从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件/ B0 l/ k0 {. ~; B
con代表屏幕,prn代表打印机,nul代表空设备, [$ h5 g' c3 M$ \- w# U
copy 1.txt + 2.txt 3.txt6 s2 Z# O* ] Y3 _' \7 N
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
) G* U+ U5 h% H2 K! W7 w如果不指定 3.txt ,则保存到 1.txt
/ ?& P `1 ^, C9 C4 R; q' Ecopy test.txt +
$ P! g1 l, j, x9 k复制文件到自己,实际上是修改了文件日期$ T8 u; K' W$ C; Y
: k7 A$ G7 j- t; j
12 title
0 q, W# ~( B6 ~4 L0 u设置cmd窗口的标题
% p. V) ~( R3 N Q# ?) Qtitle 新标题 #可以看到cmd窗口的标题栏变了: ?" G, B& |( V9 M8 e, E
% y' U: R; p V& z
13 ver1 @5 s9 a% k5 c: Y" @
显示系统版本
8 L( M7 \+ V3 V$ n3 a
3 o% L5 l0 \- x l5 A14 label 和 vol& R# J. r) `0 v9 o9 ^
设置卷标7 T: Z: o' g# j0 x
vol #显示卷标
9 o" |1 J Q9 N6 U# X) L( Alabel #显示卷标,同时提示输入新卷标
/ s9 V7 t6 N7 `# T, v' flabel c:system #设置C盘的卷标为 system
# u# F x U2 r1 |, B. [2 j; Z
( e3 ~6 I1 _3 k$ l3 y7 @; W15 pause
, ~9 q, [3 E" s; Z" H7 A1 h) u暂停命令$ q, \$ }) p- W3 y
2 K2 B! V6 O) N! F" H& m- m& L16 rem 和 ::
- s8 f: G. J/ z% _1 `+ g注释命令$ q2 L8 {/ l5 M( @5 t% y
注释行不执行操作
" L6 ?5 v0 r# K* [7 G/ ]$ |9 {# a
17 date 和 time
p% G; z, X }8 O日期和时间 V# n [$ u- i. f$ ^5 g
date #显示当前日期,并提示输入新日期,按"回车"略过输入
+ q7 ]2 F! {( ^* ?* t2 x. @8 }date/t #只显示当前日期,不提示输入新日期
7 d+ f+ y8 o2 R+ P& ntime #显示当前时间,并提示输入新时间,按"回车"略过输入& }: z9 u; F# _: r: o7 K0 P
time/t #只显示当前时间,不提示输入新时间9 l! m8 `, o0 _; B
5 J5 p* g3 K# l* o# q6 i& G
18 goto 和 :
6 k6 g5 i8 H, p4 j, J/ L+ \跳转命令
) \, n3 N6 T. h! \:label #行首为:表示该行是标签行,标签行不执行操作- e4 ~) X y+ G9 \, z# A& M
goto label #跳转到指定的标签那一行
/ j! a- d0 {. B) ~' s$ M7 ^: w+ F$ X6 d+ L4 V) \
19 find (外部命令)# i7 H& `* _' f0 |# h2 V* g1 H
查找命令
$ y2 ?4 q, P4 P4 ofind "abc" c:test.txt
2 o& B) d, U9 E5 o" N6 O在 c:test.txt 文件里查找含 abc 字符串的行/ N3 ^( P* w0 g+ j/ f) t
如果找不到,将设 errorlevel 返回码为1
+ m2 C0 \# j, q+ n/ o" H" D1 A0 Sfind /i “abc” c:test.txt
$ o8 F2 V& \: M7 a查找含 abc 的行,忽略大小写0 w7 ?% N7 f$ X" W7 v7 v
find /c "abc" c:test.txt+ i+ l9 p5 \' Q y+ D8 s( l
显示含 abc 的行的行数
. a) J( Z5 o$ d/ P& Z+ Q: N! f4 w, Z( P3 i8 z: b
20 more (外部命令)
4 w% `3 Z4 n. _1 e0 ~逐屏显示
2 Y7 D r0 A1 y( B0 ]7 K4 gmore c:test.txt #逐屏显示 c:test.txt 的文件内容/ d6 D6 ]6 _8 ^
2 G- Z3 u, f% f' v$ C21 tree1 M/ Y8 n! V. q
显示目录结构, v# U& ^: U" K
tree d: #显示D盘的文件目录结构& ^. s5 z8 D ^4 E
( P6 Y2 R( B" F. Y" ]22 &
* j; ^1 C$ `7 E, e8 R7 o+ ?顺序执行多条命令,而不管命令是否执行成功
2 |: v3 t7 M: F0 M( a. ]; }+ a/ P4 Y. ?" P; g) b* M
23 &&
6 W" X% {, c- M8 C; |3 {顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
u& B A3 V# a6 b- e+ |find "ok" c:test.txt && echo 成功
9 }/ K0 Y. K6 s0 ]3 s如果找到了"ok"字样,就显示"成功",找不到就不显示: O' L+ U) V+ i) c3 E5 \/ z
( I$ E1 v; M! b% `% t6 U24 ||
5 ]7 M$ O/ X8 e* x# B' Z- H顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令- c, Q# R& T3 b* l/ V8 E
find "ok" c:test.txt || echo 不成功0 | P( O" I6 @& I, w3 r8 N' z
如果找不到"ok"字样,就显示"不成功",找到了就不显示! T+ ]$ g8 D+ [% [9 S
) R' u; Q& N# x% I1 s- j25 |$ p: {: B6 C) g
管道命令
' S0 X* \% _0 x: V9 zdir *.* /s/a | find /c ".exe"
5 D8 a- g: K5 Y3 ?1 C G: w. F管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令3 ?; q7 U0 i$ n+ H+ D. c7 M
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数) T' I. z/ q, O1 d/ s6 H
type c:test.txt|more3 r I& ] W! V j. J8 `( Q. e
这个和 more c:test.txt 的效果是一样的1 W% J2 N1 r I1 v1 p: Z' A
% ?" o5 l& Y$ d* m6 M) T2 C8 V
26 > 和 >>
& @4 u [$ p# N( A输出重定向命令
! ]2 D5 f) J; Q7 Z9 {> 清除文件中原有的内容后再写入
: @( z- V! t$ T, T) \/ \8 _: L>> 追加内容到文件末尾,而不会清除原有的内容
6 _5 }% p& Q/ \5 k/ \$ R% d主要将本来显示在屏幕上的内容输出到指定文件中- U/ n' Q% [6 |, H( l
指定文件如果不存在,则自动生成该文件
/ r4 u5 _! B+ y8 X3 _( V1 ttype c:test.txt >prn+ x) N3 M0 I* O# _# Y
屏幕上不显示文件内容,转向输出到打印机
) a0 c: D# S6 d$ V2 `echo hello world>con4 [1 D( B4 F( U/ U' r
在屏幕上显示hello world,实际上所有输出都是默认 >con 的# q. h. b( X8 h4 Z0 d
copy c:test.txt f: >nul
* T+ x7 O/ T3 P拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
! e! `& W1 |" H: m4 x2 f+ C/ Y/ |0 f7 lcopy c:test.txt f: >nul 2>nul5 y0 P) g: h* }# v& ^8 \
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
$ h* s& c M: o2 h& R5 oecho ^^W ^> ^W>c:test.txt
# L/ O; t; b ?' M4 B. m5 L生成的文件内容为 ^W > W. g% c* z; z( ?. v0 ~
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号) [8 R& H: g; s6 h4 ?& P
" o) E4 ^3 g* c8 T0 N+ z27 <, F) c) F$ P' z, Q
从文件中获得输入信息,而不是从屏幕上
2 R6 V) u( d8 \7 I: P! ?一般用于 date time label 等需要等待输入的命令& _, S: f& K) A |5 D8 G" j3 O8 w0 z' b
@echo off
& z2 B. e! Y1 v, lecho 2005-05-01>temp.txt6 d! e8 s; A9 T" N
date <temp.txt
. f/ B/ b8 ?2 ^0 k- Odel temp.txt
$ G$ P @: w- s7 q这样就可以不等待输入直接修改当前日期
( R9 U o/ i+ }; e i. S5 U$ @# X, K* ?5 |) A& Z
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
" \/ F: Q1 e; J命令行传递给批处理的参数. X" A% E! C$ v0 R+ f2 e
%0 批处理文件本身, a7 y0 e& b; @3 q
%1 第一个参数- t* e0 @+ a; e' W" x% E7 A8 R( s
%9 第九个参数
; t! \# D* a0 [%* 从第一个参数开始的所有参数2 S4 A: {; }& R. m& \
批参数(%n)的替代已被增强。您可以使用以下语法:
( Z) Z0 H1 P' W%~1 - 删除引号(" ), 扩充 %1$ H" @- b4 @0 W# [. w% |: l; m
%~f1 - 将 %1 扩充到一个完全合格的路径名
- N' A0 x2 a! s/ O" O%~d1 - 仅将 %1 扩充到一个驱动器号. z6 a+ T0 h p& V- C
%~p1 - 仅将 %1 扩充到一个路径5 k/ S; k' l: `
%~n1 - 仅将 %1 扩充到一个文件名
* w0 m# |2 t6 g%~x1 - 仅将 %1 扩充到一个文件扩展名& m) K6 a( q/ N: I1 `
%~s1 - 扩充的路径指含有短名
" [4 Z' E- y; J0 q%~a1 - 将 %1 扩充到文件属性0 i8 i2 \1 ~6 t/ T- U) @" z3 q
%~t1 - 将 %1 扩充到文件的日期/时间
9 C' I( X ` O1 [# U%~z1 - 将 %1 扩充到文件的大小
! c: E( F8 _" f! s%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
! H: @* b; d! M2 S# b8 t" x扩充到找到的第一个完全合格的名称。如果环境- g' P! [8 p; Y, B7 \) g6 g
变量名未被定义,或者没有找到文件,此组合键会* @8 O/ _: K1 L# P1 V
扩充到空字符串
4 T( j: I! M( v q9 V可以组合修定符来取得多重结果:
) r) a7 Q" k' b* Z Y, u%~dp1 - 只将 %1 扩展到驱动器号和路径
) U; |& ~* L! v* J%~nx1 - 只将 %1 扩展到文件名和扩展名
! r- t7 `" i; f* ~" y%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
- K L$ k: h; n8 x并扩展到找到的第一个文件的驱动器号和路径。 [1 }. z4 F* ~ [9 z: P" i
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
$ @) b& q7 z- j( F: R可以参照 call/? 或 for/? 看出每个参数的含意
b8 O1 y1 p# s: P! A0 J% kecho load "%%1" "%%2">c:test.txt4 ]+ X: Y! _2 c* ~' Z
生成的文件内容为 load "%1" "%2"
0 k( E7 T- D3 I6 ~6 k9 _2 ^批处理文件里,用这个格式把命令行参数输出到文件! m+ l4 I4 l, j: D+ X" l+ h
# G4 @' J3 \" P) E6 V29 if
, p! t# ^' w5 x: v判断命令 ^' D* g* R5 o
if "%1"=="/a" echo 第一个参数是/a' R& E F S; M6 D7 V
if /i "%1" equ "/a" echo 第一个参数是/a: o9 @. s% Q% P, t0 F' w
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?+ m# x( J% f2 w
if exist c:test.bat echo 存在c:test.bat文件* s3 a+ b$ L$ \
if not exist c:windows (
+ U) x9 ~. ]+ s0 K6 m3 lecho 不存在c:windows文件夹
! T% E' v) M, B)
: ~0 a; M, J0 B/ Gif exist c:test.bat (+ J( Q6 y9 y1 I& C
echo 存在c:test.bat
, f q: {* u8 A' e# C) else (2 t2 f7 r; i1 G' Z. h
echo 不存在c:test.bat
, j1 J2 a. X% V2 a)
; K% f" V8 w+ ~! j$ F; X30 setlocal 和 endlocal
# \$ S7 D2 D( x+ P* Z设置”命令扩展名”和”延缓环境变量扩充”/ o; ~! V. r; `3 D
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"* F+ U- m! B; C4 V/ [9 D5 Z
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"+ R% S4 _& i+ L
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"' r: A2 M6 V2 `" _5 @& ~/ c
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
% \0 c+ w* c3 v! YENDLOCAL #恢复到使用SETLOCAL语句以前的状态
6 n( J) R; G3 G4 F# p: c“命令扩展名”默认为启用8 l( u3 z$ ?0 P; J2 r/ Z) C
“延缓环境变量扩充”默认为停用7 K$ W; W4 c5 L, V
批处理结束系统会自动恢复默认值* m- l0 B1 U Z1 T
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
0 B- D( r! `5 o. H" V& k序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
9 a2 \2 f$ K) d$ r保程序能在其它系统上正确运行1 A8 I8 c8 p, \" x
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
A0 E" K1 G0 f9 @3 B) A8 O
1 X0 |) j# R4 D& r& Y. ^31 set4 l d. @8 ]0 ]4 p% x+ l1 i
设置变量
5 \. J% G+ l" t- `6 n引用变量可在变量名前后加 % ,即 %变量名%
' l y& z- L5 P- Z( p# n. I+ Pset #显示目前所有可用的变量,包括系统变量和自定义的变量
: z- e4 `0 z4 W m. Kecho %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
; c9 y# }. r+ g* l5 n; \ B# Iset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1# _! `0 J. N+ L! S9 ]$ e* U( W$ `
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb26 E, u. ], r* R0 ^
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2) V2 l) w2 s* u4 q7 j+ S
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
6 c5 B. a# k0 U. ^0 i4 Q7 becho %p:~6,3% #显示第6个字符以后的3个字符,即aa28 ]. {' [' q/ X3 B Y, N% l1 L* }
echo %p:~0,3% #显示前3个字符,即aa1) j: c9 p1 a/ _
echo %p:~-2% #显示最后面的2个字符,即b2
6 K4 s+ y% K7 ?& ]* decho %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
) I0 X1 B0 I1 W; g Becho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
# s; {( r/ q/ B7 h: Secho %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2: R P0 G; x; y5 \9 o- A+ W$ `/ T4 U
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2: S9 T; ]; T# K! L5 ?- R
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb21 ~* N& c3 H4 O# M: Q% F
set /a p=39 #设置p为数值型变量,值为39+ S, H1 Z5 B S& G, f& m1 o3 V
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3$ \3 g }( w6 N
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用0 Q* J7 Z. @! ~# U" w+ W* k. |
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?! @3 X( `" h9 \/ \1 _
set p= #取消p变量
% H" O7 \7 S3 V+ ]/ ]9 h/ Uset /p p=请输入5 H9 e& Z. ~" b2 x% h
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p' j* ]3 U/ R' n. ~
注意这条可以用来取代 choice 命令
* C+ u' p9 M$ [- o% o3 B$ L注意变量在 if 和 for 的复合语句里是一次性全部替换的,如( r# v. E- W7 |& H6 G' E7 I' r/ e
@echo off
, r- O' X7 N. jset p=aaa* X8 y& _" g: n9 b+ `5 o& a* L
if %p%==aaa (
: S, D6 ^6 e0 ], cecho %p%
' e& q# d7 n% m( Oset p=bbb% ~8 p2 T1 q" t. w p
echo %p%
: U# k- m' B. z)6 K. O0 D8 u* }$ O1 {8 R( Z) V
结果将显示+ }: E' w) ]( D
aaa, P" O* z6 Y4 `- p9 O
aaa
/ A% `; H, o2 {; z- @9 N因为在读取 if 语句时已经将所有 %p% 替换为aaa$ d- |' p# w% q$ R, t6 ]
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
& H- k5 w1 U I可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!" g2 r( A4 G5 m5 U7 Y/ w
@echo off
5 W7 S% D j" z2 lSETLOCAL ENABLEDELAYEDEXPANSION, L; T; y" ]& ^/ H3 ~& Q$ B
set p=aaa: ~8 U1 ^' e3 e `1 Y, M. Y
if %p%==aaa (2 C& p" V7 j4 K2 N$ Q
echo %p%) {, ~" E: n3 X; g
set p=bbb7 s. Y. m+ \3 ^' G
echo !p!
1 U1 G; r, d. T$ L. |8 G) O0 n c- J3 j1 ^8 |$ s7 R
ENDLOCAL
0 z; t: O' w: T& h4 o$ ~6 c+ q$ A# a1 w结果将显示
/ N6 h2 i5 D$ I# ?# {8 ]aaa
& C* {- v6 j% y+ d3 ]5 c9 d5 A2 Kbbb6 b0 B/ o$ k; {; S) F" M
还有几个动态变量,运行 set 看不到, g3 y. N7 J: i4 G" ?& L
%CD% #代表当前目录的字符串' h8 h9 z) |- A1 |
%DATE% #当前日期% _% ~# I8 \4 W5 t6 c* d
%TIME% #当前时间5 _/ B( l- i3 l- X; q# |6 r
%RANDOM% #随机整数,介于0~32767
. \: X0 N4 `, J' \$ N& A* _7 ], U%ERRORLEVEL% #当前 ERRORLEVEL 值' d. B, J$ l; B& U7 @* p8 @; N" c
%CMDEXTVERSION% #当前命令处理器扩展名版本号
% F, r% C$ O; M( W$ X6 `2 ~7 w3 T%CMDCMDLINE% #调用命令处理器的原始命令行' N- n4 O- P, c- u/ g9 `
可以用echo命令查看每个变量值,如 echo %time%, N- b; \( I/ w; J8 d
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到4 t! @8 b( @6 Q; N0 l6 J* g; x
5 i' I4 h% @! ]' u7 W
32 start
+ N; h2 g# g; O7 |8 q批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令9 v" H4 P8 p; [( r: R1 A
# Y7 a* `8 A* Z) |
33 call
- i2 v4 `, ?, c% i8 K) Q- }" r! V批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
" |; Q' R: Q1 P9 K! ~有时有的应用程序用start调用出错的,也可以call调用0 M% j& ^8 H7 e
; o; ?0 `# C. r4 U" g3 a8 _
34 choice (外部命令)
! }( }3 J* z# u3 i W) h选择命令
3 f2 A/ Q1 m* H( e8 J7 t让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……7 r# o( E1 c) q" b4 R, A q1 \* ]
win98里是choice.com3 V* f0 d1 T6 b& |
win2000pro里没有,可以从win98里拷过来
, K: @$ n" s' l5 v3 {7 N. s, K0 ^3 t1 @win2003里是choice.exe
: Y8 ^, ?+ I) V' d* ]choice /N /C y /T 5 /D y>nul
& C# T' c* G& ]4 [& \延时5秒/ f0 Q- C# j1 z6 ]2 ]6 [
5 A7 N, D3 J% ?# U2 U' S" \
35 assoc 和 ftype
% l* y3 }. Q$ D4 V+ W* M文件关联
7 [ e' S6 J6 ]" C& G$ H$ L* rassoc 设置'文件扩展名'关联,关联到'文件类型'6 g9 T" Z0 G7 u1 J) Y8 d) a
ftype 设置'文件类型'关联,关联到'执行程序和参数'! j) J5 Q: ?$ ?, k8 K8 _
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
5 |( V3 R. F. T: \% D4 s( N* b而是先判断.txt属于 txtfile '文件类型'
, g( L8 k- m( G; E" ]再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1& x* A& u2 e3 g) q
可以在"文件夹选项"→"文件类型"里修改这2种关联
5 H2 Z- }1 S$ W! s1 Hassoc #显示所有'文件扩展名'关联
, e7 L9 _5 d2 P8 H% Yassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile# v8 b, x, b ?
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
' b! S- n) x* x6 V; G, Wassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile1 `! h+ e J# Q
ftype #显示所有'文件类型'关联 |$ V2 e2 v0 w5 @1 E; X3 Q
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*2 a+ `6 F$ a2 U; c
assoc .txt=Word.Document.8
) o* @ ^! Y' m: c' Q设置.txt为word类型的文档,可以看到.txt文件的图标都变了
/ P U& {+ `& A& Nassoc .txt=txtfile
8 t4 B- c) j6 Y: V+ ^$ L恢复.txt的正确关联- M' `# x: @( ]7 S0 F6 n' \
ftype exefile="%1" %*' Q, X- L& v2 `. U/ `: E5 D+ _, y3 e
恢复 exefile 的正确关联4 S4 e6 C$ A' P& v, G
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
7 Z% `2 ?" |5 w+ w: v7 H+ c
+ ]+ f, l. F3 M* F8 h( I: [! r36 pushd 和 popd1 D2 J; a, E& I: H
切换当前目录' W/ Y; [# I* P& E1 X1 k
@echo off" p- k' u1 P2 `
c: & cd & md mp3 #在 C: 建立 mp3 文件夹8 p) q c) V2 m
md d:mp4 #在 D: 建立 mp4 文件夹7 y. g# e' w8 ?# ]
cd /d d:mp4 #更改当前目录为 d:mp4( D/ ^5 e/ h7 O' E" x& {2 U
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
- B" i+ p3 S4 D5 W6 Dpopd #恢复当前目录为刚才保存的 d:mp4
9 v" W; z7 f+ q7 k) j6 V
! L3 |5 m( G4 h1 W, m. |& m37 for
# R5 G( F- l! P+ [) X循环命令3 }0 p6 c' \4 {
这个比较复杂,请对照 for/? 来看
! M( Y! w. h9 V6 U& O! X. ifor %%i in (c: d: e: f do echo %%i( [! N$ a/ F/ N
依次调用小括号里的每个字符串,执行 do 后面的命令
: h/ x3 W8 l2 _9 X! y' J) E注意%%i,在批处理中 for 语句调用参数用2个%
3 D! I# X& F3 A6 ]# x7 ~9 E9 H9 h默认的字符串分隔符是"空格键","Tab键","回车键"
1 A% X7 T `+ s* M4 Hfor %%i in (*.txt) do find "abc" %%i2 j; C; y9 v- ?* H! B1 ]
对当前目录里所有的txt文件执行 find 命令
' H( i- t! u- d$ F" g1 `1 lfor /r . %%i in (*.txt) do find "abc" %%i, n: O+ v X% W" }; v
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
+ c$ i6 O1 q" |$ @for /r . %%i in (.) do echo %%~pni
1 W4 M; c5 @9 O+ a1 d显示当前目录名和所有子目录名,包括路径,不包括盘符
R: y' [( t7 b3 Ifor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt3 ^3 A1 V# H3 k! E3 q
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
7 g" ?7 |3 g! l4 }for /l %%i in (2,1,8) do echo %%i
F* \! h: ~. y% C' [- U生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
& v L7 w. M' Kfor /f %%i in ('set') do echo %%i9 B. K4 d! L4 z, ?
对 set 命令的输出结果循环调用,每行一个3 e0 w4 _$ C. n0 v3 v
for /f "eol=P" %%i in ('set') do echo %%i+ Y5 X2 {( Q7 w* g2 V
取 set 命令的输出结果,忽略以 P 开头的那几行
, k9 H% T# e4 t0 @& }! @3 [ nfor /f %%i in (d:mp3.txt) do echo %%i
w$ s! \1 N3 |; l% ~3 ?显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称( ^3 O8 v; i( p1 o+ Y. }
for /f "delims=" %%i in (d:mp3.txt) do echo %%i
3 |. W/ n/ G/ T4 d显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称7 e9 k( ]" F. t5 r g& g
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
* V0 K& H) T* P9 f% N/ S; }; ~; v对 dir 命令的结果,跳过前面5行,余下的每行取第4列1 Z, Z0 z$ z0 K" l* c
每列之间的分隔符为默认的"空格"* k! e! z' c9 O
可以注意到 dir 命令输出的前5行是没有文件名的
2 H6 P) l! l- R* v3 v+ [1 o7 O0 |for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
$ A$ z+ ]4 S D O, qecho %%a3 s4 V0 H: u, v, P* m- F: S" h% O
echo %%b" W6 A8 Y8 [ E- e: {7 d
echo %%c, P% R" J% k; |2 o- K, X
)9 R" f S. K3 x& y/ U
对 date /t 的输出结果,每行取1、2、3列5 _$ a7 L* n3 }; o: f( P
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
3 E- R+ X" X0 J分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"8 V {; `2 v' C3 `
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的" m& ^' Q! L& N) r( r
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
) d; [9 _8 C- @6 I0 K" b取第2列给 %%a ,其后的列都给 %%b4 L6 _& a7 X. m' ^+ p) z% g" D
# [/ j4 a+ a/ s% p38 subst (外部命令)
$ Y* ^# {5 v3 L/ n3 N2 W* T映射磁盘。/ A7 p/ i x$ d5 m9 d7 O9 s+ z4 m1 x
subst z: serverd #这样输入z:就可以访问serverd了
. U( `+ d8 g, F5 ^. o, {subst z: /d #取消该映射
* B1 L$ J# f8 b0 }* J! Isubst #显示目前所有的映时
3 I( @8 _5 [5 y3 u" |# q/ |8 P. z* l% u
39 xcopy (外部命令); d |7 H. L( c7 i
文件拷贝* f0 o& G6 ^# F+ P
xcopy d:mp3 e:mp3 /s/e/i/y
+ f% Y7 F. {: y% x$ O复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件- G6 F- c0 K! V: o" ^7 a5 I; W c1 I1 c
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
+ {; y7 c2 u O, o& `4 G5 `! \ f. e$ Q! {' M% }
常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退$ h/ ]) X' f, T$ ]
- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:4 \; C7 F! Z$ l! Y; H/ y# |9 s; q
) v) p4 h9 }/ I6 c- ~8 Y
@echo off
- s0 k4 o2 {( m; t- Q: D7 ~set p=aaa
# o* h: b6 [8 H: ]5 {$ Hif %p%==aaa (" V2 r! |2 t: ]) I+ a
echo %p%
/ Z9 G% ^1 |6 B# I: l% Dset p=bbb! `6 ^% L [; f Q9 y; s& y
echo %p%; |2 m0 _) x1 N7 K5 k9 h
); w( t- J3 }$ r) I3 X
pause
截图:7 R: }9 d4 W& _1 v% _
2.批处理.bat 文件中输出中文乱码 ?. l! U8 n+ h* R
- 原因:记事本新建的文件,编码不是 utf-8
- 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
- 操作截图:
; m& ^9 a) r j" W: a7 D: | - 效果截图:. l' e! t9 \; Q4 v* k
8 Q( J& H/ H/ M% _' ~1 o% d ' n) O' v, t( j
5 r: l! B1 e3 v+ `, Q( V3 o( Q4 X
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
|