|
|
发表于 2021-6-25 19:48:12
|
查看: 2244 |
回复: 0
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!
/ J" L M+ w, D, X. E7 j3 j# A% }; } 前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效# ?' m$ s1 Q3 q% ~4 L
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
& X% ]1 V" m6 Z8 s: ? o: B名为bat 目前比较常见 的批处理包含两类: - ~7 D4 R$ [: \* P& u+ F
- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
: ~5 j- x& h" p; `) |1 \* H# R
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的$ w* I$ U% |. \" p1 ?1 u
命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
/ J( p+ G( ~& E, I 怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出: Z$ ~2 c# I. J* y8 c; @
批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set! |# Z8 F2 y% ]% Q! h
批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||
( t& q: m, I0 k- @0 K3 i3 y 常用DOS命令- 文件夹管理:
, K: l W9 {, ]8 _/ o- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。
2 m9 i3 q4 p5 m" x/ Q0 a' [$ e
- 文件管理:
' q6 L8 ]5 |$ k" h+ K8 C# f- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同* c& n$ d9 Y' D9 y; B- x
- 网络命令:
! E! S& `8 @0 I) w* ^$ n- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表
! S6 k$ b/ P3 ~3 M
- 系统管理:
" {. h! ~+ Y8 X$ S- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置1 I( s" c( J6 D6 _; x
& t; K" [& L9 r
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
7 t' K7 q* p4 P% d6 h8 N" m9 D0 t- V; |0 O2 c
Windows Batch 常用命令
* F( b1 e- V' V8 _; F1 echo 和 @
- e5 t1 ^& E$ X9 G0 L回显命令
; N v% y; r$ L) B! r/ ], I@ #关闭单行回显9 a& m" W4 g6 |. V" ?5 N
echo off #从下一行开始关闭回显( N* l# k- R) c' f1 F
@echo off #从本行开始关闭回显。一般批处理第一行都是这个! ^: ?, t% q, R6 D% @
echo on #从下一行开始打开回显. O/ f! {5 r/ T G
echo #显示当前是 echo off 状态还是 echo on 状态
4 @8 ]: T; V/ P& S+ m& Recho. #输出一个”回车换行”,空白行
% S: s* Y1 H- z$ n! o9 M9 U! L- V#(同echo, echo; echo+ echo[ echo] echo/ echo)
/ |! x9 }6 h3 M w( u {4 T
7 `0 W" B1 E- ^0 S2 R6 n2 errorlevel
! K6 N d! R/ pecho %errorlevel%- ]1 m: C$ j9 \/ p2 y; }
每个命令运行结束,可以用这个命令行格式查看返回码
5 @3 _* ^: ?( }( m6 U" V8 e( r8 ~默认值为0,一般命令执行出错会设 errorlevel 为13 e, L- J3 m' y7 Z4 q8 k
" t! Z1 T( A5 A/ q1 N, s3 dir
+ A" A. h; g0 \+ ~( X5 X- e- n. Y显示文件夹内容
, S$ x" K: x6 G5 M6 L; }/ @dir #显示当前目录中的文件和子目录
5 E( `6 Q+ k% y( I) I1 ]dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件" ?& ^/ m2 w4 O5 d! m
dir c: /a:d #显示 C 盘当前目录中的目录: N9 M. e. j. z% }: U2 |0 Z
dir c: /a:-d #显示 C 盘根目录中的文件% j) M5 ?3 e" G* _% E) ^
dir c: /b/p #/b只显示文件名,/p分页显示2 T) b& \6 L& y; R
dir *.exe /s #显示当前目录和子目录里所有的.exe文件
0 C! w/ [5 J _1 P0 D
, b" k4 h# z4 A/ i, H! y9 m ^4 cd0 X/ o9 h6 K( S/ R
切换目录 H& y0 t' }1 q& S; ?4 w4 s
cd #进入根目录; L' v0 T( k+ j: A0 L6 o; G
cd #显示当前目录 m( p. \* H& N! [
cd /d d:sdk #可以同时更改盘符和目录$ a0 q7 y/ q5 s4 y9 A; ~
! @; f2 ~4 n9 r( k
5 md
% p3 ~8 k- E2 G) }6 e创建目录
7 w( Y/ _( w* F! N" C3 f- Omd d:abc #如果 d:a 不存在,将会自动创建中级目录: j* P2 b& D+ Y/ i( W
#如果命令扩展名被停用,则需要键入 mkdir abc
4 c/ y* z* D' }& F6 y# t- r6 z' o n$ g3 W# K, H+ }
6 rd
3 E l$ p$ t$ C( D删除目录
0 T* U( |. E4 U; `0 c! e8 Srd abc #删除当前目录里的 abc 子目录,要求为空目录
* b# g$ @2 D- ]; R7 Mrd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式
1 \: k! W. ?- v' {
, S' W8 M! S6 n; I7 {1 Y2 W7 del
9 G" a- S1 x. ^. G J删除文件
9 S+ T7 S8 R" Q2 D/ I5 |3 Wdel d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
. V& i f$ w& S; I' Idel /q/a/f d:temp*.*" ?! I0 Z$ E, ]8 P# C/ ~4 J
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录: r9 C1 q( w, b# h1 @% |
del /q/a/f/s d:temp*.*2 Y5 B0 t# T9 C# |# o" h
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录1 q7 {& v$ s% g$ K0 ~9 f
4 V# T+ }" v; n. i7 `
8 ren
0 r B1 Q; L4 H" l; R0 i重命名命令; _' _* c) X- g/ x& h9 L5 n% {
ren d:temp tmp #支持对文件夹的重命名: \1 ]: _$ h6 C* ^" b
1 L$ R5 {2 K) _: n# H* x# }" j9 cls# Y1 V& c8 F( `3 G
清屏$ I' G% x7 @% J
10 type3 p: I$ {, O/ T+ ^7 K: } P
显示文件内容8 u! u2 ]! N& R! `3 m5 Q
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
: O" ?+ A9 m& Etype *.txt #显示当前目录里所有.txt文件的内容
' ] c$ i! O& U5 H2 L/ x2 d1 ^0 R; f" b' T
11 copy
7 G! u" |& i+ b2 E拷贝文件
3 @* V; H! q3 P5 M0 s9 u* u0 B. |copy c:test.txt d:test.bak$ X$ I- k- \4 k, M" P2 h/ j
复制 c:test.txt 文件到 d: ,并重命名为 test.bak% R1 A( X' A! l% Z5 ?# I' e
copy con test.txt
; o, h' O: }5 }6 {5 D2 _从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
, Z; N! a9 q( e" U( ?1 H: wcon代表屏幕,prn代表打印机,nul代表空设备
1 O0 d M" C; J& w; B1 o a _. F: lcopy 1.txt + 2.txt 3.txt
* H" d0 e m' ~% R+ ~合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
3 u b0 t. C# M# N# X+ q如果不指定 3.txt ,则保存到 1.txt7 P; p3 F5 Q5 O6 ?: Z2 A7 d
copy test.txt +
7 J2 l0 L7 W$ e4 k2 j; h. _+ {复制文件到自己,实际上是修改了文件日期* D' g9 _" p& d) ]$ e$ y6 t0 ^
+ h; W8 A( a2 @; F12 title
% T4 k6 {" U: z3 H设置cmd窗口的标题
, U9 D0 X8 _- d7 i4 ]& t+ Atitle 新标题 #可以看到cmd窗口的标题栏变了0 `! W* x0 i- Y5 m2 o: T/ A! w& p) U
- x& X# {) e4 F. ^( Q& m3 w
13 ver
5 D% ~6 i" M/ G* z6 A& n显示系统版本/ H |8 d3 a6 g! h
3 C8 Q, a- G4 U* Q$ X$ K" O' G14 label 和 vol
1 v* B" r1 y+ j* C4 W' Z设置卷标
) C" z. G/ l I$ i6 U$ C. G8 U7 h- Jvol #显示卷标4 c/ @7 c, @$ Z5 Z
label #显示卷标,同时提示输入新卷标
0 t: @, n, G' @4 |" slabel c:system #设置C盘的卷标为 system
% r: t% `: T( e/ W4 V1 y
& d5 N1 V. V2 w9 u2 l' W0 h, a15 pause
/ c0 Y5 ^; i2 Z9 [: @暂停命令
+ V* t6 q' l4 C9 E+ { t5 @: |8 u. a5 c/ f( L. @
16 rem 和 ::. ^' s* r4 v2 `3 s# S; }; A/ v# Q$ ]
注释命令
2 [( i: g: t4 E T" \- G注释行不执行操作3 r- E( s0 V+ e6 J% f, C8 _! {" ~/ q
- O4 I% M; W8 F1 A O; T
17 date 和 time
3 s N% L; [, X日期和时间6 G# ]6 y/ i/ p6 W) R4 V! n. T* ~( S8 R
date #显示当前日期,并提示输入新日期,按"回车"略过输入
- ^' i" `9 m1 Xdate/t #只显示当前日期,不提示输入新日期6 {5 u s4 N: b; S" T6 _
time #显示当前时间,并提示输入新时间,按"回车"略过输入3 k4 v# x$ I4 a- C( X( |
time/t #只显示当前时间,不提示输入新时间
) k" N3 a- k$ [
+ L. H. g9 ~, T18 goto 和 :! k1 s" J" E7 ?
跳转命令
* a6 ^" E" l3 r8 m:label #行首为:表示该行是标签行,标签行不执行操作; _/ N7 n6 G/ }$ a" r+ B
goto label #跳转到指定的标签那一行
, D4 o8 F" K8 } ~" G: n" E0 R! U1 K" z7 h7 V
19 find (外部命令)
, D0 p. `* U9 I; h5 o7 U6 [) V查找命令
; Y- f5 D g! O/ Z! m/ pfind "abc" c:test.txt, ]+ F& B. M& D. ?$ A$ C7 D
在 c:test.txt 文件里查找含 abc 字符串的行- W, H2 v; L5 W6 i
如果找不到,将设 errorlevel 返回码为1
( z' U t2 X( x% S+ Xfind /i “abc” c:test.txt
6 \7 e$ R% ]& D查找含 abc 的行,忽略大小写# d7 T- U# Y% Q* z2 ~
find /c "abc" c:test.txt1 G8 |; G* d. p" U- C8 t: ?& U
显示含 abc 的行的行数2 b' l, p, q R; P7 i) U+ H* F& e
1 l, l8 E% l f% P7 v7 ^0 P, P20 more (外部命令)
& g4 U( M+ i* a, a7 h n; |! I逐屏显示
4 ^( S, y0 h, ]7 r9 ~more c:test.txt #逐屏显示 c:test.txt 的文件内容
# ?) H' O4 ?4 h a" L3 c3 ] c2 u7 H
7 H+ h/ }/ Q) G! g21 tree$ C/ g$ G# b3 V* b
显示目录结构
! C4 e! i/ u! r4 l( w, o$ H& btree d: #显示D盘的文件目录结构3 Q3 I3 `, ]4 u L
, ^( Y8 g, O k5 D9 z& I9 @/ e+ c: R) z
22 &! v1 R3 K8 n& F) Q+ ~5 P
顺序执行多条命令,而不管命令是否执行成功
/ ^: x4 W1 ?) c2 Y9 g; W- C S! j9 t! F6 `* ^
23 &&
; {; r) b3 M8 i& k% V$ H U顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
% ^8 |9 r3 I) w; A. ?7 I# Z$ s3 C8 sfind "ok" c:test.txt && echo 成功/ K3 [1 \/ b2 j
如果找到了"ok"字样,就显示"成功",找不到就不显示
- ^7 P" O7 b ^* t) K1 i
% K5 a7 S: E" K$ ]" T$ y24 ||
5 ^" _0 w7 X0 ^, e& h# F$ G顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
) S% f, X8 u' W0 G6 Wfind "ok" c:test.txt || echo 不成功
7 _. H5 ~( G$ e5 n& h9 ~, z3 o. M如果找不到"ok"字样,就显示"不成功",找到了就不显示# x6 b7 I C/ F T/ Q3 ^* f+ J
5 }' m g& o; n! M5 y9 X, |8 w25 |
1 C. n4 N( ]) ~- \( X管道命令1 P2 u9 M* J, k3 ?; ?2 [2 H
dir *.* /s/a | find /c ".exe". K1 s( p K! S1 \
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令; P) J7 Y+ @% p* \+ S& |& N
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数+ G! b. y/ J- { V
type c:test.txt|more9 m# F, z1 O! V) O Z
这个和 more c:test.txt 的效果是一样的
: U; G# ~9 y4 I# I# X3 n
2 Q: k8 o g) a( m8 S26 > 和 >>* ^! p1 ?6 f7 {6 u l# t% M
输出重定向命令8 x; N( W. k$ Q; D5 W" S
> 清除文件中原有的内容后再写入
, I5 ]: l/ d) A/ o>> 追加内容到文件末尾,而不会清除原有的内容8 B2 g9 e/ B {
主要将本来显示在屏幕上的内容输出到指定文件中
J7 f' q& ?4 e指定文件如果不存在,则自动生成该文件
C; T. s- s) P" b. Dtype c:test.txt >prn2 B" |5 T) F. Z% E% q
屏幕上不显示文件内容,转向输出到打印机
3 [5 F6 O# ]* ]9 c+ F8 zecho hello world>con
- E! u; B8 R# x5 J6 @在屏幕上显示hello world,实际上所有输出都是默认 >con 的0 L* a( @ F7 T+ G7 _
copy c:test.txt f: >nul
3 b4 r4 y' k; I1 R H0 x拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
' `% H9 f. x( y$ R; Pcopy c:test.txt f: >nul 2>nul% N) q6 }. d( R/ R9 ^0 P |9 a
不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
& G1 `8 s2 i. Xecho ^^W ^> ^W>c:test.txt A6 ]' v7 S' z/ q( I" X( X
生成的文件内容为 ^W > W
- C* K- i5 g( d$ A# V$ X+ {^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号9 @! i* a6 a- J9 X# m8 X) z
+ p1 {- V5 @( Y8 m# J4 B27 <
# b M9 X. |/ t# E8 [从文件中获得输入信息,而不是从屏幕上; M e' G% @# i6 g5 D, i' W
一般用于 date time label 等需要等待输入的命令
; u2 ~) k. J6 x. L4 ]. D@echo off
" w# S7 ]7 W: x+ hecho 2005-05-01>temp.txt
& {) s3 g, E* D! @8 ~: N% qdate <temp.txt, c- l2 o5 A8 ^, a1 D: c
del temp.txt
! \( [ K: T1 B0 `这样就可以不等待输入直接修改当前日期
- B- Q- M* v( n1 L+ }! P" q2 H+ V8 m) {% n$ g
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*
8 f. j) \9 v$ ^5 z) V命令行传递给批处理的参数: x. P3 j- ~2 P, e# Y% w
%0 批处理文件本身9 y4 u1 o+ z: `% o! r0 Z2 D# r
%1 第一个参数
, V. m0 ^/ Q1 P%9 第九个参数
) \. ]# x5 ~, u& _%* 从第一个参数开始的所有参数& M g( [4 d0 u- ~ N; K, y0 v
批参数(%n)的替代已被增强。您可以使用以下语法:
* m- k. ]; v1 D0 F%~1 - 删除引号(" ), 扩充 %15 z+ ~$ M# y/ F' B
%~f1 - 将 %1 扩充到一个完全合格的路径名
! [6 J2 c2 g# ~/ u1 K4 H" ~! n%~d1 - 仅将 %1 扩充到一个驱动器号
* t: X* l# g$ ~$ A% S%~p1 - 仅将 %1 扩充到一个路径' G- B6 f) u( z3 O
%~n1 - 仅将 %1 扩充到一个文件名$ c, _# t6 M9 z5 E2 E
%~x1 - 仅将 %1 扩充到一个文件扩展名* E7 n* z, t3 n8 |3 e6 D7 H
%~s1 - 扩充的路径指含有短名( g ~1 m# g) Q7 P
%~a1 - 将 %1 扩充到文件属性& e2 {7 \# P7 C7 X ^' @: n' K
%~t1 - 将 %1 扩充到文件的日期/时间
) ^9 ^/ A2 v! M" s B4 C' k4 j%~z1 - 将 %1 扩充到文件的大小
6 ]2 @1 [7 l# V* ^9 k6 z* H%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1, d K' K! ^2 K) g! V- y. |; B
扩充到找到的第一个完全合格的名称。如果环境
% O1 ?; H# B8 F8 W, g: r变量名未被定义,或者没有找到文件,此组合键会
# g; k: ^) m$ i: G) y4 \4 A扩充到空字符串; t: p0 w, A5 y' m5 t+ t
可以组合修定符来取得多重结果:
7 B# e/ \7 i: I0 R M%~dp1 - 只将 %1 扩展到驱动器号和路径
% t8 A" I9 b% @7 `: `* f%~nx1 - 只将 %1 扩展到文件名和扩展名
0 O ?; @+ U( O%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
* y5 \) T6 t8 m' H: ?( _ b并扩展到找到的第一个文件的驱动器号和路径。! }9 [6 [ Q) j$ j. y0 u" |
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。, E2 \$ X# \8 t6 }( @* d8 Y
可以参照 call/? 或 for/? 看出每个参数的含意
2 d2 e# p7 l" ]8 \echo load "%%1" "%%2">c:test.txt
: A+ g0 j+ [! T( e( u3 t8 F8 [生成的文件内容为 load "%1" "%2"
) G. W; w1 I1 R批处理文件里,用这个格式把命令行参数输出到文件0 j3 ^( W" q6 R& g5 Q( o5 f
8 C1 \! Q" O, r. u- O. A
29 if3 n/ f6 r- |1 O7 n5 ?7 R& f- _
判断命令' h \0 L1 O0 ]
if "%1"=="/a" echo 第一个参数是/a3 I/ ~8 h K5 E3 x9 I3 W
if /i "%1" equ "/a" echo 第一个参数是/a
! T5 x6 A0 ~, I4 ?* p/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
; Q2 [& V" G+ D7 uif exist c:test.bat echo 存在c:test.bat文件
+ U1 i3 ]1 a, xif not exist c:windows (' x1 X1 y4 ?1 I7 h' p( {: {. b0 v
echo 不存在c:windows文件夹
: x/ |+ I, f( A6 })
1 V0 o1 g1 D$ Q2 Kif exist c:test.bat (+ x G% q3 i+ P# v7 v) B
echo 存在c:test.bat! a& o- z! T. J
) else (- Y5 v4 f' Y; n* n9 T7 O9 ?
echo 不存在c:test.bat+ r3 Z* F% |* \) Q" Y+ s. H2 g
)
9 O' J& Z s- [" U7 m" M30 setlocal 和 endlocal* c. J+ ?0 r/ u' e
设置”命令扩展名”和”延缓环境变量扩充”- x* ?- p" u% M9 p7 b! A
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
0 Z7 V& c# y$ T8 ]9 sSETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"+ A+ g! v+ Q, M4 r( _+ } g# b
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
6 K$ [& T* q- l* U& f7 C, ?& zSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
F- Z4 f6 R0 T6 P0 {* g- j' OENDLOCAL #恢复到使用SETLOCAL语句以前的状态
7 K& d0 R% e M! v+ _“命令扩展名”默认为启用
/ C* M* Q, k1 \0 O: C& J5 u“延缓环境变量扩充”默认为停用
! h. B* G8 V. ~/ a, e2 h* j批处理结束系统会自动恢复默认值2 X% M B; T. w
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程( g2 k4 s# {9 h6 Q* I
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
3 U7 O. ?" u* Z% n9 n保程序能在其它系统上正确运行
( P2 f) H% ]5 ~ q# P7 v"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程) P; l+ S8 Y- H$ g4 ?
; N/ E" h" c0 s6 V) U! y31 set9 f! G7 M' I6 ]4 M+ c2 k- H
设置变量
! Y/ Z# M0 s C3 K引用变量可在变量名前后加 % ,即 %变量名%
' | d9 H, y9 I! w9 wset #显示目前所有可用的变量,包括系统变量和自定义的变量/ V7 F3 K+ b* j
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
3 l, i) c" ~1 J8 a' U1 D% C. B0 l5 \set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
" x3 F* f3 k& D1 ^$ |) ~set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
4 f& p; B# J R! N' |5 Recho %p% #显示变量p代表的字符串,即aa1bb1aa2bb2( e1 N& g. L# k, t( v. I' m
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
( B2 R! H8 p! f8 r I& Oecho %p:~6,3% #显示第6个字符以后的3个字符,即aa2$ p; x+ l5 r: D5 ]% K x6 S6 [
echo %p:~0,3% #显示前3个字符,即aa1
$ r" Z4 b, [9 ]2 |4 [8 Aecho %p:~-2% #显示最后面的2个字符,即b24 l8 d/ z4 V" y
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
/ t* Q" ^! [! Techo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
. l0 I3 }$ X7 _echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
) b, M* U0 F( R- t3 d5 k6 ^' G* F& Fecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2, m" L' U9 c/ A/ ~2 v; x4 R7 K
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
' H( W; J0 _; mset /a p=39 #设置p为数值型变量,值为39
8 c) {) N, F8 n/ u+ U5 Qset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
$ d5 k+ X! }2 f1 K- l( Oset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
, Y5 j) `5 }. J4 ]set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?+ n. Y7 K5 c& g2 i& J q
set p= #取消p变量
5 y f j! }# t6 N% Tset /p p=请输入
4 ]1 s& \0 ]+ c屏幕上显示”请输入”,并会将输入的字符串赋值给变量p
H" M; ]7 K7 c% ^4 ^5 Y' C O注意这条可以用来取代 choice 命令
+ y3 s; k4 j5 [注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
8 \0 }( q8 E" a8 q, F/ b9 x@echo off5 t( x6 R. o0 K7 y1 w
set p=aaa
& [9 j ]) ~: b6 X- ^ u, T5 o6 Vif %p%==aaa (
: A5 K: A8 I3 O& g* k7 p& D+ V; c& K3 ?echo %p%
- v5 Q" p9 V& z5 Kset p=bbb7 {" P9 u* W& m& ]2 C
echo %p%+ s% B! _9 o# G D7 D
), I/ f# }2 y: t, ^4 J; H
结果将显示( M* ?# ~+ f/ _4 Y2 n
aaa
. h1 K+ U/ {' b0 N+ p. n1 taaa. d# ^$ w% q9 p" ^- d w
因为在读取 if 语句时已经将所有 %p% 替换为aaa
& C; n: l1 }7 x6 v9 k/ ?- |这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
3 Y7 _5 w; ^5 R; I4 N s可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!0 l+ l5 Z) |- T, T4 `+ s6 Q0 ?
@echo off9 I ] E! H) b5 r$ S; K
SETLOCAL ENABLEDELAYEDEXPANSION
: {' p0 U+ z( z, ?+ `set p=aaa' k* H5 m, v1 N- C9 S; {5 C9 V
if %p%==aaa (/ x* H& [+ ~% n, ~3 i c; M- k0 t: \
echo %p%
9 i) D) b8 e2 q& J' N. Cset p=bbb. C! [6 N; i, K. M1 c
echo !p!3 {! O: a) U6 S0 z* Q
)
' R& h2 n B6 M3 A& N2 dENDLOCAL
8 U# Y: @+ b' ~8 Y* g# `( p$ i& ~结果将显示
& P8 X8 t# S! eaaa+ I- h, d7 {+ _9 K. ~
bbb
+ r! B q+ c5 q3 Q+ d: }3 N8 J还有几个动态变量,运行 set 看不到3 P1 E# V$ r5 T, e, |& z& m3 [
%CD% #代表当前目录的字符串 X4 I" t6 n7 b* ^0 a$ y
%DATE% #当前日期
2 \, c5 g4 S+ @%TIME% #当前时间 {/ o6 r6 G- T$ ~# Z. G8 _ ^1 X/ @
%RANDOM% #随机整数,介于0~32767
: U9 N' g8 ?5 p%ERRORLEVEL% #当前 ERRORLEVEL 值$ u S! h( x5 \+ I" G3 x9 k& ~, X
%CMDEXTVERSION% #当前命令处理器扩展名版本号
8 U, w4 @8 v P0 W& q%CMDCMDLINE% #调用命令处理器的原始命令行/ j, V# H) Y" ~: u! E
可以用echo命令查看每个变量值,如 echo %time%
1 g2 A" [3 k4 C3 @% E' S2 U注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到' V, u0 u. w4 f" w4 M9 D
6 o7 i# U. ^$ K1 u0 P) Y0 }% e/ r32 start
3 ~. y* e* o" V- ]4 e& I批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
2 m! t9 P+ J8 _" A6 B0 |
+ L6 V: U0 {6 k7 ?. m33 call1 b9 c5 C0 K* B! S, d
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
9 k% ^2 |6 C# F5 N有时有的应用程序用start调用出错的,也可以call调用
+ ]0 {5 D/ ?. G% i O% [5 s' t3 v! c o, h4 C
34 choice (外部命令)
) X5 G% J* m" N* k7 M选择命令" z' f9 ~- Q" j2 J3 r, z* _% w
让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
9 ~! F6 T, p6 {1 J' v8 ^win98里是choice.com
2 Z1 B. ^: y+ V% Q3 }1 @7 F& ^win2000pro里没有,可以从win98里拷过来6 A' B. F; j. o6 _6 C
win2003里是choice.exe. O/ J9 p, B; q8 v4 y
choice /N /C y /T 5 /D y>nul p' |2 l+ _+ J
延时5秒
) Q6 W, Z) ]# Q3 U# T
% I: W2 r" C& t" l35 assoc 和 ftype; X$ ?# c& ~0 U; \$ Y, K9 x4 j6 S
文件关联
2 i/ A0 S$ x0 \. `3 Passoc 设置'文件扩展名'关联,关联到'文件类型', X2 W/ D6 d- Z% I$ |$ U- K2 e9 i
ftype 设置'文件类型'关联,关联到'执行程序和参数'
5 D' R1 b8 l: R" f; F当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
2 I0 F/ h) D, V) T6 Q7 I而是先判断.txt属于 txtfile '文件类型'& r+ f" G# z y0 X# c2 X' z5 O" [
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %10 l S4 \$ O0 F& Y; O4 N" i
可以在"文件夹选项"→"文件类型"里修改这2种关联
~" x# B8 G+ S2 b, i, U6 aassoc #显示所有'文件扩展名'关联6 {# d1 M! L! C1 @
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile+ J N" }6 r5 ]) a8 y& {- r j
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8$ c+ z7 q' d6 K1 j* j
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile: |% a! H- w1 A
ftype #显示所有'文件类型'关联; d2 f* ~- y# j T4 O3 h, D7 j
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*; g. @1 N, N9 v) d
assoc .txt=Word.Document.8
1 x7 S$ i4 l% v0 H1 Z/ x) G( B# I设置.txt为word类型的文档,可以看到.txt文件的图标都变了: ^2 H/ T% E. S% o; q
assoc .txt=txtfile
; O! L" ?* c8 }; N; p恢复.txt的正确关联% L" p, W1 T% u% e! h3 k/ N
ftype exefile="%1" %*' |! d2 h% @2 y2 L- {: o% U
恢复 exefile 的正确关联0 ?- ]& I2 g' ?
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令: U1 `' |2 f8 C. _1 j2 f9 K6 m+ E
3 @6 Q& ]/ q2 W5 X" G( M36 pushd 和 popd2 ^. |* {' Z0 @( C8 Z# n
切换当前目录3 T( y% |% v3 I3 N+ Y9 z1 Z" M L
@echo off1 O# c; b: r ]3 k- y Z% u
c: & cd & md mp3 #在 C: 建立 mp3 文件夹
. u9 m1 Q( y2 a9 C7 I3 L: S7 }md d:mp4 #在 D: 建立 mp4 文件夹& `6 K& ^6 t* h/ O; O$ `! _- m# \
cd /d d:mp4 #更改当前目录为 d:mp4
' e ^: O4 P9 \( A' b6 A+ g$ \4 Jpushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
4 Z8 P8 r, u+ B. D3 Bpopd #恢复当前目录为刚才保存的 d:mp46 Z: {& x# x+ b, v
5 f& w! N8 `+ p: [1 A37 for% p$ _/ z% c/ w9 P
循环命令0 h+ G# l/ E3 e1 ]. Y
这个比较复杂,请对照 for/? 来看) ^8 {8 K$ Q$ ~6 Y4 P
for %%i in (c: d: e: f do echo %%i
) O- R- g! L) A* Y8 p3 O+ C依次调用小括号里的每个字符串,执行 do 后面的命令
9 x. q! v, ~& Q. {! D# g注意%%i,在批处理中 for 语句调用参数用2个%; i* T) _8 M- f
默认的字符串分隔符是"空格键","Tab键","回车键"3 Y/ g( P1 }9 c$ O2 l$ S
for %%i in (*.txt) do find "abc" %%i0 q+ ]& T: z1 B. T% P
对当前目录里所有的txt文件执行 find 命令
0 U) S, ?* g* l( h7 D4 Y, }for /r . %%i in (*.txt) do find "abc" %%i4 P' y( M2 W& u+ Q6 S
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行, P) y% P0 t+ e) p; s" U+ y2 p8 X4 ?
for /r . %%i in (.) do echo %%~pni- i5 i/ ]: h r% z0 k
显示当前目录名和所有子目录名,包括路径,不包括盘符
* ?2 H: ]' l" Ifor /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt& P% d' U8 a( w. i
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去) r5 t, ^$ ^. h( z2 V
for /l %%i in (2,1,8) do echo %%i8 `( X( I& ?( I' J
生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加16 \ p- y( S' \+ H) [- p$ O
for /f %%i in ('set') do echo %%i
/ g: G; a2 V7 z+ k- ]7 g, @: L对 set 命令的输出结果循环调用,每行一个4 {* l* R6 X. z! _. J' r5 d7 B
for /f "eol=P" %%i in ('set') do echo %%i
, ]; g d" Z8 L) L: `, \0 a取 set 命令的输出结果,忽略以 P 开头的那几行 V9 [1 e" f* i; N5 F6 K) h
for /f %%i in (d:mp3.txt) do echo %%i% N( D- R4 e* A T6 a
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称
8 b' Q7 l6 B5 v+ q0 Tfor /f "delims=" %%i in (d:mp3.txt) do echo %%i
9 @9 O2 `1 v8 ? y显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
! [+ d% S& c0 }for /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
; u' w1 ]2 _* |; h; L0 _对 dir 命令的结果,跳过前面5行,余下的每行取第4列1 E k" I$ i; f2 l. y* v- h
每列之间的分隔符为默认的"空格"
# \# u) e0 Z- q1 M/ X3 i. w9 O可以注意到 dir 命令输出的前5行是没有文件名的2 y" H% v/ c) I% b4 C
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (5 K* r/ G: ], Z9 y, D" c7 P4 \2 E
echo %%a7 C6 G5 u( `: [' R( a
echo %%b! o" `! d0 p4 E7 J: T) o, v
echo %%c3 K [! B: A8 `! j
)8 g* n# ?- a7 l0 J+ z7 A0 ?" J
对 date /t 的输出结果,每行取1、2、3列
2 K4 W! | ^% K( p. o, G: ^第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列* X6 I1 H, _" F% H$ U; v
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"' S) i2 G }8 j' V1 m% h- `
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的9 W7 f( ^5 e0 d, y) b' I
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
! a0 K1 S/ I9 Z3 o取第2列给 %%a ,其后的列都给 %%b
! i7 p. W8 p, t/ D: U$ A3 X" B; l9 o j9 Q8 c' B$ w8 K6 f G
38 subst (外部命令)
% \# X7 R9 e7 t! L3 E5 m; k映射磁盘。# |6 l7 G1 M9 M5 @4 H3 L: T" @$ i, x
subst z: serverd #这样输入z:就可以访问serverd了
: v9 m% d# d" i( j5 Ksubst z: /d #取消该映射
/ P0 P( |& S3 Qsubst #显示目前所有的映时
7 T4 f1 a3 [9 U; T0 ~6 t9 N! @4 n! ^& U6 T) A
39 xcopy (外部命令)6 G2 t- L. m, @) r& i2 U T! S/ s
文件拷贝
+ i7 n( S. J: fxcopy d:mp3 e:mp3 /s/e/i/y
& w' |% I5 o! l$ ~5 M复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件# o; l. z- f+ H' P4 Q5 P5 m
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问) Z1 C0 V. u9 y7 g3 n
8 j0 g+ x( Q3 i& S/ l4 H* z常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退+ M& Y: G1 T# @8 {5 n4 {7 b
- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:
& K* l9 s! `0 J3 h- U9 U8 @ 7 e- R% n8 \7 F
@echo off" C. \* K' B5 Z
set p=aaa
. B; w9 e2 l' f5 @& i) wif %p%==aaa (0 i3 O) ~2 l& a4 R
echo %p%
0 F: w( h4 b( kset p=bbb& W3 [; G5 x1 v/ J
echo %p%
- v3 U! A9 W `6 l" l# ]- j2 g)
1 n4 z* h" W" N' o6 x2 j0 qpause + {' k; O+ B" j7 n9 P' Z
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
|