|
|
发表于 2021-6-25 19:48:12
|
查看: 2468 |
回复: 0
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!
3 i/ @4 u" N& l s$ M 前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效$ W* J( p. m$ l# f4 ^
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展" ], v/ R. l' ]+ ^( [
名为bat 目前比较常见 的批处理包含两类: : x: Z6 A$ S: k, R( M2 a! h$ c
- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理1 s' T) k/ y+ K: \7 q
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的4 o7 I0 ~4 G+ N. a7 i; W
命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件 * I. a& |5 c& v t# ?
怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出- ^( f5 N$ ?1 p& o5 C: E
批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set
1 h0 [2 Q. J$ ~& u1 R/ i 批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||7 F; r0 F) g1 e6 \+ x1 I
常用DOS命令- 文件夹管理:1 H0 Y. y8 {, [( N- i7 E
- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。3 c3 J+ f+ F6 C3 H% l% B" ~
- 文件管理:
& a" a4 B* i( N9 B- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同
3 M. [! Q- `) y: y# m/ P6 b5 P0 x
- 网络命令:3 @$ [& G* u; C* e
- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表! v- }$ K, Y- B" V/ j+ W( i Y
- 系统管理:2 l9 p9 v% J2 V9 }' q
- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置
8 a) ` |. \! N' A) i% n
6 l- R7 Y/ p! J/ {- ~1 w d
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /? ! Q2 y4 ~0 i& O }# p
$ @' s+ v. w- D! [+ [' e9 `; sWindows Batch 常用命令6 _: N6 `. f5 H
1 echo 和 @+ U8 n0 g6 b2 i8 h. @: f: H
回显命令3 T! l/ R( s' ?; f, o7 u
@ #关闭单行回显
' j Z' I; \; decho off #从下一行开始关闭回显
" h6 R5 _* u6 }3 r- ~& C@echo off #从本行开始关闭回显。一般批处理第一行都是这个
( g9 N& F0 j' u# Xecho on #从下一行开始打开回显( Z7 z y- P7 p4 N! c& _
echo #显示当前是 echo off 状态还是 echo on 状态0 _/ {: T( k2 Q9 x. Y' y, X6 X1 c
echo. #输出一个”回车换行”,空白行
9 q, X' ^/ C0 W1 w#(同echo, echo; echo+ echo[ echo] echo/ echo)
- u k1 L* t2 ?5 u, O
* Y* b& D) x7 t0 K. C2 errorlevel
$ y' o K! ~: C! N+ |" N/ ^echo %errorlevel%" ^6 r" X# [7 y6 u. M' {
每个命令运行结束,可以用这个命令行格式查看返回码* a2 X2 S) [4 G8 ]( Z9 I1 M
默认值为0,一般命令执行出错会设 errorlevel 为1
+ [# R( A: x9 C: x- G$ O0 i
7 r8 G2 ~5 [( d3 l3 dir
$ K) `3 e2 I! k* @, C, ]显示文件夹内容
% F$ Q0 Y0 w' @: wdir #显示当前目录中的文件和子目录8 d! f. V$ e8 i5 J/ b+ H
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件" P6 s1 `, W( f
dir c: /a:d #显示 C 盘当前目录中的目录5 ^2 K& g" V$ B3 Q1 f0 R: x
dir c: /a:-d #显示 C 盘根目录中的文件 T' f9 p% d; m& n1 R0 }4 n. K
dir c: /b/p #/b只显示文件名,/p分页显示$ ]: Z ~- L ~3 n9 L
dir *.exe /s #显示当前目录和子目录里所有的.exe文件
0 y6 |* d6 L7 R% E
) v1 \0 Z' E( k) Y: W ~. p4 cd& z' d) X; B4 z+ D1 I
切换目录
. A, J* G7 a' o E% S( { Acd #进入根目录
: T( ~' o1 L' Y5 Q' Xcd #显示当前目录) f/ a7 d$ P" r
cd /d d:sdk #可以同时更改盘符和目录
" U! R6 e7 ]5 z c( E7 ^8 b4 `: K, y9 m& x. h4 e. W
5 md
) E( _# S1 \) B- }& l/ ]9 q创建目录
/ }; M: A. K0 h/ G/ Emd d:abc #如果 d:a 不存在,将会自动创建中级目录) Y3 m6 w4 n0 l( x( j
#如果命令扩展名被停用,则需要键入 mkdir abc( ?6 ]3 r4 x" Z& a7 F' b7 [
. E! K0 i/ E) c6 rd+ H2 D* m2 E8 D
删除目录5 r% T( | s* ~0 f; `3 y* {4 T7 B, [; t
rd abc #删除当前目录里的 abc 子目录,要求为空目录1 q% O7 e8 y! O. n
rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式* k0 G6 t( H' h2 H3 A( |% a4 f) C1 A
u' t0 {9 d5 @5 J7 del
7 a# ]2 z* ]/ v2 m删除文件* x/ Z3 ~% V$ |9 i$ I. s( Z
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
% S+ L3 t6 s7 \' O* a8 Gdel /q/a/f d:temp*.*6 m3 u7 c/ r* L- ^- ~# }
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录+ _: b1 z' f* L# ]
del /q/a/f/s d:temp*.*4 J6 P* H& t1 h' Z
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录6 A3 u5 t& Q8 W
3 U- E# o; _, ? e& }: h
8 ren
. b0 g& G7 T( x& Z重命名命令' y/ p9 n: C, O
ren d:temp tmp #支持对文件夹的重命名; R. O0 u( ]) d) |+ c
* k: l0 C9 B6 O2 c! j3 c& `! {
9 cls
6 X" Z4 c7 u' S清屏
6 X4 H# ?" a' ]1 U k1 a- ?/ N10 type
?* ^1 D5 F o; Y) p f. s显示文件内容 |8 D9 Z- p1 {% ^$ k3 a
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码' q4 \6 h5 P. _! \5 `0 {' u* K
type *.txt #显示当前目录里所有.txt文件的内容
4 }( f+ N9 ^% Q1 e. S
% `, g8 Y+ _) X) S- y t11 copy
- v$ H! G7 a. _ F4 t) w6 K% z& M拷贝文件6 m* |# Z% Z I' | L. ]& I
copy c:test.txt d:test.bak$ Q+ r' E' Q% n
复制 c:test.txt 文件到 d: ,并重命名为 test.bak+ _2 `$ J1 P+ j4 B
copy con test.txt# `1 p$ a( ^4 l
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件7 E. t: N; d/ q0 h
con代表屏幕,prn代表打印机,nul代表空设备
% X8 v$ ?9 g0 }; J% Ccopy 1.txt + 2.txt 3.txt2 a, Y# C4 c P# w' a
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
X# R5 C' E' L0 h$ s- j5 I' B4 a0 A如果不指定 3.txt ,则保存到 1.txt6 z: P( U( y0 T9 _/ O/ J* w+ O
copy test.txt ++ r6 T3 {$ _3 k6 \/ a
复制文件到自己,实际上是修改了文件日期
* k2 X% z6 F. R) S+ s6 R) }3 U5 ?7 V: O( a
12 title
: T \8 M' e% D) q) p设置cmd窗口的标题
6 }( m* N: [; ~2 t- F7 w0 qtitle 新标题 #可以看到cmd窗口的标题栏变了. Z$ w* {5 m [+ T
: A. o- m1 k6 n; A9 j
13 ver
w) z5 q4 `5 F |" u显示系统版本9 Y/ p$ C" M( t) K/ D9 f
" @; M! k5 y! _+ f0 J9 N
14 label 和 vol* F9 Z b+ t+ [4 @0 t+ q1 y
设置卷标6 {5 d4 o. a8 N7 m) ~4 C
vol #显示卷标* J0 Y) d% B3 K4 E
label #显示卷标,同时提示输入新卷标* c# f9 M% x( I. {0 o4 @
label c:system #设置C盘的卷标为 system
4 [6 U* B3 _ e+ s6 M, K ^, i+ J! X3 K4 W
15 pause
: ]1 i5 n" `% A% |1 T6 B9 b暂停命令
. L' I6 E* y0 G7 V0 Y
; s ?( Y G+ R# g16 rem 和 ::
! ?$ z7 `, L7 s. Q1 q$ \; _' |注释命令
/ n% f% f& @, c4 C1 S% Z1 c0 p# A注释行不执行操作- z, V9 w9 n$ y. E; B- |* J
3 [: Q6 {- A5 |8 F) U/ Z17 date 和 time+ {: t. }! @1 f7 | b5 s5 q2 m
日期和时间
& V' r. n" B! Tdate #显示当前日期,并提示输入新日期,按"回车"略过输入# m6 C1 K( L( U2 N
date/t #只显示当前日期,不提示输入新日期" h# m7 \1 t' c6 q0 b! e+ z
time #显示当前时间,并提示输入新时间,按"回车"略过输入
: x4 W: d) X9 g8 a3 Itime/t #只显示当前时间,不提示输入新时间
% e/ Z- @, U. x/ |( }/ w2 |$ b
( Q. O% V9 K: j A0 n I7 V18 goto 和 :% c2 P' o1 M' z: s4 n
跳转命令7 H" @4 t+ B& g% s
:label #行首为:表示该行是标签行,标签行不执行操作" c8 \& {5 a/ C4 i# E
goto label #跳转到指定的标签那一行0 @. }" d" w9 }. l% W+ I- J
$ H" W$ k2 b& L2 T5 ]
19 find (外部命令)
7 [) u/ F0 W! ^# W9 t* m查找命令
/ ~0 o# S, {& J' p/ d- f5 b: t( R' Bfind "abc" c:test.txt1 ^8 o5 E) q( f& l( Y" k& y
在 c:test.txt 文件里查找含 abc 字符串的行
) H7 i$ g5 l" N如果找不到,将设 errorlevel 返回码为1
6 y2 w4 x' o+ [6 Z( ^+ ifind /i “abc” c:test.txt- c% F. L. ?3 E7 i/ G! T
查找含 abc 的行,忽略大小写
2 y! t; g. N6 lfind /c "abc" c:test.txt( Q$ T7 ?8 E" W( m& P- d9 I. s+ h
显示含 abc 的行的行数
1 @& V" G" K3 G! L4 D
: Y. Q V+ \/ y$ T( k8 {20 more (外部命令)6 U% C8 E. ^, @2 W/ Q
逐屏显示
$ x1 Z. V9 b9 z! omore c:test.txt #逐屏显示 c:test.txt 的文件内容0 A/ A" P( Q: d# ~. j: c! o
; I2 P+ f: R- \7 ~9 Q
21 tree4 Z; ?( m4 Y3 Q+ r( O# N
显示目录结构8 {2 U, ? d: \/ [
tree d: #显示D盘的文件目录结构7 k% X) H" |0 p
# r3 }# B& f% ^22 &+ C$ Y+ R$ v/ I g
顺序执行多条命令,而不管命令是否执行成功
% @3 t5 R+ g% d- j, b9 f2 U$ x# {% e
. M n1 w8 ]2 D6 d a23 &&2 h- w5 n$ f: I% z
顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
0 W$ p8 M) A" J& mfind "ok" c:test.txt && echo 成功
4 ~' v2 \+ E- f( x$ z4 _/ d9 D如果找到了"ok"字样,就显示"成功",找不到就不显示
' B, |# o7 }5 F: y, [4 l# g
) k4 m" d0 X, _" {/ m24 ||' ]$ I$ \7 ^+ C2 O' m) |: e0 S
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令5 H& b" N! X1 R) w
find "ok" c:test.txt || echo 不成功# j- |5 N- J, }; n5 i
如果找不到"ok"字样,就显示"不成功",找到了就不显示$ u6 j0 C# q/ \0 m, Z* N
, f6 ^, A- c& E3 a25 |
: `7 ^; [( @0 b) ~; h# q" G管道命令
' q+ B5 u1 Z) }" T/ ^9 fdir *.* /s/a | find /c ".exe"
8 N! O$ e. x# t) u8 D) M管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令0 ]1 ~1 f8 H7 s* s8 }& Q1 A
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数+ _/ @, T/ Q6 P9 o! k0 y6 P
type c:test.txt|more1 l9 |4 K4 T4 d* ]2 p, n
这个和 more c:test.txt 的效果是一样的# C3 E3 ?/ o* S, t
+ h5 z9 ?% v) k' U" [$ S
26 > 和 >>- t' } a: F! }9 Y
输出重定向命令5 D% z# O6 t: \* g: i2 p" ^5 T/ o
> 清除文件中原有的内容后再写入
* e& @5 h1 A/ {- ?/ P9 o>> 追加内容到文件末尾,而不会清除原有的内容8 w+ p0 t$ }% p
主要将本来显示在屏幕上的内容输出到指定文件中
( O. ?7 t. Z. U( [! t7 n指定文件如果不存在,则自动生成该文件$ y& _' i* |" ]
type c:test.txt >prn
) a9 }3 W* G# J j% P屏幕上不显示文件内容,转向输出到打印机/ m7 d* ~; J4 G5 a1 x3 M4 [) ? |
echo hello world>con
. O7 ^# W) ?4 }' y& y, ^在屏幕上显示hello world,实际上所有输出都是默认 >con 的: l0 z6 @* I5 I0 w$ L1 A
copy c:test.txt f: >nul
$ q( D E/ P$ ?& W拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
2 R! B4 v! n% {. L! Icopy c:test.txt f: >nul 2>nul; H: U3 R" n1 y! D5 O; k
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息6 i1 ^7 x. i& X
echo ^^W ^> ^W>c:test.txt
- s( a( f1 m: A- D- k6 K生成的文件内容为 ^W > W- I4 e% { V' s' U& ~
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号
' f1 S; y5 E% z% t
/ E% n. \9 _, r4 G6 z: b% n0 {- r% e27 <; c3 J4 N( K0 r6 ^
从文件中获得输入信息,而不是从屏幕上
# M {1 R+ A8 h2 y6 ^, H- [7 g一般用于 date time label 等需要等待输入的命令8 k, {2 @. z& ~- t
@echo off
& g3 v( H% R$ Z0 O- C. R; Wecho 2005-05-01>temp.txt
& S: ^4 y. s \- j, cdate <temp.txt# L5 z6 J0 Y" V% k2 ]4 ^! `; @) H
del temp.txt
5 F4 Y* w( o- ]; w. \这样就可以不等待输入直接修改当前日期, p- {& h9 p# u' X' |
7 Z; y5 x# x1 a( ~6 D: L; Q; I
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*2 W7 ~' y: n& W8 F* P0 @
命令行传递给批处理的参数" i% Z- R& @/ X) i" u8 C& \# t
%0 批处理文件本身
, @' B) V6 Z7 p. E%1 第一个参数
4 M; V' P3 a( ^%9 第九个参数
* _5 u: N% l7 ?3 H%* 从第一个参数开始的所有参数# W+ J6 D1 ?0 V' Q
批参数(%n)的替代已被增强。您可以使用以下语法:
/ i9 C0 J% ~9 u5 g7 V% H%~1 - 删除引号(" ), 扩充 %1' O! F& j: c' D) z) @
%~f1 - 将 %1 扩充到一个完全合格的路径名
% S6 L) ?/ p7 Y' j/ z%~d1 - 仅将 %1 扩充到一个驱动器号0 p |, { `7 \, ^( D7 b1 J& e2 K
%~p1 - 仅将 %1 扩充到一个路径: i4 Q; ~. a: X. e+ q
%~n1 - 仅将 %1 扩充到一个文件名
0 x4 H+ r8 X" j* T5 ?, w%~x1 - 仅将 %1 扩充到一个文件扩展名' G: ]. E( @; c' R: s& Z
%~s1 - 扩充的路径指含有短名, j( X$ U1 ?5 @. Y
%~a1 - 将 %1 扩充到文件属性
: d: o& t* k# Z' i' t; F4 N0 [1 q%~t1 - 将 %1 扩充到文件的日期/时间1 ?; `7 @4 x; ~! o
%~z1 - 将 %1 扩充到文件的大小
$ U- C0 z! J" B+ c. I- Y%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
" P, _" o; {( V% Z* P( B& P扩充到找到的第一个完全合格的名称。如果环境: D4 w6 _/ A. f2 P/ D; R
变量名未被定义,或者没有找到文件,此组合键会, r1 M* O {! l( A" H; m6 W5 A d
扩充到空字符串2 {. e5 a3 x# d' y( h
可以组合修定符来取得多重结果:
; U: x" L2 j- Z I0 c%~dp1 - 只将 %1 扩展到驱动器号和路径' B8 s- \+ m( m: g% Y! w' v
%~nx1 - 只将 %1 扩展到文件名和扩展名
" V9 ?2 ?2 f2 |%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
+ A2 e) i" ]: Z0 k. l, U) p. b并扩展到找到的第一个文件的驱动器号和路径。2 O7 q& X$ t6 L* t
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。2 r# v7 S3 B( H( N' F/ r; T% T2 ]
可以参照 call/? 或 for/? 看出每个参数的含意
3 {. V; P% k( X' d( ~% w0 \echo load "%%1" "%%2">c:test.txt
; R. O+ ^0 @2 P5 I! J生成的文件内容为 load "%1" "%2"3 _- I% s8 |$ y% F; [
批处理文件里,用这个格式把命令行参数输出到文件. [; w6 L5 G) q
6 }. S1 J4 u$ W& N3 Z. b* R# ?29 if1 Z8 x* u6 h5 F# \
判断命令
. M, Z7 S8 d- j" bif "%1"=="/a" echo 第一个参数是/a# F8 i% |; ]' _. d
if /i "%1" equ "/a" echo 第一个参数是/a- t% i! b6 X2 Z8 \ `! R4 \4 E# X
/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?4 q8 }" P1 g0 W! A+ V
if exist c:test.bat echo 存在c:test.bat文件+ ~# ^7 G* Y" A; A- z: [+ `
if not exist c:windows (2 Z4 @3 M& W4 K3 b
echo 不存在c:windows文件夹% J" I. n* V) g1 m6 q
)
; s( Y" |4 [7 q G! Q# hif exist c:test.bat (
$ Q5 w$ h- M$ h4 B6 M% q secho 存在c:test.bat
9 F4 w: P$ v( T; D1 X% W8 C( ~) else (
6 _& D- ^, k. E: O. lecho 不存在c:test.bat9 T( E0 @$ S( {" \) K) O/ A+ m
)
s1 N' Q. k% _1 q4 o30 setlocal 和 endlocal
) d* Y6 M# V8 S1 D/ s设置”命令扩展名”和”延缓环境变量扩充”
0 E4 g: D7 G6 v' X" pSETLOCAL ENABLEEXTENSIONS #启用"命令扩展名") `/ p. J6 a' d) N9 p. L! q' _
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
. w2 m0 J6 l0 _6 mSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
+ V2 t9 e8 H: R& D3 oSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
. d2 T- o8 {' \ENDLOCAL #恢复到使用SETLOCAL语句以前的状态# u6 i& L# U0 R' v, b
“命令扩展名”默认为启用. O2 w8 H' x4 n0 a; c, @/ w8 W
“延缓环境变量扩充”默认为停用
( F# r0 k$ h9 S批处理结束系统会自动恢复默认值9 Y2 l# K3 _" H5 C
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
9 |* N6 M& J9 e& z; y* W! [序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确8 M7 u/ {" }5 k; a1 `* |
保程序能在其它系统上正确运行
& \4 i2 u$ j3 \- M7 _"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
) Z! x; D# I- w# B+ b) L2 o u# @! r/ F& H9 q
31 set
# f+ e! E5 O! |% x% T: p' w3 e5 Q; H设置变量
; s: l, L1 Z8 _7 j引用变量可在变量名前后加 % ,即 %变量名% R1 ~. p1 [6 d/ z' R0 Y
set #显示目前所有可用的变量,包括系统变量和自定义的变量. }2 T! l* a) c; p: z
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
`, N6 F# z" n( c' w2 c, {; Oset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
, _9 c0 g O. T$ L' c0 j9 F3 T$ eset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb26 ~, d2 n) q m/ a* `4 s
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
h1 G: `5 v/ h. V: E: {echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
, t4 }' l7 f8 ]6 B" h/ e. Kecho %p:~6,3% #显示第6个字符以后的3个字符,即aa2. }1 z# ~" S% _: O2 |
echo %p:~0,3% #显示前3个字符,即aa16 D# m. |8 C% v
echo %p:~-2% #显示最后面的2个字符,即b2) n0 ^0 G' m# l2 f* G
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
% H: i0 U5 b3 {2 e4 O/ techo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2 H' |( d \# G y4 q
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2# y, t- M/ r' _4 A
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb24 |4 n4 K9 o5 r6 y5 j- {
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
3 H: n# Z# s- Q. d6 sset /a p=39 #设置p为数值型变量,值为39# ~& @6 Q- O! @2 R2 `
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
; R! y! o, c9 t# Nset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用, ?" b6 c0 V3 C0 F+ v( R
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?' V A. E( M$ p7 N
set p= #取消p变量( k3 y- ^7 L9 e& u* u! B6 }
set /p p=请输入7 J; |# i& S( }0 V+ Y) z
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p }; c+ g6 p, F0 L
注意这条可以用来取代 choice 命令+ x* i0 A2 o- w/ W; Y
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
4 d* J) H6 y6 @8 F" e5 F1 F8 O! L@echo off4 y+ u6 I) d* P/ r- ~8 a N8 ]1 ~# ~" d
set p=aaa2 e. w) W! p g% B9 S
if %p%==aaa (+ S( z- b7 K( P8 l
echo %p%
7 [3 T& K( s' ~: S7 Yset p=bbb S; c* F6 Z2 F- v7 @
echo %p%
+ ^% d7 J0 {0 ~( ?/ J# s)- h0 _5 a+ {( k. { D0 t
结果将显示
9 n$ j2 O3 C! E* `$ S8 n4 caaa* I/ W/ _- D8 ^) |
aaa
: g; O+ J# i+ \3 \9 Z因为在读取 if 语句时已经将所有 %p% 替换为aaa6 I6 z: ]2 [% p$ n( [2 P$ N
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
# L: B; c* u* K; z可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!, U) m8 w1 w2 _) _0 U2 W
@echo off" ?! ?( a }9 a; i6 `+ m' b' Y$ U
SETLOCAL ENABLEDELAYEDEXPANSION- i* r/ _. R8 d8 W; v1 y2 x
set p=aaa* n$ D: Q' Y+ H; r% k
if %p%==aaa (. N8 T/ f5 B: j6 u3 v6 C9 D7 W
echo %p%% o$ c0 U& v. ~/ C
set p=bbb
3 D* K4 |) L; @echo !p!
: s/ Z2 U& q0 {6 C1 {)5 ]7 r. b/ T) b+ g: h! a
ENDLOCAL# M) N4 v0 b" E; I1 M; W( Z9 W7 g
结果将显示
2 Q$ e. C& s$ ^) Faaa2 J5 q8 d$ g$ ?* F# t# C% r7 K
bbb: H- E# Y% Q0 r- I6 O
还有几个动态变量,运行 set 看不到
2 B# Z3 r3 f0 @% b% y3 ]%CD% #代表当前目录的字符串
2 y) k& S; m4 g/ H+ @# F3 \) `# f%DATE% #当前日期
4 t2 o; g5 E9 V: {) k7 L; L%TIME% #当前时间
! g( g: ~/ g u; ]/ g7 h%RANDOM% #随机整数,介于0~32767
. A7 z# s" E$ |6 ~$ L! G( H$ ? o" Q%ERRORLEVEL% #当前 ERRORLEVEL 值6 t: z; m# U e8 q1 G# N
%CMDEXTVERSION% #当前命令处理器扩展名版本号
0 P9 m9 L( \) [$ f3 b' n%CMDCMDLINE% #调用命令处理器的原始命令行
, U& {1 d) D. n8 p" H可以用echo命令查看每个变量值,如 echo %time%
( P# A8 G4 x0 {; Y( G4 {% ~) p3 B注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到: X% c+ y0 i( {
$ X4 l+ Z0 \7 V5 h- T0 m
32 start
; m" u0 S# @. p4 u; o. x批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令0 K* q3 ?( O9 E* O4 t0 _
g" z M. P( J& _+ m9 _! d. P7 l5 ], P33 call8 u" e Y1 S t; b. n& L
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行$ @1 A- r' b% x
有时有的应用程序用start调用出错的,也可以call调用0 A$ O6 x/ p, W* M
4 D. [9 c- r# i9 R* h3 z1 f34 choice (外部命令)1 Q! _+ b3 n& n& m* ^
选择命令3 z) n+ j; n" @6 _" t! V9 S# ^
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
1 \& J! {2 c/ c$ ? Ewin98里是choice.com$ U$ B' x, P5 g; X& L$ d
win2000pro里没有,可以从win98里拷过来
* u; {9 O$ [* _2 l6 k0 I" _win2003里是choice.exe9 s: _) U/ K0 g8 Y# M
choice /N /C y /T 5 /D y>nul f) T9 E1 w+ s$ v7 V
延时5秒
* `. N$ j- F; z1 X
. D3 b, R6 H. t& W% X& f d35 assoc 和 ftype
' a* p, h% [2 t6 S3 f文件关联/ g2 n! n- j' V" x( V
assoc 设置'文件扩展名'关联,关联到'文件类型'
' m5 z9 e# c& Kftype 设置'文件类型'关联,关联到'执行程序和参数'2 g/ r4 h7 l. p$ e. w+ M* L
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
/ [0 q; P: G" b1 c- z4 }而是先判断.txt属于 txtfile '文件类型'9 y( U( r8 K9 L9 k4 C! x
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
" B% C: I2 |( y3 i% G( G% E可以在"文件夹选项"→"文件类型"里修改这2种关联
. A5 _3 p( z( m, `' Vassoc #显示所有'文件扩展名'关联0 j. L/ ~. o+ ^
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
2 j C! x# w0 T, Iassoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8 l& ^; ` }$ M5 l6 ^+ f
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile. r1 E2 E; z4 h, n
ftype #显示所有'文件类型'关联
3 ]9 E! i7 q/ B3 u3 q% h' Qftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*6 l |; B9 S1 H9 N. X6 P
assoc .txt=Word.Document.81 V# {1 ~$ h. S4 M# W3 @
设置.txt为word类型的文档,可以看到.txt文件的图标都变了
& k3 ~6 e* ?/ @% b3 L# rassoc .txt=txtfile
. t7 @& \' | D: x0 A1 E恢复.txt的正确关联
# G- v9 Q8 w1 c1 C" a5 E Bftype exefile="%1" %*
0 M3 d7 H a3 g1 ]( w恢复 exefile 的正确关联
# G' T, n2 [6 h4 d* n如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
, M+ I1 H6 z2 z( R$ O6 D1 {4 t
, `( ^0 b; l. ]# M0 l" }4 P36 pushd 和 popd+ d. o; [9 Z. f1 g$ U) _
切换当前目录# j2 F" w5 `1 a
@echo off2 s1 V) y' |! r) y1 a
c: & cd & md mp3 #在 C: 建立 mp3 文件夹1 Z8 ]- X. P, w: F3 W6 n
md d:mp4 #在 D: 建立 mp4 文件夹% i. U7 i; O' k2 }6 H
cd /d d:mp4 #更改当前目录为 d:mp4, x- a0 R3 F4 W3 _/ C h
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
# e# _" d, e, j9 Y1 W; `+ ]7 e1 Q# v- L6 Qpopd #恢复当前目录为刚才保存的 d:mp4/ w5 }2 F; o1 Z; p2 F g8 E
9 N {7 ?) A6 f- ~6 g- D! e
37 for+ F1 d- h8 M P2 V: k) Y
循环命令; |; z( C8 w5 ?7 }) o" P
这个比较复杂,请对照 for/? 来看9 t I4 s/ r. n* b$ u4 |3 L
for %%i in (c: d: e: f do echo %%i
. A; M) r+ x+ F% Z# q+ c依次调用小括号里的每个字符串,执行 do 后面的命令* X+ ^3 j. J8 j1 l
注意%%i,在批处理中 for 语句调用参数用2个%
- M; j8 T% G( n$ f3 @默认的字符串分隔符是"空格键","Tab键","回车键"9 t# S* P$ ? e" Z' H7 | w5 n
for %%i in (*.txt) do find "abc" %%i) w6 l0 q; O0 y
对当前目录里所有的txt文件执行 find 命令
3 h+ _4 F/ N5 k2 D. {" Gfor /r . %%i in (*.txt) do find "abc" %%i& f8 M+ {$ E& ~
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行" c3 Z1 E. o) m# q Y+ y) n# ?
for /r . %%i in (.) do echo %%~pni
# d5 c) O/ \$ _ \显示当前目录名和所有子目录名,包括路径,不包括盘符/ i) N" r( i5 A2 ?
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
( h$ A9 S$ p' @- t% ?7 F把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去( |- |7 R1 w7 S, |
for /l %%i in (2,1,8) do echo %%i
& O, K( u! a0 D5 H; e, }7 Z! r生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
: _1 e5 s1 c2 X# Gfor /f %%i in ('set') do echo %%i- _" p% X _. I
对 set 命令的输出结果循环调用,每行一个6 [% Y+ g2 x" l4 r
for /f "eol=P" %%i in ('set') do echo %%i
7 |* d) U& n& C取 set 命令的输出结果,忽略以 P 开头的那几行5 j( d2 P* {. X, B5 Q( n
for /f %%i in (d:mp3.txt) do echo %%i
( Y+ _+ g W$ U f显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称# s: j. q1 a6 n( ^6 I. a
for /f "delims=" %%i in (d:mp3.txt) do echo %%i
" n4 B+ b3 A, ]8 A2 |# U) e [显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称, n& A. z# A) i( O& Q
for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
' X! d" o" b" b2 B B对 dir 命令的结果,跳过前面5行,余下的每行取第4列
( q9 x; \. X% u$ O1 ~( _! q每列之间的分隔符为默认的"空格": D- ] o, W* Z- m0 E) d; c
可以注意到 dir 命令输出的前5行是没有文件名的
( F4 u% ~: e8 G" Q& c' Y- x+ Zfor /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (3 j/ P% b( B+ j
echo %%a
# K' z8 e, U# ~+ i: Y, M5 Kecho %%b8 g" A4 @5 [9 B! l3 @7 ^7 m% V
echo %%c, E) z1 o {! k
)$ {+ w& M% o4 G& [& M
对 date /t 的输出结果,每行取1、2、3列
9 [! n( Z; ~4 }0 N! v: `$ s) m第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列* z1 O g1 n: j6 B7 u U9 J$ Q
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
( a4 B# n2 I8 E2 E# k- e其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
( l7 L$ a* z# e) u$ ]; q Z `. Pfor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b0 b/ s$ T6 L! g7 E
取第2列给 %%a ,其后的列都给 %%b
8 |' M9 ]2 v$ p# p4 G
) @% {: [3 E- O5 |/ ~9 y38 subst (外部命令). g* D. k' K% s/ x/ a2 o
映射磁盘。
6 k& N; v- F( a5 o! rsubst z: serverd #这样输入z:就可以访问serverd了
3 U& ~2 |+ j; m0 t Xsubst z: /d #取消该映射
2 \' O# V9 D4 ^4 p1 T/ |% D( ?3 Csubst #显示目前所有的映时
+ R$ ]. @' m, M$ p- q6 J. R3 N' F- F+ { s1 x2 i
39 xcopy (外部命令) K4 r9 a- _) ]5 o- n( i' d
文件拷贝5 ~- k% [- V5 E. y) Z8 G
xcopy d:mp3 e:mp3 /s/e/i/y {+ D8 W: F1 E: N( U. y3 ^0 V3 ?
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件) z4 \; K) |' x7 `3 b" l
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问6 ^6 B9 O$ ?# G4 ]1 ~, @% M+ x
& i; {2 j( u+ Q& n常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退4 G8 y1 D7 q7 [9 P1 O2 x
- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:& A6 Q: i( T$ f
( t9 }8 {$ c6 p
@echo off
8 C; ]' T) b7 }; L7 G7 J( I. Gset p=aaa$ ]9 [! d; a! S' ^
if %p%==aaa (3 H4 n! y4 G& I, L
echo %p%
. `. z3 N- g9 D& v4 p" P' i* C7 _set p=bbb# b! x/ E. y* t* M0 [: L# W
echo %p%
3 n5 B% g' \4 I7 r/ G, i, w# B)
: {7 c- i. ?- I2 g+ {pause : c- |/ @) {- o; k$ U
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
|