|
|
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!5 ?' Z- R+ @7 D) Q
前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效+ Z/ d6 a* ]* J9 [0 x8 A! S# N7 W
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
( a+ a/ E# D9 K/ d2 i4 I4 b" y名为bat 目前比较常见 的批处理包含两类:
) O! }! q: v5 J" a2 L- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
8 }+ `% t) N2 {% [4 @+ E9 p+ T
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的
. }4 T+ e& `9 O命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
9 {# ~1 @- c; q 怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出. n4 D' L' g" w/ X
批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set
: y$ Z! P2 G. n$ y 批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||) B& E! i1 B) T1 A1 Y
常用DOS命令- 文件夹管理:7 c! n9 j: X: N" c
- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。' w5 w7 q( q8 i5 ~. ?9 X2 N% C
- 文件管理:( e4 Y) I: h7 P$ E# Z
- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同
) E) F3 c/ `" p" X1 n
- 网络命令:8 w* m! I: T* H; C' D5 g3 v# d
- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表% Z3 T9 Z' ^) a7 x7 z
- 系统管理:# B* Y) [: L' B" J8 h
- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置8 _6 R' ^4 p1 O1 P: _& L$ ^+ v
2 @) H; r! P8 g* R6 G
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
# P' d& V0 V Q
1 T7 o. U" q: {3 p' BWindows Batch 常用命令$ l" E ~4 s+ h0 \. b2 K; I$ O6 u
1 echo 和 @
, b0 d" }; [- L, a2 G回显命令( T& {8 K) ]0 f- R) ?! H
@ #关闭单行回显6 J7 ], G- }* V4 `/ ^" N$ p
echo off #从下一行开始关闭回显
, L# N1 Y5 x- V- w. }@echo off #从本行开始关闭回显。一般批处理第一行都是这个, a. @1 c4 M$ F+ n$ H% h5 |
echo on #从下一行开始打开回显
N0 ~% g# t, ]6 N# Iecho #显示当前是 echo off 状态还是 echo on 状态3 K& x5 v) A7 R n0 g
echo. #输出一个”回车换行”,空白行
# S9 R% z9 J$ y2 C( ^0 y3 h) _4 D#(同echo, echo; echo+ echo[ echo] echo/ echo)
- C2 W: D; T# `0 c/ R; m" y- U0 G( H2 j& l7 R7 x! f; g
2 errorlevel' v: }6 j' {) N7 d
echo %errorlevel%
3 I8 S b$ g9 L: j7 W% I每个命令运行结束,可以用这个命令行格式查看返回码; @: t; T& M) g$ }' L
默认值为0,一般命令执行出错会设 errorlevel 为1
( G' e0 n# k) p8 b) t5 M, p6 z
3 dir
2 G7 ?* x) P! C) K4 `4 l显示文件夹内容
, Z9 E* j6 S; B4 rdir #显示当前目录中的文件和子目录9 y9 n, F, J- I4 \) [' s9 a
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件
: w2 _% D$ F# E4 Rdir c: /a:d #显示 C 盘当前目录中的目录
- n* @' f8 v) k) d- E0 N7 I3 \dir c: /a:-d #显示 C 盘根目录中的文件
& o: M2 F: u9 l+ Q) T n) f; pdir c: /b/p #/b只显示文件名,/p分页显示7 R; R* [7 v1 d8 x7 |3 g
dir *.exe /s #显示当前目录和子目录里所有的.exe文件$ A4 t9 h% }2 V' }4 q4 s
. k( p9 F) {$ b4 g: N
4 cd# Z1 F/ L# T9 N3 j
切换目录
W2 `4 r' f( j8 c" kcd #进入根目录9 V# ^# t: h1 g/ Z
cd #显示当前目录
9 Y- a2 d0 A0 C! gcd /d d:sdk #可以同时更改盘符和目录3 J1 d6 }+ Z. h/ d7 O7 z' X
! B: L. W- A: P" @5 md! N$ g* ^( @' f1 b4 W# E) ]5 \
创建目录" O8 v8 z' y8 R+ g- U
md d:abc #如果 d:a 不存在,将会自动创建中级目录) N$ C* h4 I( }- z4 E |
#如果命令扩展名被停用,则需要键入 mkdir abc
0 N& v5 e: M& {* P/ L& h" E" @8 @3 t0 ~7 {. v. k7 O; d' Z
6 rd
7 u- r1 @" N \$ i P, u2 a删除目录
8 a# ]/ B8 t$ mrd abc #删除当前目录里的 abc 子目录,要求为空目录3 l( d# k- Y/ _# P* i1 r
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
; ~; l' K$ p$ ?9 q" L( l0 o8 Q1 h1 @0 S6 y4 D# [! ~& u6 d8 [3 [
7 del$ l, S3 i0 a t C
删除文件
o, p& x( o% A# i* C' ^- O: Udel d:test.txt #删除指定文件,不能是隐藏、系统、只读文件2 O. F( z. c& p0 K' Q l
del /q/a/f d:temp*.*) M+ W8 V& L; K
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
9 N/ E2 d4 n) L9 i$ [) ddel /q/a/f/s d:temp*.*
: f: a' a" e, W. p删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
6 g4 M j: U& i0 U+ {% L, M+ m6 w; d* r% U$ V. x
8 ren
" h% V8 u& T3 Z2 p5 w: U重命名命令! m) O! B# G/ B- a2 U- b
ren d:temp tmp #支持对文件夹的重命名
8 L/ l Z, Y1 ~: I$ g# d
R; x3 r) O# R: X9 cls
% A6 g2 Z3 l+ ^: D清屏* R. }2 Y& e% B. |
10 type0 r% a3 g" R6 M- d! s
显示文件内容
) c8 w9 P" L8 B! g# o1 ltype c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码0 Y2 w; f! @ u
type *.txt #显示当前目录里所有.txt文件的内容- j! v: \6 M5 I% I
) v" G7 n% n) {! L11 copy
; A3 c. U% {2 U8 C拷贝文件' n3 x: q% L6 S! o2 s* V
copy c:test.txt d:test.bak
# s7 ?4 N- s! M! d+ ]% d复制 c:test.txt 文件到 d: ,并重命名为 test.bak% m- n3 Y! D- {5 m) w4 U, _: G
copy con test.txt
5 H. \# R# E- `9 ^( {# L从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
8 v3 ~9 B. A% i& |' y2 `con代表屏幕,prn代表打印机,nul代表空设备3 ^4 [6 j* W" ^
copy 1.txt + 2.txt 3.txt- j* l. ^. r+ D0 p- v E/ R
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
! V3 Q6 a$ F4 b( Z如果不指定 3.txt ,则保存到 1.txt
! g* a! V( `1 v6 pcopy test.txt + @* n8 K% |4 s
复制文件到自己,实际上是修改了文件日期9 _3 C' t- h6 o6 ?2 e8 N
( U) f& k9 g) W. k12 title4 G9 Q( m/ _# f" u- p, R
设置cmd窗口的标题# t' w1 U3 v7 A4 w
title 新标题 #可以看到cmd窗口的标题栏变了
, M' Q# B6 @4 E ?) T/ l% A7 b, x9 v! p$ ]5 _; m+ S8 h# c
13 ver
* @- l+ p# O! k; q显示系统版本3 c3 e! e) f: I) R! ~0 e3 H% Y, ~! [
0 z* y1 x A( y% Q
14 label 和 vol$ L! n2 M8 c3 q+ z6 K! v! {
设置卷标; S h3 _7 I$ u+ `" `) H
vol #显示卷标, U5 v* U9 z- P6 \ n
label #显示卷标,同时提示输入新卷标
) c9 i$ H* s) q1 d3 Z6 Blabel c:system #设置C盘的卷标为 system
$ I; Y" b0 J. A! w8 U- l; H/ \3 L3 u
15 pause
* V& T) ~) v0 f; c) E+ E+ G暂停命令$ E+ U7 }: l Q$ O; F* d( U
. u( w; B) }; D( u% a16 rem 和 ::
* P! _( y/ ~) O+ u$ q$ x( _6 G注释命令6 }4 e5 `8 q, p4 u; R4 \
注释行不执行操作
; t4 [0 [& L4 Y: ^. F( G
0 a) u0 R( h: A# k h" O0 K17 date 和 time
: y1 B2 [2 q# w b0 K$ d7 N- O日期和时间
. ]% [* A+ q6 D5 l% O, @date #显示当前日期,并提示输入新日期,按"回车"略过输入& [" w2 y: q" r0 O/ |/ N( \
date/t #只显示当前日期,不提示输入新日期
. o. Q6 A% W/ itime #显示当前时间,并提示输入新时间,按"回车"略过输入6 }$ L4 t6 G6 N; {3 |
time/t #只显示当前时间,不提示输入新时间
: T. y- j2 ^. U$ T& b9 U7 x
- A5 a3 s& l* W- r6 ?5 y18 goto 和 : h8 P# ]- l, V- x7 P
跳转命令
7 F3 q4 }" [% j& N4 t9 S/ @:label #行首为:表示该行是标签行,标签行不执行操作+ q3 ^+ }- _1 e
goto label #跳转到指定的标签那一行+ [, h- v. N' s* @& |5 ~
1 x" i# T D3 V! {# Y$ X' k! M19 find (外部命令)
& ?" `/ ]5 j& A/ ^查找命令
) t e& m+ b `7 Gfind "abc" c:test.txt
2 M; d) e# @& Y# V# h5 l- \在 c:test.txt 文件里查找含 abc 字符串的行
N( E4 h6 n4 K, o% y3 g) R0 ~如果找不到,将设 errorlevel 返回码为1
$ N f8 K0 F$ ^& n. _+ J1 jfind /i “abc” c:test.txt
" G9 g% k2 z; a1 k! A' s查找含 abc 的行,忽略大小写0 G" y- H6 K! r2 l3 U
find /c "abc" c:test.txt# k% B6 x/ r3 P8 n( r* s
显示含 abc 的行的行数
3 L8 @% s( }! V2 N
9 Y! x* Q7 B4 e8 Y- k* M20 more (外部命令)
% Y2 E9 I( E" F0 A! y$ z# T逐屏显示2 B" u/ n$ l2 ^' m
more c:test.txt #逐屏显示 c:test.txt 的文件内容; i. X! [& n! ]" V) l% L* V2 y8 K
6 P+ v: O. I J$ |% w: N
21 tree
2 r, J) v8 M$ ~8 E5 X3 p6 d5 H显示目录结构
$ k3 {1 U2 ~: x+ B, Gtree d: #显示D盘的文件目录结构
1 B# ^- v+ q0 C0 f3 L6 g
7 [4 a& J& W& P+ A( P22 &2 ~, k% K' M! k, f3 \% r8 c
顺序执行多条命令,而不管命令是否执行成功' r4 y" H, ~5 z a7 {: g
3 a/ V7 n' y- w% ~! P# |
23 &&, ^; ] u3 x, p" O
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
) v/ Z$ @1 ~+ W6 S% Yfind "ok" c:test.txt && echo 成功; `! J) ^( w$ f
如果找到了"ok"字样,就显示"成功",找不到就不显示
: G- q0 b* ?+ G( e# \6 x. _
$ g: {/ ~' _2 a' T; v- {24 ||
6 J8 v5 u- g& X* x顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令& m4 @3 `# f- a( H
find "ok" c:test.txt || echo 不成功! F) V3 } t, G( {- n
如果找不到"ok"字样,就显示"不成功",找到了就不显示
$ D8 W: }3 h! x) f0 k: J: L
) j- _8 ~1 _# C25 |
* ?3 l$ A% ]6 s7 l# A# N管道命令- e" N6 B' Y& f
dir *.* /s/a | find /c ".exe"9 h" ]4 i5 i2 `
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
q4 V) _- N2 a# m该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数( C J. O' M- ~1 |2 N) N& V
type c:test.txt|more
W+ J- A! N+ S7 y# M这个和 more c:test.txt 的效果是一样的* v* I( u" g$ ]! @0 T' M
$ I% l# d, w: E
26 > 和 >>
% h8 d+ p# G' M输出重定向命令
& ~: d0 g# @7 z! A> 清除文件中原有的内容后再写入
, h/ K# v6 i, q4 @' w. i' U, A* Z>> 追加内容到文件末尾,而不会清除原有的内容
# N3 [, T8 v- W0 W! B0 E: L* s主要将本来显示在屏幕上的内容输出到指定文件中
" p, X+ d2 ~: e, D4 F0 `) p1 U/ h指定文件如果不存在,则自动生成该文件. d& k5 k# A% i" t! `" f
type c:test.txt >prn
" R: @+ ~. P! R* G! \7 ]7 K屏幕上不显示文件内容,转向输出到打印机
( |: D0 t% M- X, @$ Vecho hello world>con" I5 b: q5 E1 n: s
在屏幕上显示hello world,实际上所有输出都是默认 >con 的
; x2 v0 }# [+ X/ T4 y6 A3 J& ^ Ecopy c:test.txt f: >nul
* I5 T( `3 R/ a' y拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
, f, _& O J% k9 a- hcopy c:test.txt f: >nul 2>nul
6 T ^& Y. f, n不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息! l4 s+ ^6 H2 X/ R/ U8 @4 J: L
echo ^^W ^> ^W>c:test.txt7 u7 z y5 \% r; }4 p
生成的文件内容为 ^W > W! j# i7 u7 U+ e4 Q/ }, B' h
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
! f& Y8 O" N, Z" C8 c2 ]. q
/ u: L" n6 T. Q* [& J27 <+ W/ d: t% w k. ^0 s' t
从文件中获得输入信息,而不是从屏幕上' H" K9 h3 h" P* h
一般用于 date time label 等需要等待输入的命令
# t u( C7 n" P: e9 Q0 W" t@echo off- H o# s* H; R" l* I
echo 2005-05-01>temp.txt
/ N* f% \ E+ z# ydate <temp.txt
% e# w3 ^; t9 G; Z) l$ Edel temp.txt
/ p( d, x) X) x0 j这样就可以不等待输入直接修改当前日期
2 z6 y9 T" O" D l# U+ U* j% _0 ?1 B5 ^: U2 Z0 f
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
- n$ Y2 i* G* q4 P2 W2 |命令行传递给批处理的参数
! v8 l: W9 I; B. b%0 批处理文件本身
6 U5 ~# G( N: s, I1 V%1 第一个参数
' n/ R( B, A, m% \%9 第九个参数/ |0 \( b, I8 k2 t2 f3 B
%* 从第一个参数开始的所有参数
7 I8 O$ f, `8 ~7 r批参数(%n)的替代已被增强。您可以使用以下语法:
. J0 i" F2 S: ~, G( D. i& Z( b%~1 - 删除引号(" ), 扩充 %1, [2 D4 t0 I+ `4 M
%~f1 - 将 %1 扩充到一个完全合格的路径名
' A/ K0 j% d& D6 C, }( l%~d1 - 仅将 %1 扩充到一个驱动器号
! x( p# d+ X" w) q3 e3 {9 g4 P%~p1 - 仅将 %1 扩充到一个路径3 Z" Y' W3 O; R0 f* ?8 l
%~n1 - 仅将 %1 扩充到一个文件名8 ^; @$ o' E0 { W
%~x1 - 仅将 %1 扩充到一个文件扩展名
U* ^1 O: m( B7 I7 o% j%~s1 - 扩充的路径指含有短名
6 r" G* m( e1 i1 z/ u) }%~a1 - 将 %1 扩充到文件属性
2 ?4 _- _% Y( y0 B%~t1 - 将 %1 扩充到文件的日期/时间
, g0 p3 f# k# Y9 d9 }%~z1 - 将 %1 扩充到文件的大小
4 F8 }" u* X0 f& @7 V' P%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
3 v, J }0 \6 I* u1 G扩充到找到的第一个完全合格的名称。如果环境
4 B* M5 D/ W5 O变量名未被定义,或者没有找到文件,此组合键会
; y, P6 _7 ~+ N/ W" Y扩充到空字符串% C0 e) b" B. Y
可以组合修定符来取得多重结果:
- a7 u6 M/ ?# Q6 V/ ?%~dp1 - 只将 %1 扩展到驱动器号和路径( l5 q" |+ D S8 c" [& E
%~nx1 - 只将 %1 扩展到文件名和扩展名) R8 L7 f4 e# b7 m1 h9 m
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,2 H5 s& b5 C1 e+ u! N
并扩展到找到的第一个文件的驱动器号和路径。& V9 [6 J0 O! O n9 G
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。/ \- ], Z8 N5 f- t) b: C/ l
可以参照 call/? 或 for/? 看出每个参数的含意! }' `/ J! S3 Y- I
echo load "%%1" "%%2">c:test.txt* a2 k3 e2 h& l
生成的文件内容为 load "%1" "%2"
, J/ d+ E+ K6 `, j批处理文件里,用这个格式把命令行参数输出到文件! c4 l8 J, ^4 ]9 Q* K/ w- S
+ L/ Z: C& r, C$ x29 if
% \9 S2 q. T) x判断命令
4 g' v b; f4 A/ {- Nif "%1"=="/a" echo 第一个参数是/a
! i7 c3 ^: Y+ p1 Gif /i "%1" equ "/a" echo 第一个参数是/a; Y& ]# @" l2 P P r
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
# v9 z% q0 W' v+ N- Kif exist c:test.bat echo 存在c:test.bat文件
J0 a) y( j% C7 Lif not exist c:windows (
" e6 k& s! A- Eecho 不存在c:windows文件夹
' O3 V( V* F% V# j2 |; O3 Y; {& Y3 _)
0 ^" U9 M% W1 ^& d2 Fif exist c:test.bat (
+ d& {3 n: F4 o2 I$ d7 Aecho 存在c:test.bat
) X$ u0 J- B$ P9 s i) else (
. y; q; I) {/ {echo 不存在c:test.bat
/ t, q) N6 l* ~- R# E)
! Z# m+ r6 z7 Q0 H7 F& Y4 ^ r30 setlocal 和 endlocal! G& s( }4 k2 f) B8 y6 L
设置”命令扩展名”和”延缓环境变量扩充”/ y9 G; a% h* o7 o
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"2 X% U. `" [0 B) P
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"% U1 ?0 h& f' e! u$ C
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
2 A$ S. ~: C, p9 ]- d, ~SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
% b( l5 e' x5 J; d$ a4 DENDLOCAL #恢复到使用SETLOCAL语句以前的状态
7 a6 l8 W7 @: a# M0 T" {% E5 W C“命令扩展名”默认为启用. Z1 N9 g' ]5 u/ h: v5 S0 A% e" `6 w
“延缓环境变量扩充”默认为停用
8 r* _6 ]3 ?: g* X' Q& o. t! H/ `& }批处理结束系统会自动恢复默认值
! H5 L2 Z8 w8 I6 i可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程0 Q2 }, D) v9 ^, I+ v
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
+ a( y; E O5 V- r保程序能在其它系统上正确运行" t& M% l }, U* D! Q0 `# ?3 d" j
"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
. Z2 U) U# \8 A0 ^- d- s ]6 D# L: M/ O2 p
31 set
# _# r( Q+ x8 P" W" ?设置变量
4 j; ~' }1 E" d+ V7 v# N7 Z# e& r2 B引用变量可在变量名前后加 % ,即 %变量名%; U" x, _0 t% Y
set #显示目前所有可用的变量,包括系统变量和自定义的变量
. X0 j7 Z5 C) I+ P, Z* h7 T; U3 zecho %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
9 p2 p' u7 Y2 G. v3 zset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1& w4 p/ \* Z& O2 O0 T
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb22 ?1 j6 W. F9 a+ H
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2( f7 a& B5 [5 }+ O x
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb24 T2 E! D$ d+ a) {. N/ ~4 q
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2, d4 D& d( d2 o$ |- J# d4 E* |# e6 J
echo %p:~0,3% #显示前3个字符,即aa10 S9 L5 Z( n1 W1 ~3 t- n
echo %p:~-2% #显示最后面的2个字符,即b2: U$ V" W$ M6 m* |; b+ z
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b" g( r8 q- W& C% n7 [
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
( S) e7 m/ N: ~% y4 F \, W, Necho %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2# }% ~* G% u3 ?2 O1 K* B
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
6 v% y) O2 O5 _/ O! \7 Bset p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb28 ^4 l4 i! u* h" U+ [, z: |4 {
set /a p=39 #设置p为数值型变量,值为394 U0 o5 q2 @2 K" T! G! P7 o1 F
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
4 c$ x" e3 f4 {3 Z& n7 rset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用/ y6 y' N3 J7 _7 d
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?' `3 y2 z5 D) `- B$ `7 _
set p= #取消p变量# |. j$ z5 f' q0 i; S4 o2 Q
set /p p=请输入
$ c* K3 ]% r! k- q. {$ V/ C- L屏幕上显示”请输入”,并会将输入的字符串赋值给变量p* h# ~# I( |+ U) |
注意这条可以用来取代 choice 命令; Y" ^8 P9 R! o1 {9 H7 k& j
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
1 E3 N- N8 N9 w& ]@echo off
* E6 W9 @3 Q3 ?/ ^! t$ `$ Vset p=aaa
+ ~! @) X2 {# w5 ^! gif %p%==aaa (
8 A7 P \ ^( [- R* A1 Kecho %p%
# `3 U1 t0 g y; ?' Y) oset p=bbb& _) _( a* i r+ t+ y
echo %p%0 t6 Q& L4 `! g! L0 @5 `
)
3 p" X8 ?4 ^3 w+ E; n1 y. }% H/ h结果将显示% r" i4 H6 @# C7 ]. b
aaa
9 `8 X# Y% v8 H$ k- a6 Q; S+ Zaaa
- N$ D5 q, u0 u4 r8 z& {8 D因为在读取 if 语句时已经将所有 %p% 替换为aaa
0 [% ^( Q3 U4 a3 N. E$ O; G$ z% q7 E这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"% T3 T/ m2 R' d! m; e8 @0 ^# ?
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!5 x$ v" i- N6 i* n3 x
@echo off" H. j2 w. Z6 n* h# K
SETLOCAL ENABLEDELAYEDEXPANSION' y9 r# Y* C1 t$ I, ?
set p=aaa
) k6 G- ?2 n2 i* Z8 bif %p%==aaa (
& v. v2 c" c0 u* K1 techo %p%5 k) t& \8 g& z. Y& ^5 w# Y7 o( u
set p=bbb {/ {) e9 R+ T) a) Y
echo !p!3 w$ P5 [) s3 d
)
( |+ n: i9 _% @3 k/ X# S2 a) h$ J* FENDLOCAL m5 v7 S, ~9 e! G, ~ S
结果将显示
& Z h/ x7 V1 r$ _2 Paaa
9 G1 U2 f+ x) {& T8 {; I- V0 S/ Tbbb
. s, p' n+ p4 k5 z: M! P6 g1 Z还有几个动态变量,运行 set 看不到' X7 m8 _$ y( T" g, u
%CD% #代表当前目录的字符串
% v& o8 ?( v/ v! f5 M. ~2 `# K%DATE% #当前日期" k2 Y1 K3 s9 E
%TIME% #当前时间
5 d4 J3 u( f/ l) s$ v%RANDOM% #随机整数,介于0~32767
$ o; s7 P) P0 I! O%ERRORLEVEL% #当前 ERRORLEVEL 值
; S. f2 Q% R1 g ], `/ b, h9 r; N%CMDEXTVERSION% #当前命令处理器扩展名版本号* n9 L+ {( H: Q, {) X6 f! R
%CMDCMDLINE% #调用命令处理器的原始命令行
% N+ ]# b: V# \8 d$ I) j可以用echo命令查看每个变量值,如 echo %time%" y+ Q+ g4 ]7 _$ \
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
% S W* _, \$ h4 d) o$ M9 e2 q# R( u0 W6 N U
32 start
3 y$ ?1 F9 x! H: T: p' {1 s* y批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
7 V; F' Q9 Q1 B8 Q+ k$ f' O) O9 e/ y# d' E1 F7 |. j1 ~8 s8 s
33 call
, D1 N) f" s! F( Q3 J! I批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
8 g4 a b6 G7 g5 K H有时有的应用程序用start调用出错的,也可以call调用1 j. Y8 Z+ R6 t" c' F
/ |- L2 L4 e& I/ O# w
34 choice (外部命令)" ?2 y4 j O7 `; p' k
选择命令$ R) s8 h b( m2 i
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……% U* M7 b2 Y; P. j6 k7 I
win98里是choice.com
& W# c1 Z- d0 _& Swin2000pro里没有,可以从win98里拷过来
1 q: t( g7 Q2 Q1 n( ywin2003里是choice.exe
3 @& Q* i b2 B: O/ q! Ochoice /N /C y /T 5 /D y>nul
3 f8 M4 U& ?* n- ]延时5秒
- e8 c& x* F1 ?) l4 `8 g
8 H8 v/ J. B+ @35 assoc 和 ftype- H8 F& `5 A# j" b- d7 k8 D
文件关联
. B2 E; ?$ f/ F: c7 y3 c2 ^assoc 设置'文件扩展名'关联,关联到'文件类型'
' i, ?0 p. \, Qftype 设置'文件类型'关联,关联到'执行程序和参数'' f0 E9 ]: Y0 x6 y- M
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开: I. ]) Z; G: |5 t1 L
而是先判断.txt属于 txtfile '文件类型'
l* E5 }6 t. t0 @3 q- M再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1/ P% Z9 P" }; l1 t5 X. l& a
可以在"文件夹选项"→"文件类型"里修改这2种关联
9 {% b' F. j2 w* P6 [assoc #显示所有'文件扩展名'关联4 |$ J6 k( a+ ~+ w; {
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile! X0 N& `5 J; h$ W5 S& I, c+ V# l
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
8 y Z& |6 e3 s* bassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile* [8 n$ P% q4 I$ e
ftype #显示所有'文件类型'关联
4 X- w% ]/ t! j$ _ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*: O# g6 _$ S" M$ F. S% l
assoc .txt=Word.Document.8
9 I6 i0 F2 N" t9 |+ d5 V设置.txt为word类型的文档,可以看到.txt文件的图标都变了0 H, }! g' U8 t) v2 u/ @' E2 O
assoc .txt=txtfile- _5 e( N: O" ?5 J
恢复.txt的正确关联! ~% t0 t4 r! E# K
ftype exefile="%1" %*
; O( N- b8 R6 p# V; q2 l( l. j3 b恢复 exefile 的正确关联! |; q; }" S: V' n/ `) U
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
5 N5 g$ o: I) q0 e' `0 V8 H# W* h
8 t0 d7 Z! k" Z, \# s8 y+ `36 pushd 和 popd
`- \& d1 ^% d V切换当前目录
' b' G' }' B3 ^% I" A@echo off
, n0 |- [! d, N/ x$ Zc: & cd & md mp3 #在 C: 建立 mp3 文件夹, y+ l* ?7 c/ g D! [- V. j
md d:mp4 #在 D: 建立 mp4 文件夹 g/ V; W" a5 c( Y/ N
cd /d d:mp4 #更改当前目录为 d:mp4
3 ?( L" Y2 W. _8 L0 u; K" hpushd c:mp3 #保存当前目录,并切换当前目录为 c:mp34 g W% X% R1 E# v5 v* b- H
popd #恢复当前目录为刚才保存的 d:mp4
) O- c* O* C/ V8 z7 x) p
! _5 H- h$ ?2 X8 x3 l& i5 p37 for# n! D' ~ E1 R- s
循环命令9 j; m# ^! B4 u' Y; s
这个比较复杂,请对照 for/? 来看9 ^( Q2 C' A' }* A% a
for %%i in (c: d: e: f do echo %%i4 a6 Z \/ D/ J$ y
依次调用小括号里的每个字符串,执行 do 后面的命令; j( N6 T2 j$ G0 |/ q( q
注意%%i,在批处理中 for 语句调用参数用2个%
( Q+ s8 w. {( b! g# s默认的字符串分隔符是"空格键","Tab键","回车键"5 J; o/ j' B! d1 z
for %%i in (*.txt) do find "abc" %%i
6 ?5 W* ^ Q% e对当前目录里所有的txt文件执行 find 命令
1 d& J) s8 x+ Q1 B( d0 [for /r . %%i in (*.txt) do find "abc" %%i- r* H0 Y* Y9 b. \
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
; H) v0 O0 w" o+ Q1 U8 a" Lfor /r . %%i in (.) do echo %%~pni
9 [. ?3 d6 ]* y' X( l; s" l8 M& d显示当前目录名和所有子目录名,包括路径,不包括盘符8 z" G; P1 } x$ J
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt* B. h7 C9 e' R2 Y) i! U/ L: J
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去8 P8 V9 u% b. h* ?8 L" D6 u- m
for /l %%i in (2,1,8) do echo %%i1 X3 Z1 L( _& _5 t1 h0 A8 s- r: C2 S6 r
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
( R. |) h( X5 I$ H0 rfor /f %%i in ('set') do echo %%i
+ e$ ~* U' v3 l对 set 命令的输出结果循环调用,每行一个
+ Q+ z) S) n/ R) Y5 f5 |for /f "eol=P" %%i in ('set') do echo %%i! O4 s: Q, q" z* O# |
取 set 命令的输出结果,忽略以 P 开头的那几行3 ^( X: r1 Z# v/ ]& Z' z# c( b6 f. ]
for /f %%i in (d:mp3.txt) do echo %%i
/ H% |: m5 \( G, [% n( G显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
" Y5 q2 L- ^2 X) e( r9 Ufor /f "delims=" %%i in (d:mp3.txt) do echo %%i
, m( u3 n h7 `显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称' C0 ]" W# C' J0 _) I$ v
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a; l h, @. ]$ r
对 dir 命令的结果,跳过前面5行,余下的每行取第4列7 v: ]& D. p& V4 c8 w0 y$ ^
每列之间的分隔符为默认的"空格"
4 Q# k- \, T M, i* q8 w. D# i可以注意到 dir 命令输出的前5行是没有文件名的
& B. L( m- n$ s' _( }for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
8 N6 D/ x& ]& l6 [7 F; E' Qecho %%a
) D2 \* ]. k9 aecho %%b
% B) r4 p$ O- g; U0 Iecho %%c2 d. C( a- |5 ]7 Y, e
)0 Q& @! A' e! w$ q4 H
对 date /t 的输出结果,每行取1、2、3列' W( V$ E/ ^, P) L9 U+ ?
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列2 f A t$ a$ O1 Y
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"' r: f' T9 S( f
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的3 t7 A d- E& | x4 T6 ?1 i
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b) s4 `8 T) \6 J& q+ ?
取第2列给 %%a ,其后的列都给 %%b
" \4 G, r( X( r, O
4 ]4 ^ ]$ h# S8 N6 @38 subst (外部命令)6 Q: y5 @# s# }6 J
映射磁盘。
) _* [, H c7 e' U% ]subst z: serverd #这样输入z:就可以访问serverd了% b' B( ^* t7 h# u+ z
subst z: /d #取消该映射
$ v7 a* h+ T/ X' T$ Usubst #显示目前所有的映时
5 I( f- ? |# I! \ s7 \4 x' c* I0 n
39 xcopy (外部命令)
" s f! Q* {2 r3 l) k文件拷贝
0 m5 x; J0 m; w6 s9 w9 {/ Oxcopy d:mp3 e:mp3 /s/e/i/y
/ l2 D8 ^# p& O" F. ^* D复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件# T* B: q$ K8 l9 N7 T
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
) ^" S. P2 k* o) r% t j6 E
: w B" \2 W4 x- f/ v+ ^5 S' {5 ^常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退' q: a$ [$ [5 G" d. e
- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:
* e& l3 I5 E, ]! a: w" \
) w2 v* ~9 S+ @2 \' B: M2 E* o% C5 S
@echo off
" D5 R; u) E* E; c* fset p=aaa
- L8 t4 C$ W! c& t, H* ]if %p%==aaa (
+ W; F6 \$ Y0 \' T% zecho %p%# J3 r3 K6 h4 F {+ L; k7 \
set p=bbb" f5 z. C: c% J6 x6 v$ ^' u
echo %p%
8 j2 c' j( V( D! c4 M)7 {3 s* N, G6 z: Z
pause
截图:
! E M6 ?4 Y+ E& H; S 2.批处理.bat 文件中输出中文乱码
; D. o, g6 G) g$ ]2 H" e! `- 原因:记事本新建的文件,编码不是 utf-8
- 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
- 操作截图:
: Z4 c; \! X$ r* q1 f. I5 k, T: \ - 效果截图:) V' y% t: d+ Z
$ _6 U ]6 {6 @- R: \' W) D! ^' k) ^
& Q+ L9 q' o5 T. S2 @3 M
2 m$ K! x& n5 { |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|