|
|
发表于 2021-6-25 19:48:12
|
查看: 2411 |
回复: 0
|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!( g& d1 C1 p& z1 K) Z% R
前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效( {, r" D- _, ~4 H3 N, H# Y& w
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展% ?& h8 R/ t8 g/ Z2 Z3 |: A) i
名为bat 目前比较常见 的批处理包含两类:
& [6 A" k8 |) @. m- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
% U2 E/ y+ Y, ?. R% q
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的# e: m0 h$ N+ m- n2 a
命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
C6 Q: x7 e6 B: S8 U 怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出% `- k8 t# u% _: l$ n" T
批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set
' C% X M/ b. w$ p: h: I 批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||
+ E/ a- H. O; Z7 z& K9 L 常用DOS命令- 文件夹管理:# z$ n; s6 P2 E& I; ]; z
- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。$ U- k1 L. b0 H* }
- 文件管理:
( W4 H6 ~$ B* T& F! Y8 ]5 c* ?$ `- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同
8 \! p" D% ? j7 Q/ W0 c* O9 b
- 网络命令:
4 Q k/ l" F% ~" j1 o1 I- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表
8 N; w3 A$ p u
- 系统管理:- Y6 u1 ^0 R) ~; Q2 {) F
- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置
! `5 M7 ^ s2 I. N ' g- S% Z1 [; y
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
# O% [) ]' h: o6 [ U
# L7 G0 I; r% ], g% z% J% wWindows Batch 常用命令3 y# H4 s. P$ e6 Y: @( q
1 echo 和 @( u9 Z; W- ]2 V0 F0 z; D+ n
回显命令. H- A, c' b8 N* v8 j5 r
@ #关闭单行回显& |8 S$ F ?+ o7 q/ L0 e
echo off #从下一行开始关闭回显! q0 u# M# R: u2 w
@echo off #从本行开始关闭回显。一般批处理第一行都是这个
1 o/ r, B! @: X$ X! F* oecho on #从下一行开始打开回显
; ?; P" L. l+ O3 z# secho #显示当前是 echo off 状态还是 echo on 状态
% E$ ]. Y0 x$ O. i& R S: n* W7 Zecho. #输出一个”回车换行”,空白行* o7 R" z) a4 F1 p- A
#(同echo, echo; echo+ echo[ echo] echo/ echo)8 r" u) X m+ w( d( I- x
* m' r# _; @. S/ \
2 errorlevel/ Z1 @4 ?1 K% |
echo %errorlevel%
: B4 E: c8 t' s; L每个命令运行结束,可以用这个命令行格式查看返回码* \- E# E8 W2 m0 u. b
默认值为0,一般命令执行出错会设 errorlevel 为1% S; W. S3 ]# N
% T+ ]4 R' H/ u" e2 }- }$ W3 T
3 dir# u. q% D" ^- E+ [. a, g6 A
显示文件夹内容
- U# M# J$ m0 h7 p+ S6 x8 w) D2 sdir #显示当前目录中的文件和子目录
# o" e& @7 f1 O1 Ddir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件' I2 g7 `" ]" c3 Q0 f! U( v3 S: g% w
dir c: /a:d #显示 C 盘当前目录中的目录
( d# `6 r. _9 m: `4 v) Z' tdir c: /a:-d #显示 C 盘根目录中的文件
' W2 C" C$ y! |( \) e. J( r: ?dir c: /b/p #/b只显示文件名,/p分页显示* \" l( \9 p" x% f
dir *.exe /s #显示当前目录和子目录里所有的.exe文件
. ~1 m k/ w" I# n9 {3 |( t4 F4 Q6 d) h/ T
4 cd
% W+ O9 q4 F$ Z9 j4 ^0 J9 O切换目录7 D2 R% `+ ~; W
cd #进入根目录* i* [: M. J) F9 |; j
cd #显示当前目录: O0 ?: |% J: d$ v
cd /d d:sdk #可以同时更改盘符和目录5 i* \( s! c; C9 m5 |3 P
& ~# q0 b( J; j4 F5 ^4 a1 W5 md7 U9 c) h; j* o: l6 F+ B5 q
创建目录1 K! v X+ _6 u u
md d:abc #如果 d:a 不存在,将会自动创建中级目录7 O! { N' t3 q; W
#如果命令扩展名被停用,则需要键入 mkdir abc; X/ C5 O1 ]/ |8 e- L
: i8 m" C& ~2 D& n8 n6 o6 h6 rd5 O' F2 e* x0 A0 a" E6 _ w& \5 l1 d
删除目录1 } S# }/ S4 S P! s
rd abc #删除当前目录里的 abc 子目录,要求为空目录
6 j2 a5 D' K) drd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式% `3 B& X; l9 F6 T- k
, B- E* ?2 ], \# G. G7 del, h& i8 U& s; a q. C& ~; E* V( R
删除文件
7 ^: b1 s: W# l0 z0 {0 ?del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件6 n5 i( }: P2 E& P3 M8 {7 R
del /q/a/f d:temp*.*2 v* e5 X" }: @' w+ t) h9 t- G
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
7 S) K. I6 G: A W# E! f; hdel /q/a/f/s d:temp*.*8 j& E, N3 H& R) \; s+ y$ M% u, M, D
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
1 }1 ^" O7 F' M/ p* N! p! Z
1 e" g) a' J$ C) l5 ^8 ren
- s% g- I( x' E; R/ p# M重命名命令3 j [8 |1 X* N% z- {& i' T
ren d:temp tmp #支持对文件夹的重命名
& J; M' f1 f0 w/ P# p' y, u' r1 A1 `9 k) `+ L
9 cls! g: M5 ]# \# E" w& E
清屏
% b1 t% @3 z6 U. G( s3 p10 type
1 u4 w5 t! _1 C9 x/ N7 C# ~# l显示文件内容5 r1 F1 o8 P5 G" f, _1 j- l O
type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
/ T( J9 Q9 q8 _type *.txt #显示当前目录里所有.txt文件的内容7 ^# |7 G% X7 g: L8 i9 P6 Y4 |" w% @9 J
! `8 {) |1 T2 p" X: b' l) r8 x11 copy
s& @, s9 r) z0 ?9 @# V; _拷贝文件
; r6 \# C' ]# r0 J. B+ Tcopy c:test.txt d:test.bak0 N+ C' Q6 b# O' w, z5 P" i5 F
复制 c:test.txt 文件到 d: ,并重命名为 test.bak \1 C$ p. U0 z+ X& p. ]
copy con test.txt! D2 v0 g# M) Y+ U" O1 Y! z
从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件$ C6 u. y0 s$ |0 q, s! ~
con代表屏幕,prn代表打印机,nul代表空设备
0 e w% h, M2 F/ ?0 gcopy 1.txt + 2.txt 3.txt
! |" j Z( J3 E( o" O" U2 f& N合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
! E$ I+ {; V( d, R7 K' U8 w$ [如果不指定 3.txt ,则保存到 1.txt
1 e5 ~+ }/ D6 F5 m# X ucopy test.txt +) I6 G! a5 t! s
复制文件到自己,实际上是修改了文件日期6 D4 L. S# [$ V6 F6 w1 ^
% @, N9 w4 y( J% C- T12 title, X& S: H U& N- W3 J9 N
设置cmd窗口的标题4 ~8 ?4 y! t5 u( F
title 新标题 #可以看到cmd窗口的标题栏变了
) X9 |" k0 j% G4 r' L$ d+ X( z K7 k
+ [* a% T- D/ o5 f1 w0 R9 F( [13 ver
( e* k2 b# Q7 l( w H. [显示系统版本
# }6 Q1 K$ }3 @* F1 _
4 B) x' L+ d! y( `# R14 label 和 vol5 _: f2 R8 g" k' s I( `
设置卷标
, \" m5 r5 s4 q( J5 u" lvol #显示卷标
, @: i3 b3 }0 clabel #显示卷标,同时提示输入新卷标0 n5 I2 A3 Z: X' g
label c:system #设置C盘的卷标为 system
7 r5 \9 c5 ~8 ?
( {8 x& a9 _4 ?7 t3 Q# ]15 pause
$ c2 F' j; q& X& B; a8 [$ {6 n暂停命令3 A) ]0 x6 P& I- A
6 o/ P' a u+ u3 o3 q16 rem 和 ::
/ ]/ f/ `7 c9 U注释命令! X' w4 F4 u, y, {
注释行不执行操作
+ V7 v+ b9 {9 x# E$ u x b4 s# |1 I8 z
17 date 和 time
) k8 y/ u7 U ^& ~2 |日期和时间
. s6 V+ _8 O8 d4 R# H1 bdate #显示当前日期,并提示输入新日期,按"回车"略过输入' I( B7 ~, V4 A7 g- P
date/t #只显示当前日期,不提示输入新日期
* ?9 q* T5 O) J# Q* Z! b2 P' Rtime #显示当前时间,并提示输入新时间,按"回车"略过输入
; B7 `- k. x3 V" l" Ltime/t #只显示当前时间,不提示输入新时间0 P4 U/ T* P! h% p! q$ v
( h e2 X; B. a `' x
18 goto 和 :
- A6 l @1 X e5 a跳转命令! i% E; m: d: j; A3 Q
:label #行首为:表示该行是标签行,标签行不执行操作) W; \) { O, L! N
goto label #跳转到指定的标签那一行0 F! ~! n2 x) ~
* C3 F* z4 @/ T' c' J' Y. s19 find (外部命令)0 c3 U) `+ ]- J5 S3 _$ E$ @, j
查找命令7 t0 @0 V) K8 n5 e- I' T- o
find "abc" c:test.txt$ Z: W8 d; y& B" H
在 c:test.txt 文件里查找含 abc 字符串的行
9 q- x# C9 @" w: j- F! E% h如果找不到,将设 errorlevel 返回码为1. G' J% F* W) q% ^! @
find /i “abc” c:test.txt& p' l# _" A0 X" y" Y/ G! u$ q
查找含 abc 的行,忽略大小写& z: W$ b) @6 g/ w0 t: n
find /c "abc" c:test.txt
: i3 N* \% o2 s3 H" D0 L显示含 abc 的行的行数! s [: U6 t+ E4 j3 o4 \+ f* ~
. C1 R5 Y" X2 ^5 q$ b
20 more (外部命令)5 B9 {3 I6 B$ L2 \
逐屏显示2 a5 |: A/ b' f3 _
more c:test.txt #逐屏显示 c:test.txt 的文件内容7 L3 }+ x/ N1 r9 L* W- ^
9 V, U$ p5 q! b d
21 tree; ~- Q/ M8 i0 D" y/ \
显示目录结构/ e5 j2 _4 }+ Q' I# N6 Q3 v
tree d: #显示D盘的文件目录结构: y! z$ S, }# c. q, i
$ L, n6 s4 j* k8 i, \6 D22 &/ | E# E+ v o4 O8 A b, @
顺序执行多条命令,而不管命令是否执行成功) E5 Y7 J4 o+ X4 Z Z
& B A. O- [' I1 e( ^8 [2 \' f! K/ [/ [
23 &&
1 f! Y8 Y' V0 w+ p! b. S# h顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
8 E' B' e/ t9 V u8 ~8 qfind "ok" c:test.txt && echo 成功
2 ~4 `1 F' Z+ m) I4 w3 o/ Y* n如果找到了"ok"字样,就显示"成功",找不到就不显示
2 z; ^5 s v( }: k S4 F( V( g- P9 ]# O k8 L; F2 k' S5 P# o @
24 ||* t' A! V' Z8 n4 u( R
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令$ ` [0 c" k' K( T) b
find "ok" c:test.txt || echo 不成功
* O# m, v: G5 K `- _& s如果找不到"ok"字样,就显示"不成功",找到了就不显示+ u! Y, ^9 E4 S8 ?1 x! i+ S8 x
) g) Q0 [: Y) n/ `. e' ?
25 |2 x; D' ~8 E2 ~& B
管道命令2 b- E, X# M5 _# e% |8 U
dir *.* /s/a | find /c ".exe"
# G; o V- |' o6 q管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令" t2 [6 F: ~6 [$ W- {4 b
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数
1 J. A+ p+ Q k* v0 ~: N7 M: W9 Wtype c:test.txt|more( @0 K5 x" S' X/ D
这个和 more c:test.txt 的效果是一样的9 v. U/ }) j- i4 v+ `" x
( S' x) c" s. V7 m w
26 > 和 >>( l# D9 E8 Z4 [* V6 K
输出重定向命令
5 \, K; L4 P5 G7 o H$ ^- G" F> 清除文件中原有的内容后再写入1 Q! u* F) i& c) y9 \. N0 D
>> 追加内容到文件末尾,而不会清除原有的内容
3 `& v( L$ \" E/ F8 Y* {# J4 }( k主要将本来显示在屏幕上的内容输出到指定文件中# \; r* r( b. K' b$ \5 F3 |
指定文件如果不存在,则自动生成该文件) g! e' ~) W2 ]$ z: }# k ^/ K
type c:test.txt >prn
: o& z- O3 n/ H; I# g W屏幕上不显示文件内容,转向输出到打印机) f0 ?2 }3 X9 i
echo hello world>con
& F3 O/ W3 i w0 T* t- f8 R在屏幕上显示hello world,实际上所有输出都是默认 >con 的
2 L) f! {% H9 |4 q" A/ {copy c:test.txt f: >nul
& S+ B/ M n+ F8 _2 y拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
+ p; |+ |: u1 D5 ^ f& d8 lcopy c:test.txt f: >nul 2>nul
, \ w8 p' k6 u1 u2 B' F不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息
% e8 ?, v4 b; F% ]& techo ^^W ^> ^W>c:test.txt: S) \* g8 l, R+ o! |8 {
生成的文件内容为 ^W > W
! w8 s5 N$ [# L9 m% g' U^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号% k. J- M+ q2 I& ?- ^- C
. y0 ?" F8 |; [ H
27 <1 h+ D% G: p2 f$ o6 K
从文件中获得输入信息,而不是从屏幕上
w* |5 [2 W( z7 J一般用于 date time label 等需要等待输入的命令5 S0 q& C9 X2 \- F% o4 D: S
@echo off
' w, ~9 A, k+ k7 m" B+ g( Vecho 2005-05-01>temp.txt
& \: @( }: F$ P3 Z h1 O: k cdate <temp.txt! _# b+ M$ H7 T9 A, f6 e: p
del temp.txt1 g0 J" E/ S: Q: _: Z7 O6 m5 S, g5 d
这样就可以不等待输入直接修改当前日期
1 [! M, |) e# @( U0 f& _: _/ T: r4 W
0 A; W& ^6 ?1 m: N2 o( A" g0 F28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*6 }+ G& ^% y3 }2 ^! @
命令行传递给批处理的参数* A' o5 h& o$ ^% ^! |0 w% _
%0 批处理文件本身
% l) i, a/ D3 G3 B5 X' g%1 第一个参数
% S& [8 {2 l- D7 m+ t%9 第九个参数
" x2 T& o; k' B1 a3 C2 L%* 从第一个参数开始的所有参数
$ Y9 t5 e, ]! F4 C# y批参数(%n)的替代已被增强。您可以使用以下语法:
6 W0 \5 X$ ^$ J% E2 p6 J F%~1 - 删除引号(" ), 扩充 %1) G5 I8 N* ?' b e( {/ U1 i- J
%~f1 - 将 %1 扩充到一个完全合格的路径名. M/ b0 |1 H& T- ~; w
%~d1 - 仅将 %1 扩充到一个驱动器号
8 p4 |6 J1 u# |( _4 C%~p1 - 仅将 %1 扩充到一个路径 m3 i* j1 N3 T [
%~n1 - 仅将 %1 扩充到一个文件名
1 R- t( y+ l( G3 P%~x1 - 仅将 %1 扩充到一个文件扩展名+ T( X$ j3 t* E. y3 \* N3 h0 L
%~s1 - 扩充的路径指含有短名1 q: P6 i5 r- s$ s* p8 w0 k3 Y0 N
%~a1 - 将 %1 扩充到文件属性
- K* E. Z8 O6 S }/ m3 u- U O%~t1 - 将 %1 扩充到文件的日期/时间4 h( C% O& P5 R7 O
%~z1 - 将 %1 扩充到文件的大小
/ f4 m7 Y: ^0 v- X0 {%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1' ^& t2 y! i+ @6 N% A
扩充到找到的第一个完全合格的名称。如果环境( z5 {3 p# }) R. I
变量名未被定义,或者没有找到文件,此组合键会
; L* \8 c Y- E6 q) Y扩充到空字符串
" t* i$ {! N, k' n9 L6 G+ U7 }可以组合修定符来取得多重结果:
' ?$ x/ f" A$ P( q4 ~%~dp1 - 只将 %1 扩展到驱动器号和路径
& i# G* y2 h$ c k%~nx1 - 只将 %1 扩展到文件名和扩展名; y& Z$ y7 @% w2 y
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
4 @% ~! Z( p+ a4 v( j4 \) @& w& Q并扩展到找到的第一个文件的驱动器号和路径。. B7 \9 |4 S* d& p5 m, \3 F2 |
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
9 [2 v" Y' ?3 {, T7 K" S: T可以参照 call/? 或 for/? 看出每个参数的含意( o7 V- u. O' u1 ~: y1 e
echo load "%%1" "%%2">c:test.txt
4 S A; t8 M6 X2 @生成的文件内容为 load "%1" "%2"! W) e: p- z5 b( t
批处理文件里,用这个格式把命令行参数输出到文件
1 E: Q+ C* ?( N2 Z+ q. {# U) Z) X
29 if1 K0 Y1 t- ~+ `4 L& H# N8 n% ~8 V
判断命令+ g/ N7 c$ p% ~5 l
if "%1"=="/a" echo 第一个参数是/a
" g9 u+ [5 z/ d3 H6 Y+ lif /i "%1" equ "/a" echo 第一个参数是/a
& h, A2 j) c) m6 F( F- U6 p/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
$ u4 m6 M( ] o4 zif exist c:test.bat echo 存在c:test.bat文件6 F; w& I2 d: r5 l: r5 \+ N. f
if not exist c:windows (
( ?; n1 Y2 ~; o) [% c: W" ~echo 不存在c:windows文件夹- K9 f- k, ?3 M% M q+ l
)
3 y- |& q. s5 y; b& k& ?/ \9 _if exist c:test.bat (
$ i& G$ A6 j7 S% c* a( l# Kecho 存在c:test.bat
, z8 p" M$ w" w; T4 v) else (* E+ D. C+ ?, \8 r6 S
echo 不存在c:test.bat
7 ]" L, `5 n$ z9 r)
- t6 X( i# d( F! s9 v: l* p30 setlocal 和 endlocal
) o/ Q0 x+ n% J! f6 M$ H$ a+ m, k+ L设置”命令扩展名”和”延缓环境变量扩充”9 G# ^& @' i$ X5 n
SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"
8 }/ }& x' e& M+ m9 kSETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"7 |) ^: | _+ T. p5 X/ z* l
SETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"' J) X7 ?, N0 B1 ~% Z" }' k
SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充", M! Q3 x' E7 `2 ?7 ]2 G) V
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态6 J# J1 E2 O) T( b$ s' k+ e
“命令扩展名”默认为启用
8 s' i- K' D, B( W“延缓环境变量扩充”默认为停用
8 f$ e6 A5 \. ^; b; p( s( z! Q' L批处理结束系统会自动恢复默认值
3 H" l- e4 _, [, E可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程+ N. z% F+ X7 F. ~+ \: G5 Z
序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
2 C! O& g. s* C2 [+ H保程序能在其它系统上正确运行
' \0 `8 W7 \1 e" u" P"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程$ H n: E" K& G6 S) W- f, r
- H! ?7 E3 G& l0 a+ Z
31 set6 S) ]8 y2 b6 V
设置变量
: i8 ^0 v7 M8 q$ k8 U" v6 p5 x引用变量可在变量名前后加 % ,即 %变量名%
$ N8 b i" y uset #显示目前所有可用的变量,包括系统变量和自定义的变量
) |( n. y! T5 m6 p( p0 h! Kecho %SystemDrive% #显示系统盘盘符。系统变量可以直接引用; u7 L: }# |4 g/ S- s/ \$ n
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
: H$ X3 W) G- C2 Eset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2. H( N- @( _( m6 {- O, _; Y
echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
3 N# t2 j9 T1 H+ w* Wecho %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
, T X1 U% M# Y$ V# N- F' d/ V4 ^echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2. t1 \' J1 D+ A7 |( v: N% c
echo %p:~0,3% #显示前3个字符,即aa1/ w. b0 N; u. ?1 {
echo %p:~-2% #显示最后面的2个字符,即b2# R) j1 F* n; P$ F; s; |
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b3 n$ l; E7 v# A0 {
echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
! ]3 b. o# r3 _7 r- h0 Lecho %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2
: A& B5 O; I- Kecho %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2
7 a# @8 C* _; r4 ]set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2: I" n8 k( ^/ c3 A- X6 N, A3 K
set /a p=39 #设置p为数值型变量,值为390 R8 V2 T5 V6 N" H1 }6 _
set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=39 l3 l5 K- g/ P" y- n' w
set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
5 [0 u& n+ e: Lset /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?* @% i# Z; u7 u; B' }& h/ g* Y
set p= #取消p变量: G9 S) L5 r8 ~ \ j" V
set /p p=请输入* M) ] Y+ I% W% p; E+ B; r/ |- _
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p% Y* E: K" [8 a3 `! o* f. Q& p
注意这条可以用来取代 choice 命令3 ]1 \2 C7 F* R# R% d
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
8 U0 t9 W+ [" E; k@echo off
3 H+ ?, Z4 ?5 M$ a+ U0 Tset p=aaa A( k; ]9 Q9 R
if %p%==aaa (
* t* |" ?& P$ B7 [ H0 Q5 E) t- L8 oecho %p%! X; j' W% I( d8 z: ?
set p=bbb+ h. J: h0 K, n* _. E
echo %p%
' b; o* R$ h. y/ |) j. N)
3 Z. X: b$ i% v8 X+ R& K结果将显示; U: k5 M, G% y9 s! l
aaa, Q( U9 d! o6 f8 u
aaa
4 H. E/ M4 U) B/ S因为在读取 if 语句时已经将所有 %p% 替换为aaa
( M# [" N# v% D- J# h这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
- B' S7 B$ a9 F8 V+ \- w* R( g ?可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
V, F6 K1 R6 T- c8 `3 O@echo off
* C2 C1 @, ?# T) E2 z G Q3 GSETLOCAL ENABLEDELAYEDEXPANSION7 z1 Y8 D8 f1 ~- t# P, R; v& r
set p=aaa+ S+ q' e! N9 W3 z5 L! C1 s: ?
if %p%==aaa (. Z0 \% N0 y/ M7 h. z1 d7 x
echo %p%
0 P: G! T0 e8 F" B# Jset p=bbb, \) h# F# z a0 e
echo !p!2 m# A& @6 o; d3 I8 i
)
* ^; w( c* h) Q5 b2 ~4 W! GENDLOCAL6 \! M- S9 N6 t: @" }+ k J
结果将显示
$ Y) f* J$ Q3 z; K8 }+ i; ~aaa
( Y4 j* H; w$ M$ Dbbb
% g+ B. x8 F" J* t: T还有几个动态变量,运行 set 看不到2 n0 q1 M( b$ Y4 ^2 @
%CD% #代表当前目录的字符串& k# h4 e H' N' `5 M; a: H
%DATE% #当前日期
" x0 s4 g' k+ \( \2 _* f%TIME% #当前时间
8 W6 e% R; w5 z: |6 i- Z1 Y%RANDOM% #随机整数,介于0~32767 R: p, t& ^$ d, E1 x
%ERRORLEVEL% #当前 ERRORLEVEL 值
; H1 Y: r! ]6 y4 a! ?%CMDEXTVERSION% #当前命令处理器扩展名版本号) |1 X- |( W) r( W8 ^3 K' l
%CMDCMDLINE% #调用命令处理器的原始命令行7 n. @. d- I& ^8 z% W
可以用echo命令查看每个变量值,如 echo %time%% N' `, |7 h7 U3 O
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
1 G& @! K* W% ~2 i6 I6 t
8 X$ \& ?5 V( d. [32 start1 |, p: c7 r- ~# m
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
) _1 Y2 x( y) |: Z
, o/ j, Q/ i! u! B0 H2 S H33 call
3 s( e7 F/ v1 E批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
% D# c- X9 R3 g% U有时有的应用程序用start调用出错的,也可以call调用
" U0 _$ h q: |% Z, L( C" S
J# C! e" C5 T* G0 U1 d34 choice (外部命令)
" \. S" w& J3 f: ~1 D. V9 L选择命令
Q1 y* L* v: f; A5 V5 P让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……
+ w3 m1 J. t0 R# a; G! Y0 Twin98里是choice.com2 q( _$ N) v; g! Q; o `% G5 b
win2000pro里没有,可以从win98里拷过来
b+ ~* U6 B6 T1 d- wwin2003里是choice.exe
) m1 j+ o9 C8 `% Nchoice /N /C y /T 5 /D y>nul& | h1 y3 [7 @$ S
延时5秒; V e G& z7 ?2 H W- b* v. {0 G
: y t9 n9 a8 n6 r35 assoc 和 ftype
J! P5 P* t3 O- O4 B文件关联1 k6 s( k) s3 U6 A
assoc 设置'文件扩展名'关联,关联到'文件类型'
2 [% F: V/ s& [+ s& l* I2 Y4 ?ftype 设置'文件类型'关联,关联到'执行程序和参数'/ |/ r' R8 L& P! v' V
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开' j% g2 D" `( T9 R, H
而是先判断.txt属于 txtfile '文件类型'; \ H6 D$ ?- D5 D; n1 T$ }) B
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
, b/ g7 C, w+ j- V可以在"文件夹选项"→"文件类型"里修改这2种关联
' w' j" P# n8 }* a9 ^assoc #显示所有'文件扩展名'关联, ?3 s5 E; o+ J$ f M+ A* Y( ~- C& r
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
3 R/ n$ G1 X' Y. k$ S1 j$ V7 bassoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
4 s3 U% @3 }* E/ r7 t# Q Fassoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
9 v2 t/ Z+ z! @9 {; H0 I/ \ftype #显示所有'文件类型'关联) w" B' a- D# O4 v& u- f" c7 D
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*, m2 I" w; I" t, n
assoc .txt=Word.Document.8
' N* u( ^& I( ~5 _设置.txt为word类型的文档,可以看到.txt文件的图标都变了
! a) W2 B1 e; w9 Q; hassoc .txt=txtfile9 R+ X6 C* I( c6 Z
恢复.txt的正确关联' Q* A; L) y/ [! ?! I
ftype exefile="%1" %*$ W( K5 e! z6 z6 |7 o
恢复 exefile 的正确关联
' K, @; H: f- @* n) B* g如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
w8 q2 {+ s$ v' Y
7 v* r5 ]4 s* }$ r+ s+ n! Q- _36 pushd 和 popd
. P L' Q1 }: d) M切换当前目录
4 B- X4 ?' S: x" R* O7 c$ c@echo off
4 \4 o" @. |) j3 c& N4 s7 E% {c: & cd & md mp3 #在 C: 建立 mp3 文件夹, l- x/ d+ I! i0 T# v+ W
md d:mp4 #在 D: 建立 mp4 文件夹; X; M: |0 L& N! Z. E; N6 q
cd /d d:mp4 #更改当前目录为 d:mp4, ^ t8 m% G% ~0 f: C- m' P" d
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
( _' Y" q6 Q" q k/ f( }) Dpopd #恢复当前目录为刚才保存的 d:mp4
$ m6 f4 A3 Z4 k4 h4 W, p
7 p# _0 X% H, l( ?37 for
2 |0 e X4 ?' M! Y" g: H8 B* L循环命令5 D/ C" f7 E1 f' A# e2 o& Y2 E
这个比较复杂,请对照 for/? 来看
) a+ M, ~' c* n) xfor %%i in (c: d: e: f do echo %%i5 e- C2 ?2 d# |: A
依次调用小括号里的每个字符串,执行 do 后面的命令" R# G: Q* U1 D) l$ g
注意%%i,在批处理中 for 语句调用参数用2个%
/ E5 f- e2 Z) L7 X9 J3 H0 ]默认的字符串分隔符是"空格键","Tab键","回车键"# a1 b }- `; e* E# X/ Y/ _
for %%i in (*.txt) do find "abc" %%i
- T* F# a! _; Y5 h( {) R& L' k W对当前目录里所有的txt文件执行 find 命令4 d% \; I9 ~3 i2 l2 G _
for /r . %%i in (*.txt) do find "abc" %%i* E0 G4 k* L* q' P# e* s' P
在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
0 U- H* M, t7 [; @0 b; e- Bfor /r . %%i in (.) do echo %%~pni# z- v) v; x9 K% Z. v& N- | }
显示当前目录名和所有子目录名,包括路径,不包括盘符% W& {6 ~8 F8 P; \; M
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt+ a! K) |! e, T7 T- i8 I
把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去$ f, f# l: f: e2 d, P
for /l %%i in (2,1,8) do echo %%i
; ]0 Y/ h( s3 Z* N. Y' c0 o生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加17 j/ L0 @* m9 n b
for /f %%i in ('set') do echo %%i* d2 q) Z3 h9 D6 [* a- R4 z
对 set 命令的输出结果循环调用,每行一个% x( U; N* V A3 e
for /f "eol=P" %%i in ('set') do echo %%i
5 _$ z4 r# m- I取 set 命令的输出结果,忽略以 P 开头的那几行
}8 G% @0 C# ]7 {" R+ Z3 d- {for /f %%i in (d:mp3.txt) do echo %%i. [( l( k, J+ Z7 G% F0 h
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称/ e' L; R" s7 b+ G3 P/ N
for /f "delims=" %%i in (d:mp3.txt) do echo %%i# N6 G% M5 d; @9 S8 m% U
显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
/ S- I: n8 {. y+ w6 ~" x' ofor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
; Z, v* c r9 e- V/ E对 dir 命令的结果,跳过前面5行,余下的每行取第4列
) I* J0 X6 u. Q8 p9 k) G$ W5 H) Y每列之间的分隔符为默认的"空格"
# X, \) ?* j( F" [可以注意到 dir 命令输出的前5行是没有文件名的
* x+ h0 c' j; g7 \for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (, A' M5 I8 {7 d* ^* t# }
echo %%a j" T% e/ m2 f* p5 q
echo %%b
7 j- g! H, u: n1 q! l5 Iecho %%c$ X l' ^: w6 E; e. x$ x4 S
)% K4 C7 W1 e1 e0 E
对 date /t 的输出结果,每行取1、2、3列
% l% `& {% m) _! e) i第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列( q& Y" Y# w. I
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"9 @( \% c. K( w. ^6 h* g
其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的4 k( _# K9 G2 i7 v
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
: k {# C1 P4 r, q6 F6 {% T取第2列给 %%a ,其后的列都给 %%b) ^4 u3 v# D- z9 ]7 L
) e7 F# d' F9 v6 ?* I2 T
38 subst (外部命令)
3 `. x# {- l! ^+ `9 z( J0 V映射磁盘。
F3 G c9 B* Z) G8 p! T+ D; csubst z: serverd #这样输入z:就可以访问serverd了3 I0 {+ i- z% S: m6 q! T% G
subst z: /d #取消该映射( m4 v2 j# }7 U( Z& X( e
subst #显示目前所有的映时
& w7 v+ [$ u" B( t8 V0 D2 g) }8 \+ x3 j+ b/ T# F
39 xcopy (外部命令)) P1 q9 |9 J; w3 s- x F( X
文件拷贝
2 W/ Y1 }2 E# ?: Vxcopy d:mp3 e:mp3 /s/e/i/y
! Y0 c d! M" O6 M' J& I复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件) C7 k! m* l% x
加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问6 k- x9 P' x, f# e( V
- i* r# |2 V+ a+ ]( d" L9 B常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退6 ^$ c" Q* ~/ \$ |, X0 m" h
- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:
1 B7 n% J$ |/ H* Y+ E* N! R0 N: ~
8 d1 }% z. Y. j
@echo off5 |% |. Q, o1 Q% u/ Z# r
set p=aaa2 s' `; ~4 b$ L( E
if %p%==aaa (
+ _ @* Q6 b: mecho %p%7 [ n6 N0 k8 S3 N* q
set p=bbb
U$ w. X- p, L# o% u0 H. recho %p%
5 |! z" U0 G% Z4 A1 x)/ j5 v, X. d$ c& v9 F
pause
截图:
) J9 o% R h8 K7 I7 i 2.批处理.bat 文件中输出中文乱码
8 s+ X |/ x. _! a: V8 ]6 g# Q- 原因:记事本新建的文件,编码不是 utf-8
- 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
- 操作截图:
3 N$ w, U8 b- I - 效果截图:/ M* q) P+ h* a; o7 W; V; c) b
7 p$ ~* X( T) D7 H# c6 i; ~
. r! ]) k' ~2 [5 R, ?* @
" T* d! p# k+ n" p6 J
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
|