|
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
- 2.批处理.bat 文件中输出中文乱码
- 解决方法在文章末尾!8 b8 Y4 G' `7 a! E9 h: r( G
前言- 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效
7 s1 Y6 @) s9 c0 M t- B0 v
在Windows中善用批处理可以简化很多重复工作 什么是批处理?批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展# `7 v3 J/ A8 t$ d
名为bat 目前比较常见 的批处理包含两类:
( g0 v5 U3 | j- DOS批处理和PS批处理。
- PS批处理是基于强大的图片编辑软件
- Photoshop的,用来批量处理图片的脚本;
- 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
- DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
% W" v) C$ K/ H; o h
批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的" t s/ u* [/ _: U
命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件
" J4 F1 E, j# P; F0 V7 U 怎么创建批处理文件?- 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
- 一般情况下,每条命令占据一行
- 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
- 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出
( `8 j2 }' _) f6 @5 C1 @' L 批处理命令简介- echo
- rem
- pause
- call
- start
- goto
- set
" I/ \$ p& G# V \. w8 M8 _' k 批处理常用命令总结批处理符号简介- 回显屏蔽 @
- 重定向1 >与>>
- 重定向2 <
- 管道符号 |
- 转义符 ^
- 逻辑命令符包括:&、&&、||
' _. P h. l/ k 常用DOS命令- 文件夹管理:0 _1 D% t; R3 e/ K( k
- cd 显示当前目录名或改变当前目录。
- md 创建目录。
- rd 删除一个目录。
- dir 显示目录中的文件和子目录列表。
- tree 以图形显示驱动器或路径的文件夹结构。
- path 为可执行文件显示或设置一个搜索路径。
- xcopy 复制文件和目录树。) H* M8 I$ ^: j5 o6 ?, s
- 文件管理:
$ Y! m8 D5 |2 l# b% j& a- Y- type 显示文本文件的内容。
- copy 将一份或多份文件复制到另一个位置。
- del 删除一个或数个文件。
- move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
- ren 重命名文件。
- replace 替换文件。
- attrib 显示或更改文件属性。
- find 搜索字符串。
- fc 比较两个文件或两个文件集并显示它们之间的不同
0 E' a6 Q( f* k( |. X% u
- 网络命令:
6 Z& m6 n( i, C% X9 Q* O% k/ r- ping 进行网络连接测试、名称解析
- ftp 文件传输
- net 网络命令集及用户管理
- telnet 远程登陆
- ipconfig显示、修改TCP/IP设置
- msg 给用户发送消息
- arp 显示、修改局域网的IP地址-物理地址映射列表: S: ?; C- {4 |. V$ E- h! b# ?
- 系统管理:
) |7 p) F) P$ a0 z- at 安排在特定日期和时间运行命令和程序
- shutdown立即或定时关机或重启
- tskill 结束进程
- taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
- tasklist显示进程列表(Windows XP Home Edition中没有)
- sc 系统服务设置与控制
- reg 注册表控制台工具
- powercfg控制系统上的电源设置
: J" P* V; G# Q) x3 F % k9 ^1 p6 f: k% J
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
4 E. R; v# A6 ~) |6 w2 J
6 E) M/ E5 @! [ A' _/ TWindows Batch 常用命令, | F1 p) D' p+ T
1 echo 和 @
% Y& q; Z# M0 f A& n- Y D回显命令
' G3 c5 ]8 J6 z; `; i@ #关闭单行回显/ `8 e5 m9 m1 |) Y: d5 T( L, e
echo off #从下一行开始关闭回显
; q) T3 C) E* ^5 N' G7 Z6 Q@echo off #从本行开始关闭回显。一般批处理第一行都是这个, T4 G( L' S+ a8 l7 O5 I" x F
echo on #从下一行开始打开回显
5 v D7 h" @0 `5 M V( d% Z% V0 ?echo #显示当前是 echo off 状态还是 echo on 状态
% t1 X3 R7 c; u( L Recho. #输出一个”回车换行”,空白行$ m+ L8 I; v" [, Y
#(同echo, echo; echo+ echo[ echo] echo/ echo)3 R4 R7 o7 ~6 \. I5 ?& L* @
" d, D3 Y' Y9 D, N' K6 z9 T( O
2 errorlevel
, O- j) l- y4 M9 M' a) Pecho %errorlevel%" t2 D5 }$ ]8 H1 s
每个命令运行结束,可以用这个命令行格式查看返回码" l# X- y ]' z( A
默认值为0,一般命令执行出错会设 errorlevel 为17 g% y- a6 c5 I
2 X. f# y4 x) @( a0 |
3 dir1 U) o; `% Q' R7 l4 S5 N
显示文件夹内容
) d; s, R6 r" q- K' ^) ?! Rdir #显示当前目录中的文件和子目录$ _; k) R/ M% M" M/ B% K8 e
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件5 D1 X0 u+ i P1 A+ D" Y' j
dir c: /a:d #显示 C 盘当前目录中的目录0 T5 N0 H5 G- ~( b& h% ^
dir c: /a:-d #显示 C 盘根目录中的文件; n$ `% `0 I0 g0 i: H0 l5 ]; d
dir c: /b/p #/b只显示文件名,/p分页显示
7 U1 ?& b# T6 ]: ?4 Sdir *.exe /s #显示当前目录和子目录里所有的.exe文件- H9 ]8 k" u3 t6 Y
( P( y- s& [- l9 L. s% r
4 cd9 x' Z" o: t; N6 ~0 h* |$ U* H6 k) F; f
切换目录
+ c- I- y- z6 p4 x; r1 Ncd #进入根目录
$ |2 } [ E! N" a' o2 g" U Mcd #显示当前目录0 w8 Z- g* y2 n
cd /d d:sdk #可以同时更改盘符和目录
9 I* A0 p- [4 b6 Y& {- P0 M' P
4 T, F1 I# t9 x+ d! r' E! U5 md
) Q8 y+ T, N" i, P4 @创建目录" J6 i: {' Q6 ]- c; Z/ M `7 x( s5 ~
md d:abc #如果 d:a 不存在,将会自动创建中级目录* y) W ~" m# V+ v# C% ^1 l( O% X
#如果命令扩展名被停用,则需要键入 mkdir abc
; R# A7 V1 E9 ^ C0 e) e
0 {3 k9 E% E0 K) o! B6 rd0 y3 }: U0 k: o( m. J1 p
删除目录; a0 K# |: e6 n8 [7 P& x
rd abc #删除当前目录里的 abc 子目录,要求为空目录
, M4 z! q% H4 @, U5 u9 `rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式7 b1 L1 l. b' o/ n
1 c9 E. g, y( k% `
7 del
6 S% p& e( V& D" M删除文件" I* d8 Z ~4 c$ t$ m1 K3 m- \
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件, c/ q" M1 J' r6 P
del /q/a/f d:temp*.*& s2 }5 ^: w5 ~; K8 _8 x
删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
9 D h/ d# _- u! Mdel /q/a/f/s d:temp*.*3 O s6 s* @. J; y
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录) l5 Y" C$ v* f4 |# @
1 X* }. d! A; |1 u8 ren
# r- b1 a6 H6 ^3 H5 n: M重命名命令+ Y6 T: x' F7 E/ B) T ]& v* v% `
ren d:temp tmp #支持对文件夹的重命名( V2 `2 p% z! M) a2 J
@" F* V9 U' r1 N, R8 R& R g7 n: R
9 cls& [+ m/ U. m! a! l* Q0 A! r: l% d! ?
清屏
( u! e* Y5 e2 x$ V3 `5 y. I& h q10 type! K8 |+ a! a/ u6 t5 A
显示文件内容
2 x! H& Y' d* R7 ?type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码
8 b- T" X/ S# F- \+ qtype *.txt #显示当前目录里所有.txt文件的内容" g$ H; m8 S% l+ l* Z
" [. @. N; E5 [11 copy
+ A5 {8 q: r: }0 l拷贝文件: L- K) ~8 _9 g7 j
copy c:test.txt d:test.bak
' D: Q Y6 ?: r" l2 s( X复制 c:test.txt 文件到 d: ,并重命名为 test.bak I4 [# k0 _1 c# O1 h' N: O% O& L8 ]
copy con test.txt
, m3 C* @. q8 ^从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
$ m3 ?; O7 y5 F8 @. Mcon代表屏幕,prn代表打印机,nul代表空设备, A7 [7 f1 A* C* o
copy 1.txt + 2.txt 3.txt- f" B5 A7 J" Z: O) ?. R3 h0 \
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件( Q& i x6 i% V0 b
如果不指定 3.txt ,则保存到 1.txt
e( F* A, @, x8 ~copy test.txt +
3 i9 A8 |0 N' A* |/ e) M, T复制文件到自己,实际上是修改了文件日期
% [5 c7 e! u7 G, Y# e+ J0 b* G1 ^4 ]- s* y4 c3 y1 p1 F
12 title4 ^) Q6 |1 S9 X/ R" x) K
设置cmd窗口的标题6 ~( z$ s" r& Q3 O5 q. A& n
title 新标题 #可以看到cmd窗口的标题栏变了$ p$ B3 X* G6 C
3 E; u. W! p; }" {$ _
13 ver3 {! M: s; C6 D' A& d9 F
显示系统版本- h' h& c! i7 n8 x) o) z f) x
7 B9 h; L8 Q' b14 label 和 vol! E* q! D/ I% ~
设置卷标
5 \9 G' Y3 h3 B* ^% {4 y% avol #显示卷标8 ~8 o0 h0 Y7 k6 ]5 m; {' o
label #显示卷标,同时提示输入新卷标" H' Y8 Y( i, j. A( }2 f( ]8 I
label c:system #设置C盘的卷标为 system- f) T3 D( l a! L/ ?& I9 @% q7 X
$ g5 J$ f5 y+ a2 m15 pause3 k/ x$ |0 ~9 V4 w x: j, l# A+ T
暂停命令( B: R! t+ c! M# K
9 Q& E+ H3 B6 p1 y' a
16 rem 和 ::
5 Q+ R- t' y/ A. V& ^注释命令. J- X5 f; }2 ~1 L/ u0 J9 c
注释行不执行操作
; t# p" N4 z8 H4 ]7 d, j6 R6 g! L' ~) W/ I) o+ ^1 W/ g' A! S' W5 ^# F' _
17 date 和 time6 m, v" A4 B6 p s
日期和时间
6 b4 Q1 o; u" qdate #显示当前日期,并提示输入新日期,按"回车"略过输入
, N: {8 I. P5 \date/t #只显示当前日期,不提示输入新日期
, M7 c+ R E+ i7 O! etime #显示当前时间,并提示输入新时间,按"回车"略过输入
+ n% X% Z. T% D! n+ ~' J6 d% ptime/t #只显示当前时间,不提示输入新时间
4 Z$ ~- @$ }" M; ^8 j& T# t, b
+ d$ v# r. w! F$ r$ l18 goto 和 :) T! c. ?. t; N0 P
跳转命令
) L' Q. x# q8 u4 G% J) ?, f$ O:label #行首为:表示该行是标签行,标签行不执行操作
8 F( i: T; [4 w& j5 Ggoto label #跳转到指定的标签那一行
4 y; b0 S7 m4 O& }# f# w
, M6 ?5 {) Q+ h" m1 |19 find (外部命令)4 j- b( `+ e+ v3 H, T% A) G$ F9 V
查找命令
) L3 g$ t7 Y; }1 d8 sfind "abc" c:test.txt
0 G0 m. V( H: ?8 C4 p在 c:test.txt 文件里查找含 abc 字符串的行7 E. n; \' P4 O9 c7 u8 A- h
如果找不到,将设 errorlevel 返回码为1
0 Q6 U6 a9 m, p6 o* ufind /i “abc” c:test.txt
5 }) c$ U9 L' e% W9 Y. p0 ?7 }& I查找含 abc 的行,忽略大小写$ a& X; b+ ]( {
find /c "abc" c:test.txt
1 G# u& S: o* u& X显示含 abc 的行的行数
; S9 z9 I0 J; P# T- s" \
9 H' l: c7 C8 e# n. k20 more (外部命令)6 R& J) Q; g r. X- U) S3 G* e
逐屏显示, N- [* F% T. ~8 Q2 k# _
more c:test.txt #逐屏显示 c:test.txt 的文件内容2 u3 `8 f2 D7 N8 ~
6 O' v8 B- [# A
21 tree) B) l3 m" K% z+ z2 Q- X
显示目录结构
5 \* q' n* L! W9 ]tree d: #显示D盘的文件目录结构
# {$ B ?! D9 i8 {
/ `0 U0 z/ r% N6 ? D' q0 P2 T22 &
& x1 D. N4 B1 P1 ]1 N$ M& j顺序执行多条命令,而不管命令是否执行成功
: x9 Z1 z! k$ L- n. C# R; k
* R1 |% W3 w/ I( c+ O/ F+ O23 &&
7 P' I [/ e) a. }: q# |' H% J$ I顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令' @! p) {5 n# H8 h) x
find "ok" c:test.txt && echo 成功) d! _/ [ G/ u) I" s
如果找到了"ok"字样,就显示"成功",找不到就不显示+ F" P& }2 Q- P
% D* [! @0 S! d, d( }( y5 b8 I24 ||. e) p" c; Y; ^1 N9 T1 M' E. w& a
顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令6 ~. J- R$ ^# @) f0 ^
find "ok" c:test.txt || echo 不成功1 X u' c% A- \& i; H
如果找不到"ok"字样,就显示"不成功",找到了就不显示
3 O" M& {# S" {; H% s- F# [: m1 m
* v* J( I: K) a+ n25 |0 I: n1 j+ w% v$ C8 A
管道命令- A1 [3 ^/ F* Q* r1 s
dir *.* /s/a | find /c ".exe"( u& @4 p9 T' K, ]% p( m7 e/ @
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令
1 d, r0 X6 W! U5 T该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数# M: u: K9 |4 _6 K, j4 U" l u) W
type c:test.txt|more
2 W8 u8 y9 n! x; b这个和 more c:test.txt 的效果是一样的" q0 [* P: S1 h5 y
6 D6 |5 I7 { G2 [26 > 和 >>% T( w9 C) {8 F0 E6 y& |* b
输出重定向命令, d/ e7 l1 j; L! [ |( G
> 清除文件中原有的内容后再写入1 J9 ^% R8 V: a z2 w5 P. ~
>> 追加内容到文件末尾,而不会清除原有的内容
5 C) K+ G) O- n主要将本来显示在屏幕上的内容输出到指定文件中. D1 ?# v8 ^% F2 |
指定文件如果不存在,则自动生成该文件
0 f6 x+ l" j. H, r- A. ~6 r8 q) Htype c:test.txt >prn
% A; Q$ F( s5 q$ N+ i4 r屏幕上不显示文件内容,转向输出到打印机# V8 h6 [6 [: c! u S
echo hello world>con
a/ O) D; b/ u4 d在屏幕上显示hello world,实际上所有输出都是默认 >con 的
8 y$ h2 W- p" i5 I/ i- Z, Lcopy c:test.txt f: >nul4 M, h& \5 |, g4 C! f
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息' i! T; n2 h& m8 l* @$ s
copy c:test.txt f: >nul 2>nul
* y: C' T7 m j0 G3 T- I不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息" H# {3 e+ l8 R) m
echo ^^W ^> ^W>c:test.txt n# k! d- ]$ K4 @9 W$ h
生成的文件内容为 ^W > W& B3 v! E9 [8 T- e2 h
^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号% D( `+ @* G$ p, R8 p) j
" b* G' j" O A- @- g) \0 s) U
27 <
+ s$ A# D4 e5 l1 M% c从文件中获得输入信息,而不是从屏幕上
4 {0 m( I! L# e( S( [8 q, }一般用于 date time label 等需要等待输入的命令
* _# N; Y! ~" H; K- i" g@echo off, G; l p4 q# Z8 A3 Z7 d& y" A
echo 2005-05-01>temp.txt
/ f- z8 L# V0 w2 v) Xdate <temp.txt3 W; d0 i+ t5 _8 A) A) m* E
del temp.txt
% j# Z. H! V0 p! D4 N) Y9 _* |这样就可以不等待输入直接修改当前日期
/ |4 y1 K' l# G1 a" `0 l
* u, o B0 D- h9 z6 T28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*, e+ V3 P9 }; J! X/ \2 B' h' ~
命令行传递给批处理的参数0 X o8 U4 n% u( K
%0 批处理文件本身
0 d& w1 b1 o, P9 ^/ u e- d%1 第一个参数! h: e& u* _! t! O6 Q
%9 第九个参数: Z$ p/ ]4 @+ s1 ]' Z) c
%* 从第一个参数开始的所有参数
* z9 W @2 s* Y/ `/ L4 U批参数(%n)的替代已被增强。您可以使用以下语法:6 M) t6 ]7 a3 U! H7 l: L' h& e2 ^0 C
%~1 - 删除引号(" ), 扩充 %1
! j; i8 b# N# r+ L%~f1 - 将 %1 扩充到一个完全合格的路径名( I$ `& p! j3 ?& {3 T
%~d1 - 仅将 %1 扩充到一个驱动器号
# t( Z7 Z- Q m g- }1 f2 x) L%~p1 - 仅将 %1 扩充到一个路径
; N8 Z" A0 A: a. l6 V* \" v- p) d%~n1 - 仅将 %1 扩充到一个文件名
& o; j0 T/ t: f7 Z, u8 z%~x1 - 仅将 %1 扩充到一个文件扩展名
; p5 F9 W% i: j) r! ^%~s1 - 扩充的路径指含有短名
. ~5 S2 `( K/ H: v" S) c) n* y5 r) y%~a1 - 将 %1 扩充到文件属性% T1 u) E/ i. @) B* {& z
%~t1 - 将 %1 扩充到文件的日期/时间
- q, S2 I# R$ D. C%~z1 - 将 %1 扩充到文件的大小! L% V; Z( n! V! t/ X
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
3 s9 b k; v1 u1 a' p+ l扩充到找到的第一个完全合格的名称。如果环境' f3 y+ i) s0 N# M
变量名未被定义,或者没有找到文件,此组合键会7 |* I1 l/ ^- ]% f* F
扩充到空字符串
* {" K& f. ]! P, k6 c可以组合修定符来取得多重结果:- t% j8 [4 L3 a9 |7 q. U
%~dp1 - 只将 %1 扩展到驱动器号和路径
' B l) ]) b) \% |%~nx1 - 只将 %1 扩展到文件名和扩展名* [3 i7 w+ t1 W. a
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
+ f0 O- G; t- g) L并扩展到找到的第一个文件的驱动器号和路径。
. _+ Y2 f) q" P%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。9 l9 B- i9 D: |6 X" T. @* O l% p
可以参照 call/? 或 for/? 看出每个参数的含意' J o: L% @; @9 q" _9 p
echo load "%%1" "%%2">c:test.txt$ R6 ?/ S" B" U3 U- P2 {
生成的文件内容为 load "%1" "%2"& u' O9 W! `4 g; B
批处理文件里,用这个格式把命令行参数输出到文件
# [5 D" r6 [' M2 {
6 A) } |' g4 C U: Q# I( ]+ Q/ P. d29 if" t" Z: v' o( y2 \( H
判断命令+ @3 a& M% C) r4 o4 k' K
if "%1"=="/a" echo 第一个参数是/a4 o. J& C( `! `6 T0 o7 ?0 N/ k
if /i "%1" equ "/a" echo 第一个参数是/a
- g$ v. w6 V$ y$ i8 T/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?$ A6 c g/ I. y) K' P }5 h, B
if exist c:test.bat echo 存在c:test.bat文件- ~- m3 a% S( k
if not exist c:windows (
- c5 @ C4 J# B$ necho 不存在c:windows文件夹& a9 J+ R* ]! _1 k* E
)& h* d/ V( H; L9 W: @& Q, v
if exist c:test.bat (2 ?4 j7 w, n" S
echo 存在c:test.bat
* P+ G8 Z; o8 C" h% c) else (
* i+ g2 I" o$ qecho 不存在c:test.bat* G; A. q% l8 `. j- d" t% i* x; Q
)' Y# F( n- [$ b- j" m% ]
30 setlocal 和 endlocal. K3 l0 q9 W, u- n! {
设置”命令扩展名”和”延缓环境变量扩充”
% U+ @$ s _0 w3 t _0 |. n$ E6 HSETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"# W$ J8 m, J) a" s B
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
# c9 Y9 V+ ^$ D! M7 tSETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
n7 w1 ]1 O. T) R1 PSETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"6 ~. v C- N& o4 e: @0 D" N
ENDLOCAL #恢复到使用SETLOCAL语句以前的状态
# \, Q5 i1 s. y8 B) {' B“命令扩展名”默认为启用* m6 b3 ^. U- ~; V* q' w$ n* k9 S
“延缓环境变量扩充”默认为停用
% ?" _6 o4 T( h批处理结束系统会自动恢复默认值
5 v: b; o* S# h7 `! c1 F可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
+ v6 U2 n, J% M序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确' `4 x' f. m# q" M2 g1 \
保程序能在其它系统上正确运行
# A* n! h- p: t3 \" i"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程
) t" r$ B# v' H5 f# q* i7 b* U" ?( r+ `- E4 _* f: A7 @/ I
31 set7 I+ j) [1 i1 P. E3 Q" j& Q
设置变量
) R# l7 M8 @6 w" l2 n' S, ^引用变量可在变量名前后加 % ,即 %变量名%
4 `5 i" g( C, G4 }set #显示目前所有可用的变量,包括系统变量和自定义的变量4 p- l% t* i$ {" b9 p4 r
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用
: P" s F8 e# K5 ~" i" `" Hset p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1
- g5 j* J# E% t# Zset p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
/ C, S$ i" @0 f# C+ cecho %p% #显示变量p代表的字符串,即aa1bb1aa2bb29 l4 w" t6 Z! K' I
echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb29 L( `1 D+ L0 o* W/ _2 H, G+ H) [
echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2: b; c/ ]& Z' Y! V
echo %p:~0,3% #显示前3个字符,即aa1
( L' g4 l0 u; ]+ b$ y6 ~! Pecho %p:~-2% #显示最后面的2个字符,即b2% D4 ~% p. f. u0 Q2 p+ j3 E
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
) I/ ?; q- V2 Gecho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb25 r; l6 P2 ]4 B! [+ X
echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2; ^' {1 [1 Q4 s2 Y1 p& J3 J' E4 n
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2' e' W/ {- [6 N! p0 e$ Y" q2 Q0 s
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2* G+ O$ G. L" B8 | T
set /a p=39 #设置p为数值型变量,值为39
" d o- R. C0 N5 tset /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
- n, M" d v/ x0 bset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用
- G% L+ T+ x! z; T4 `set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?
: @7 L& F P$ Q4 B' a5 Yset p= #取消p变量
D, i) n5 X# k7 }( n& ^3 ~& H8 ?set /p p=请输入$ v. {# u9 \9 l" l3 A
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p/ a. h2 A! H' U0 ?6 j2 X
注意这条可以用来取代 choice 命令* P8 u8 u. s1 b& D& U
注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
# r* x" @; A1 I' j- Y@echo off
5 O. N9 i. k' w# F$ n# Q; Gset p=aaa
6 @- w5 U5 T) M$ Uif %p%==aaa (
& Y# _* T7 t5 p, j& n8 a! W+ J: cecho %p%
. J. v8 r$ P0 x& O c7 M# y5 Dset p=bbb
" w- `% H, q; C' x4 d4 ^. xecho %p%* l9 f! a' i' k# A2 v
)
' k: x) u j5 V) `7 B* L结果将显示
5 k* |% }% }7 K8 raaa7 O2 E, p" Y& {5 C- M
aaa+ B4 }3 M& X" ]$ k, k' P7 h X' H
因为在读取 if 语句时已经将所有 %p% 替换为aaa# @# g# v. B6 v2 T; k
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"
8 o8 z* O# Q8 C/ ?) C0 l3 z可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!+ @/ R% p2 |/ Z) z1 M: N0 m
@echo off
/ N% b; o( T2 c4 ~SETLOCAL ENABLEDELAYEDEXPANSION
/ L( s3 M+ Z4 a6 J* t+ v U% Lset p=aaa$ {# |) j g4 ?, G J- T
if %p%==aaa ( O6 l* I X4 {1 M1 |- S( d, \
echo %p%1 D4 ?1 w2 X7 [( J+ A8 ^/ K, R
set p=bbb$ c2 ^5 t8 x- w% x2 c# k# X. p& p
echo !p!
- ` A5 J$ B: e; e' I0 T0 N)
. p' Z$ p: K& Y# CENDLOCAL
6 `& {; M0 H7 ^0 w# s9 X; W; Y结果将显示4 j6 F5 {" a7 A+ z" A2 J
aaa7 C& ~. c& @' R$ x7 z
bbb" n6 A4 a) j( Y! P
还有几个动态变量,运行 set 看不到
! |/ N# }+ u3 }, \1 |3 {! U! K, {# e: d%CD% #代表当前目录的字符串: L4 w }. h& T% ?
%DATE% #当前日期- c2 k9 N3 J1 k" Z4 S3 E$ h
%TIME% #当前时间1 {, w0 W, Y9 ]" x" G
%RANDOM% #随机整数,介于0~32767/ b3 u. u. I% {
%ERRORLEVEL% #当前 ERRORLEVEL 值
5 y% Q" A- i' W4 \2 L%CMDEXTVERSION% #当前命令处理器扩展名版本号% ?$ {8 r1 `9 c e/ o: Y+ n
%CMDCMDLINE% #调用命令处理器的原始命令行
4 I8 e9 Y C* V5 K, j可以用echo命令查看每个变量值,如 echo %time%' N% { T* m" q% C( A7 O
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到% z( _9 t$ ~& N5 |4 W8 F0 ?
?+ x0 f/ K6 h" @. J32 start
+ B; Y% {. N: X. P批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
) v9 s! w8 y7 ?; Y8 N" k0 c2 A
" o% v# S9 ]% H3 t- g33 call
' M, t2 r9 N4 j( A7 J3 H批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
/ U$ b9 v& L5 M8 X- W4 C* F5 T有时有的应用程序用start调用出错的,也可以call调用: x+ k7 M. k1 }1 B
2 G! q2 O1 c% }. `" k
34 choice (外部命令)
/ _% _3 V& |" N" c* ^+ f& J选择命令
$ J* `" z$ B; l. M9 x9 s让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……2 Q* L7 d$ U8 V" q
win98里是choice.com$ c* |) M5 Q0 s+ a# p
win2000pro里没有,可以从win98里拷过来
" m2 t1 U& y% S, I6 M0 d- Hwin2003里是choice.exe4 {3 D) y7 o+ M |
choice /N /C y /T 5 /D y>nul
- w9 R' k) }5 e延时5秒: C/ r; i0 e- @- g
0 Z* R! T7 J! ~# ? H" {$ W35 assoc 和 ftype! q1 n6 T+ m% \9 T) V' T
文件关联7 m0 {) ?/ ^, ~+ D/ Y+ ]% P; q
assoc 设置'文件扩展名'关联,关联到'文件类型'
; s N1 T- o9 Oftype 设置'文件类型'关联,关联到'执行程序和参数'/ N: _( j5 @ q/ T
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
0 H# C) a$ }+ ^4 J. T而是先判断.txt属于 txtfile '文件类型', W; L& m; e$ A' h& b! i5 U
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1- U+ e( E: r3 Q# a
可以在"文件夹选项"→"文件类型"里修改这2种关联' B0 P0 ]) v* f& x9 K* `
assoc #显示所有'文件扩展名'关联
* e) E8 x8 N6 m) J1 ^3 P, Oassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile# ?* T4 x& A* W1 P4 `7 R6 W
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8+ J- K; ]& O. I ^' L
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
% `4 }* [) q( X: z) _ftype #显示所有'文件类型'关联
# h' b7 D% I( j* Z h" O! p' q! ^/ kftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*& ^( ?0 E& r' C5 R
assoc .txt=Word.Document.8
9 y$ G7 x& f; U O4 A: @0 W J- f设置.txt为word类型的文档,可以看到.txt文件的图标都变了
! F/ X' Q% b$ i1 u* a! f, X' B ]6 Zassoc .txt=txtfile
% s+ z' F h J7 v; M恢复.txt的正确关联( N" l5 U5 U7 @! ^* \0 M
ftype exefile="%1" %*
+ B# n; W! @/ |5 W恢复 exefile 的正确关联
% ^0 t* w0 s( V p* t" l/ b/ U如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
0 Y7 P& c$ d8 l6 s
$ W% i& e, k5 |1 h36 pushd 和 popd3 {1 m0 L N- j- g5 S
切换当前目录5 G3 C' U1 R7 ^% p
@echo off
( r& C! t$ m) D7 U9 N7 Oc: & cd & md mp3 #在 C: 建立 mp3 文件夹' _% b9 Y" f8 [2 q
md d:mp4 #在 D: 建立 mp4 文件夹
5 z: |; E+ `4 s5 ycd /d d:mp4 #更改当前目录为 d:mp4
8 n2 B7 @. L( e) ~( Ypushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3
: g+ o& j4 M5 i/ F! Wpopd #恢复当前目录为刚才保存的 d:mp4% {# g# D$ J( n; y7 E* Z
# ^" O: g4 a0 {& J' w& q37 for
/ {. H+ f$ N: y0 W& y( w7 y& h循环命令5 y2 ^$ B8 k0 U3 H
这个比较复杂,请对照 for/? 来看# v& G) v& q+ Y' A# b( ~
for %%i in (c: d: e: f do echo %%i6 d# a3 M. d* e- R$ T' Q
依次调用小括号里的每个字符串,执行 do 后面的命令- f5 J& d( X" p% l% p2 W
注意%%i,在批处理中 for 语句调用参数用2个%
2 Q* F6 Z6 G/ B默认的字符串分隔符是"空格键","Tab键","回车键"6 e2 b8 e( j8 n* d
for %%i in (*.txt) do find "abc" %%i
: m, m1 d9 [8 T9 _ ~, R对当前目录里所有的txt文件执行 find 命令
" n- _2 e* E Q% ]* S$ Cfor /r . %%i in (*.txt) do find "abc" %%i
' S- [4 I7 E- Z在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行& K5 k6 |& c5 ^ z. I: W
for /r . %%i in (.) do echo %%~pni( `1 A, f( S% a/ M4 C
显示当前目录名和所有子目录名,包括路径,不包括盘符7 W$ u& h# B6 N% m2 N# U( y+ w
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
* M. G* R8 H" Q/ w: X' a% R/ k把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
4 s4 M9 {: K* d" x. T) E0 k6 d3 dfor /l %%i in (2,1,8) do echo %%i
0 H7 Q! r: V8 Y* x) r生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
7 d5 R( h& [& m& y) s3 wfor /f %%i in ('set') do echo %%i. f4 S$ z3 a+ |. r
对 set 命令的输出结果循环调用,每行一个
+ W) p) Y/ J% `8 o& T% \for /f "eol=P" %%i in ('set') do echo %%i9 p0 {0 t9 X8 |0 T, h6 t# G
取 set 命令的输出结果,忽略以 P 开头的那几行
4 @* D' c. `$ Y6 C. Y8 b% V7 kfor /f %%i in (d:mp3.txt) do echo %%i1 x. N! \, s; i; @, ~4 ~1 Y
显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称' T4 f2 @" x4 x+ O
for /f "delims=" %%i in (d:mp3.txt) do echo %%i
' f' z. O% N3 b: R显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
2 F" X) e: w2 e9 {0 k9 J- J9 ^) A# Hfor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a
- M' H( z. e+ | G/ Z对 dir 命令的结果,跳过前面5行,余下的每行取第4列0 r) @4 N, l$ ]! }5 j/ t. T, v
每列之间的分隔符为默认的"空格"
5 E" G; T+ } L& t/ q可以注意到 dir 命令输出的前5行是没有文件名的
7 u0 c5 A7 D8 x4 Gfor /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (5 e! G, j0 e& |3 s* Z
echo %%a
7 b" ~4 Z# K4 i& Zecho %%b( r* L& n. J. B2 h3 K! N7 }# r6 F
echo %%c
. j; x: m u; ^0 X; z) \! u6 D& N* J" w+ B% K
对 date /t 的输出结果,每行取1、2、3列# P; x1 \# }: _( N
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列4 \) C+ `8 J0 m
分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
; L# k5 w+ I; [, R; R8 C+ r其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的; L% l) E: z7 ]: b$ \
for /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b
. }/ K+ e$ }! G9 S# b. _取第2列给 %%a ,其后的列都给 %%b
; y) M: o5 k% f% N3 q5 G9 o# r: v& _0 j% u' E6 C( }
38 subst (外部命令)
+ G, p. V5 J; G+ F. `; ], K8 }映射磁盘。
0 M6 _. A/ h# c" E+ `7 A/ u! fsubst z: serverd #这样输入z:就可以访问serverd了
! z3 c" c9 L* x9 v" @1 K0 o8 ~subst z: /d #取消该映射
; } h* r/ g7 s! `( ^, U) osubst #显示目前所有的映时
6 f b' B/ M+ P+ D% Y- Q8 n, A
( S- x, }1 n w! ^9 t; Q9 U1 H39 xcopy (外部命令)' G& C, v* j/ S- u6 y) e' t; M X2 A
文件拷贝( O5 p* ~ }2 b/ b) u& h% l
xcopy d:mp3 e:mp3 /s/e/i/y( Y4 R( {7 Z: J! X1 r0 k
复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
" @; c3 t% b$ v4 s2 W加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
3 a& L& E1 \7 R9 R! o) @; f( m) T8 M; s' q
常见问题:- 1.如果你自己编写的.bat文件,双击打开,出现闪退
7 S$ Z( ?3 i, {4 S- J6 R) g3 i- 原因:执行速度很快,执行完之后,自行关闭
- 解决办法:在最后面一行加上 pause
- 例如:+ C( ~8 T! C0 [ K
: x( {+ d, g' D( E( q: W$ D) c
@echo off5 g1 P# P3 g4 |: t6 U' r
set p=aaa
" X, e5 t L3 s) V9 [! S- P4 X3 H sif %p%==aaa (+ w5 A& [$ w- a
echo %p%
; x g/ ^1 a4 @5 K0 B! fset p=bbb' z7 w$ Q* P" O
echo %p%
6 \& J$ r/ ]. B% g6 g)
' r9 t9 o6 k; O+ L8 n; z7 F8 Gpause , n) n% J% r7 g- [& G
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|