扫一扫,微信登陆

 青浦修电脑 青浦笔记本维修 青浦手机维修 青浦电器维修

搜索
查看: 1642|回复: 0

Windows批处理(cmd/bat)常用命令教程

[复制链接]

307

主题

335

帖子

1899

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1899
QQ
发表于 2021-6-25 19:48:12 | 显示全部楼层 |阅读模式
Windows批处理(cmd/bat)常用命令教程
简单详细,建议收藏
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
  • 2.批处理.bat 文件中输出中文乱码
  • 解决方法在文章末尾!4 \5 q! b% q( b# O% m; i. i2 I: c
前言
  • 批处理文件(batch file)包含一系列 DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工作时尤其有效
    " z2 N+ X1 L( L1 c
在Windows中善用批处理可以简化很多重复工作
什么是批处理?
  • 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理。批处理文件的扩展
    % C5 V! T8 N+ x; [  p+ W+ G名为bat
  • 目前比较常见 的批处理包含两类:
    . I. t2 n* |1 q8 u$ T
    • DOS批处理和PS批处理。
    • PS批处理是基于强大的图片编辑软件
    • Photoshop的,用来批量处理图片的脚本;
    • 而DOS批处理则是基于DOS命令的,用来自动地批量地执行
    • DOS命令以实现特定操作的脚本。这里要讲的就是DOS批处理
      & B0 g; z2 v9 ~  {0 U
  • 批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的' `! y; b2 }6 B0 Z2 u4 X
    命令解释器(通常是COMMAND.COM或者CMD.EXE)解释运行
  • 批处理类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件

    8 @/ n4 B5 D8 x5 o* d; Z
怎么创建批处理文件?
  • 批处理文件,或称为批处理程序,是由一条条的DOS命令组成的普通文本文件,可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。在“命令提示”下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe运行该批处理程序
  • 一般情况下,每条命令占据一行
  • 当然也可以将多条命令用特定符号(如:&、&&、|、||等)分隔后写入同一行中
  • 还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出& D5 T6 z. F) l" W0 H
批处理命令简介
  • echo
  • rem
  • pause
  • call
  • start
  • goto
  • set
    / v& W. J4 B2 s
批处理常用命令总结批处理符号简介
  • 回显屏蔽 @
  • 重定向1 >与>>
  • 重定向2 <
  • 管道符号 |
  • 转义符 ^
  • 逻辑命令符包括:&、&&、||
    " ]; w, o9 [( W* x$ a% _
常用DOS命令
  • 文件夹管理:7 B2 V+ n) L  z5 T0 X
    • cd 显示当前目录名或改变当前目录。
    • md 创建目录。
    • rd 删除一个目录。
    • dir 显示目录中的文件和子目录列表。
    • tree 以图形显示驱动器或路径的文件夹结构。
    • path 为可执行文件显示或设置一个搜索路径。
    • xcopy 复制文件和目录树。& p$ Q2 f& ^5 V* x2 q0 S' k
  • 文件管理:
    $ I, j$ Z6 p: O# U; A; }3 a. I
    • type 显示文本文件的内容。
    • copy 将一份或多份文件复制到另一个位置。
    • del 删除一个或数个文件。
    • move 移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
    • ren 重命名文件。
    • replace 替换文件。
    • attrib 显示或更改文件属性。
    • find 搜索字符串。
    • fc 比较两个文件或两个文件集并显示它们之间的不同$ ]. P9 r8 F4 h  O
  • 网络命令:
    , R4 ]' Q5 k. B$ V5 Z/ u
    • ping 进行网络连接测试、名称解析
    • ftp 文件传输
    • net 网络命令集及用户管理
    • telnet 远程登陆
    • ipconfig显示、修改TCP/IP设置
    • msg 给用户发送消息
    • arp 显示、修改局域网的IP地址-物理地址映射列表
      - d$ w2 c4 K( D1 H
  • 系统管理:
    - o1 c1 r( h, R; ~
    • at 安排在特定日期和时间运行命令和程序
    • shutdown立即或定时关机或重启
    • tskill 结束进程
    • taskkill结束进程(比tskill高级,但WinXPHome版中无该命令)
    • tasklist显示进程列表(Windows XP Home Edition中没有)
    • sc 系统服务设置与控制
    • reg 注册表控制台工具
    • powercfg控制系统上的电源设置
      5 }  `) Y: F3 u3 h/ o
    ! [7 [/ E  r5 Z- F# C5 D
对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?
( k2 S8 V, E( m; z1 Q9 O- i3 V# x
0 s  u( T1 }& p/ y; r8 K* x
Windows Batch 常用命令
! W# x( l/ ~* E- D" F+ \1 echo 和 @
4 w; d* S6 G9 m. v! N( l回显命令/ T# d: _0 l- B" L3 h  N$ {, I) p9 S
@  #关闭单行回显! |& G! W+ h& ~5 u# i3 ~
echo off  #从下一行开始关闭回显- i2 X( s* E5 U
@echo off  #从本行开始关闭回显。一般批处理第一行都是这个
7 V1 K$ ]8 s$ f4 G: V' yecho on #从下一行开始打开回显
# C9 C7 _' k( j7 L* B) }echo #显示当前是 echo off 状态还是 echo on 状态% S2 w# q4 o* B. F
echo. #输出一个”回车换行”,空白行; y# D/ t* t  s" Y& P1 [
#(同echo, echo; echo+ echo[ echo] echo/ echo)
4 [6 A0 m9 U7 V  z7 J1 p1 X. Y+ Q8 j' D; e$ T9 J  f0 V% o5 V
2 errorlevel
; p1 ~& U2 f( `6 F; Decho %errorlevel%
+ M. ~! M6 Q$ @2 j% K6 Z每个命令运行结束,可以用这个命令行格式查看返回码' k" G! y: \+ T' c, `* O+ V
默认值为0,一般命令执行出错会设 errorlevel 为1
6 O9 k. d$ G, {# s+ Z  c, }9 Q% A" K9 j( A7 Z  K9 e
3 dir
) e# ~, X1 Z6 v7 [- I6 t  B显示文件夹内容
; @, L- U" g% A* l3 K# Ddir #显示当前目录中的文件和子目录& N& T# A- F# K9 b- L. G) _, x
dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件! k$ @8 e/ q+ b9 S. |
dir c: /a:d #显示 C 盘当前目录中的目录2 {2 e3 N9 B7 \3 J" {
dir c: /a:-d #显示 C 盘根目录中的文件
0 J% S. Z( _6 w7 adir c: /b/p #/b只显示文件名,/p分页显示
; I; H) b1 X7 edir *.exe /s #显示当前目录和子目录里所有的.exe文件7 d4 Y) |+ w0 t9 n8 T

$ x- ^) o; v1 K! @4 cd0 x3 y& D2 ~7 g7 w3 T0 i1 `4 {
切换目录/ o7 g5 w. W9 v1 S. V/ C
cd #进入根目录( k- R0 U  k' [" }6 \$ |
cd #显示当前目录! E7 B6 ^6 c9 f/ t' u0 _  @
cd /d d:sdk #可以同时更改盘符和目录( w9 u, f. o1 v5 E! y( G; S
, b% J0 ~$ z/ N+ u
5 md& y- {3 a1 `* @; N
创建目录
4 I& a3 p% S* v$ R8 ]# ]3 omd d:abc #如果 d:a 不存在,将会自动创建中级目录
# g1 B: _  c% Z/ f0 k  q' e- Z; ~$ H#如果命令扩展名被停用,则需要键入 mkdir abc* c) S- ~, x) ]% s
. X! g4 d* [& c
6 rd
. \6 p$ K& z1 f3 E1 O% F删除目录
/ }  w% b+ g: ]0 rrd abc #删除当前目录里的 abc 子目录,要求为空目录
# p/ Z9 O( }# y8 P" Lrd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,/q安静模式( a' O7 k6 ]8 [
" Q9 l4 c. t. p* X
7 del. N" L+ e# f& E
删除文件8 G8 N- M. r  K: \2 u! {* ]
del d:test.txt #删除指定文件,不能是隐藏、系统、只读文件
& E9 S3 M1 o+ b' B6 w, ~9 c3 B$ sdel /q/a/f d:temp*.*
" i6 R0 O8 K# k. ~删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
1 J" _1 S( h/ ^+ pdel /q/a/f/s d:temp*.*  I$ i0 v5 A/ Y2 i
删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
/ }: C; W, K, i- |
/ n8 d5 {  d) H% }3 D& t8 ren
  M4 Q; |' u6 H& i  c" t重命名命令
# q% G8 b5 q0 V3 q' Aren d:temp tmp #支持对文件夹的重命名# E& {  X$ S, f# E

" ^8 \" X- s3 _3 ^7 `. i# a9 cls2 n1 T1 ?; N& n4 _  n* @! o
清屏9 c+ [' C/ X! q8 i0 f4 U$ w
10 type
+ {8 \, L1 Z0 {5 f- q  m+ M" U) C2 f显示文件内容
  \& a5 e1 {4 o' g+ X* _type c:boot.ini #显示指定文件的内容,程序文件一般会显示乱码* v8 [5 ^5 ^* v. m- X( T: H
type *.txt #显示当前目录里所有.txt文件的内容
: P3 E: h  z; X' \3 g2 P% g9 j4 e9 O% p7 N$ j, u
11 copy  t" K, G# |  }2 |
拷贝文件0 t1 g/ i( T( l8 B2 @
copy c:test.txt d:test.bak0 N- Z; Z# a6 M8 Q5 }( W
复制 c:test.txt 文件到 d: ,并重命名为 test.bak
" S- V- ]2 F2 H: i4 P% bcopy con test.txt
! ~# X: Y% s; X( I从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件
. m: P$ {1 h$ N1 k, m* g$ Vcon代表屏幕,prn代表打印机,nul代表空设备; E  S4 b- x) v5 ]+ v9 I
copy 1.txt + 2.txt 3.txt- n8 e! g, d/ B+ M$ N9 O' {
合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件
1 T% g4 t! z- |% ~0 u  X如果不指定 3.txt ,则保存到 1.txt
% i) Y. k5 E$ c1 X$ `* fcopy test.txt +: M* s! C6 b  b* l- O7 f  q7 u0 t
复制文件到自己,实际上是修改了文件日期7 v) g$ U5 S* ]5 b' j
' w* w' Y- k6 m" g5 I% t
12 title
' }7 ]: S% {4 {% D设置cmd窗口的标题' }+ c, Z* y4 }, f+ m
title 新标题 #可以看到cmd窗口的标题栏变了* q/ N, w2 Z2 Z8 |0 ~

0 D1 k7 z* n9 G3 I5 B13 ver4 n4 L) d: f. U! Z* m- n
显示系统版本
% D9 L: Y1 B5 C( ~2 e- g5 r1 n* o0 s4 J$ z, N' i
14 label 和 vol, ~6 C' X6 R: L
设置卷标
/ l! E: m' _2 K8 T. X" rvol #显示卷标% v% k% w- f, e* u
label #显示卷标,同时提示输入新卷标/ r$ E1 l; v  n8 J, V- q) Z  R; G
label c:system #设置C盘的卷标为 system8 \3 B- L  E# Z) }# Y
7 Z" P2 x2 g% `- g
15 pause
8 r/ [3 i' D2 S. l0 @# F暂停命令
) {- O1 b, y/ j$ Q8 h5 R
  i: M1 S6 T6 W% v8 Z! Y; U16 rem 和 ::$ o2 S6 R; M1 H  h$ C
注释命令
" o8 D& h5 T. p+ H/ J1 V0 N注释行不执行操作
! l8 {$ B) P9 d5 T9 O) i9 C# R, }5 M% ]
17 date 和 time5 W' @+ p& k; _. c4 {1 B; M, D
日期和时间4 w7 s5 M. Z, Z- I% |
date #显示当前日期,并提示输入新日期,按"回车"略过输入( m7 D3 x" V" a
date/t #只显示当前日期,不提示输入新日期
+ O/ I4 o* ~; @& T1 ttime #显示当前时间,并提示输入新时间,按"回车"略过输入& U  f6 j# l6 ?' p
time/t #只显示当前时间,不提示输入新时间
% |# s5 x; N6 X( T) s- F& k6 Q9 L
18 goto 和 :/ x" w+ u9 Y6 Z) ~
跳转命令
4 E5 c6 z4 d2 s+ x:label #行首为:表示该行是标签行,标签行不执行操作4 l7 J$ h) C. i
goto label #跳转到指定的标签那一行
) K- x7 N) r7 x
" u3 P7 Y) T! f3 k( q4 g19 find (外部命令)
9 ^( F& i+ S- |查找命令, R- z8 F4 V! I6 ?$ Q2 h
find "abc" c:test.txt7 S5 j6 I6 {% n6 V5 j
在 c:test.txt 文件里查找含 abc 字符串的行: H- a" D1 C. n: W
如果找不到,将设 errorlevel 返回码为17 D' a& t8 N3 [/ \8 t- [6 C$ E
find /i “abc” c:test.txt3 I) d/ F: J. w
查找含 abc 的行,忽略大小写
3 |' y1 A7 n& m" N" ^find /c "abc" c:test.txt
. R* E; N, M! @7 g" {, {% P显示含 abc 的行的行数
. Z/ e% d0 R" C* O" A+ {% H8 M3 G2 w4 X9 W; _! }6 E
20 more (外部命令)
8 I7 o; X2 s+ X* b逐屏显示
7 L0 @, N8 q+ J8 n8 Xmore c:test.txt #逐屏显示 c:test.txt 的文件内容' H) Z2 P. f; T9 A
# o7 v* H  z. P4 L' k. M- m
21 tree
" x3 K7 K3 H3 s2 W5 V! O; Y显示目录结构3 `, [2 _% ~/ B2 `
tree d: #显示D盘的文件目录结构
2 r1 L/ W& W' q
, v5 [2 x7 }7 ^* v3 P) s& R" t2 o22 &1 g# A2 S" B6 m5 ?# E
顺序执行多条命令,而不管命令是否执行成功- h% {4 w- g8 T9 R: X

  j' Z6 D* n. o0 B23 &&
9 k3 p5 K0 h5 S6 j# `! ~# e顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令3 ?0 i# N. @4 C; y/ V3 L* W
find "ok" c:test.txt && echo 成功
8 p  O; j: ^4 C  D如果找到了"ok"字样,就显示"成功",找不到就不显示/ m- `# @% L6 o: l2 q1 C
! C0 }; Q6 Q: X! H% {
24 ||
1 ?8 e. M8 e7 [$ F顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
! n/ W3 W# s& p8 Qfind "ok" c:test.txt || echo 不成功8 C. e# v6 m6 d$ Z# ?3 Q5 z
如果找不到"ok"字样,就显示"不成功",找到了就不显示
) }1 d% x% B. i0 T* W# V! c' Q" j$ @: z. k) i! ~& h" ~: P
25 |
: _! W7 F% G4 F! j! d: ?% P管道命令( A+ n- i+ i3 T- ?/ Y% R
dir *.* /s/a | find /c ".exe"* Z% \3 ~& e; t/ [; H; q. i3 E
管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令; ?# ?8 i; }! ~( U3 r9 g
该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数: ]- n% q$ q& k9 b5 u) r1 A
type c:test.txt|more! w1 Y. {$ x. M* P/ y& h8 B
这个和 more c:test.txt 的效果是一样的4 G; {' Y$ W; ^+ b
  h* W! J9 V* y. b
26 > 和 >>
1 @( B2 W; K  \4 u9 a输出重定向命令* d5 V  |4 n: D! P
> 清除文件中原有的内容后再写入
0 ]" I, |2 c( ~: l, W4 e>> 追加内容到文件末尾,而不会清除原有的内容
! `- x* u& }$ I6 C1 b# g1 {主要将本来显示在屏幕上的内容输出到指定文件中
( N2 J  j. M* s0 J指定文件如果不存在,则自动生成该文件) Q: t8 h' d0 z4 d7 @  M
type c:test.txt >prn
3 G. |; c5 k/ ]# a' `屏幕上不显示文件内容,转向输出到打印机  n+ ^- g, t# z4 [  u
echo hello world>con
& ^6 |* B- U8 q1 C在屏幕上显示hello world,实际上所有输出都是默认 >con 的7 V9 R* e4 y' k* h9 g
copy c:test.txt f: >nul$ n* [* M5 }: v2 p. v* T
拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息
( T) O8 O- ^# J, m) F) m% fcopy c:test.txt f: >nul 2>nul
' g5 K9 F: h) d% ~2 L+ W- f不显示”文件复制成功”的提示信息,并且f盘不存在的话,也不显示错误提示信息* T& Y0 l3 h9 f' B
echo ^^W ^> ^W>c:test.txt
5 Z3 v5 r7 }3 c: @0 D生成的文件内容为 ^W > W
5 D+ U: Y" k' P& [0 z# p' y' H^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号4 I2 \) Q- ~8 c' S( }
% y+ A8 N- J8 T4 j$ a) S
27 <! r. @: m& I3 R' v# S
从文件中获得输入信息,而不是从屏幕上
% E' G" H  V# `" R一般用于 date time label 等需要等待输入的命令
% ?+ q7 S6 t6 ~* i+ h. O@echo off; X" g  o* P/ I; |
echo 2005-05-01>temp.txt
' _9 g1 F) G, i) z- |date <temp.txt  f2 V  j; F1 h+ A! s6 h, C  |
del temp.txt
0 A6 p; s8 H( {  T: B  j  q这样就可以不等待输入直接修改当前日期
3 t0 k; i. p: b, N8 L, e& L+ w0 w1 O- L- N- p' r- ^+ W. k& e
28 %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*$ a5 Y$ V) d# J+ ^* D: w' _3 y
命令行传递给批处理的参数. ^  [) h$ y2 R
%0 批处理文件本身, `5 q! E, ?' x. R5 G, L
%1 第一个参数
. k* n6 ~% d% l& b3 B/ ]% ?%9 第九个参数8 ], h& z9 @& S2 d) f; U* C
%* 从第一个参数开始的所有参数: j/ H# B: G  x) `
批参数(%n)的替代已被增强。您可以使用以下语法:- v6 f8 w' v- `1 W# y. g
%~1 - 删除引号(" ), 扩充 %1
7 B4 s* G7 \1 S! M%~f1 - 将 %1 扩充到一个完全合格的路径名2 `) S3 w  Y2 Q/ c. i! T
%~d1 - 仅将 %1 扩充到一个驱动器号$ u. |0 \( n$ K
%~p1 - 仅将 %1 扩充到一个路径2 I$ l% k8 W) E
%~n1 - 仅将 %1 扩充到一个文件名
0 U" x+ a$ K; ^+ e+ x%~x1 - 仅将 %1 扩充到一个文件扩展名$ p; L- k6 }6 e4 [* A- u. \' |
%~s1 - 扩充的路径指含有短名
5 ~1 f- p9 A4 ?* ^& \8 `* g+ c$ r%~a1 - 将 %1 扩充到文件属性
2 P% P1 v# `' N) J%~t1 - 将 %1 扩充到文件的日期/时间
: P& S0 E1 i! P3 w$ j5 r. G%~z1 - 将 %1 扩充到文件的大小
! ^# U$ @  F2 l3 Y) \6 r%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1# w. w. I* _: {
扩充到找到的第一个完全合格的名称。如果环境
) A# d6 Y$ A$ F- I: Z变量名未被定义,或者没有找到文件,此组合键会8 S8 b/ Z8 _" k/ X+ ~$ E+ k
扩充到空字符串, ~  C  N& ]% }. S* B
可以组合修定符来取得多重结果:
) J: O& l9 k5 K, y& {%~dp1 - 只将 %1 扩展到驱动器号和路径
5 i0 v# W- g; Z& _+ K%~nx1 - 只将 %1 扩展到文件名和扩展名
# r! h+ [: M" M* |) s1 W%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
" ^! N1 @$ D# ^* F: K$ F并扩展到找到的第一个文件的驱动器号和路径。8 [: b- Q3 r8 ^2 @) h+ \
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
: a% O* Z, J  m0 C8 m可以参照 call/? 或 for/? 看出每个参数的含意/ j- n2 u' J9 T- c
echo load "%%1" "%%2">c:test.txt
9 g5 w$ {5 ~2 t# q3 `生成的文件内容为 load "%1"  "%2"* C6 s+ s* e6 `7 f% M7 a
批处理文件里,用这个格式把命令行参数输出到文件
) s+ D3 v& @- ^1 U
% ?% z3 j, A) Z29 if
+ Z9 Q2 J, j* L3 V判断命令# b  V  {, O3 C* K5 y9 R
if "%1"=="/a" echo 第一个参数是/a
' e0 ?; Q  w+ Mif /i "%1" equ "/a" echo 第一个参数是/a
2 g( u# G& e* z6 k4 |( }0 K/i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if/?
" l2 |' _- U2 }* @if exist c:test.bat echo 存在c:test.bat文件3 N& ]2 ~4 {8 y% `4 ~: P+ r! v
if not exist c:windows (
' |% `* M( G5 V; @1 m! ]echo 不存在c:windows文件夹' ~, B0 ^" h, d+ [! s7 g& e
)
4 C0 X! T' \+ A/ Kif exist c:test.bat (% T) w0 m( m3 A! }
echo 存在c:test.bat- g  Y$ S, r& N3 |3 o# x" {
) else (8 O9 y' c/ N- Z) ?3 y
echo 不存在c:test.bat! C6 S* A9 R6 T! A7 ~" M
)
6 v1 \  X6 G& F% ?7 T3 Y30 setlocal 和 endlocal' z( U6 P& H( \+ ^
设置”命令扩展名”和”延缓环境变量扩充”
& l$ {  [$ \7 X; b. A& t% m9 |SETLOCAL ENABLEEXTENSIONS #启用"命令扩展名"( ^1 S; F" P0 x) n
SETLOCAL DISABLEEXTENSIONS #停用"命令扩展名"
  Z5 T: x/ G. k: K: k# G  USETLOCAL ENABLEDELAYEDEXPANSION #启用"延缓环境变量扩充"
  n7 e7 s2 ]* }$ K: ]$ m7 C4 |SETLOCAL DISABLEDELAYEDEXPANSION #停用"延缓环境变量扩充"
4 @: t& h: v; n& S+ x2 lENDLOCAL #恢复到使用SETLOCAL语句以前的状态
' `/ _  I& j& U% c! u/ g“命令扩展名”默认为启用, ~  U- V# E8 B! x, x/ E1 z5 J
“延缓环境变量扩充”默认为停用
$ ]  U; x2 U! P& a6 u批处理结束系统会自动恢复默认值7 B( ?, z, _4 X
可以修改注册表以禁用"命令扩展名",详见 cmd /? 。所以用到"命令扩展名"的程
1 m' l. r( i- ?6 y  c# W序,建议在开头和结尾加上 SETLOCAL ENABLEEXTENSIONS 和 ENDLOCAL 语句,以确
2 p- ]1 s8 T" `% }保程序能在其它系统上正确运行
* I9 f2 @: Q; U& L6 t3 y8 u"延缓环境变量扩充"主要用于 if 和 for 的符合语句,在 set 的说明里有其实用例程' b8 B6 [/ y2 `6 p; v/ t, u
* t/ @+ M9 X7 B2 _0 Z
31 set
9 Y& y" g9 t" P; P8 t+ g% S设置变量
( C2 k4 E6 X' v, }1 u引用变量可在变量名前后加 % ,即 %变量名%+ ~9 p& H& V9 k: K1 O
set #显示目前所有可用的变量,包括系统变量和自定义的变量# n) L2 v4 C) V& i
echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用5 M' m8 M  ~0 f. i5 f
set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1* T3 x8 Q0 c1 C  M
set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2
% J" \6 n/ G. U5 J. wecho %p% #显示变量p代表的字符串,即aa1bb1aa2bb2
! y- [# q6 Y  y1 g3 e* f' Hecho %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2
7 \! [$ p7 m& k3 [: o- Vecho %p:~6,3% #显示第6个字符以后的3个字符,即aa2
# h% d. e+ \+ @0 |; J6 u3 `( M# w# techo %p:~0,3% #显示前3个字符,即aa11 ~' v+ Z( G$ w
echo %p:~-2% #显示最后面的2个字符,即b22 S) F6 B, @) i; d/ d; [& `
echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b
0 j% `- }; v8 W4 [2 e8 E1 Secho %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2
6 }( ?+ D% e8 M7 h4 R8 }, E0 lecho %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb28 i% g8 ^2 k1 j& n6 h  i% O% r
echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb20 g. q# N5 O1 {
set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2
! K3 d2 @* R1 \! Mset /a p=39 #设置p为数值型变量,值为39
6 @9 r4 @, j7 I' X. |# |set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3
* I* Q6 T7 }4 b  j# gset /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用' x( H5 ]' ~- X9 H( Y
set /a p=”1&0″ #”与”运算,要加引号。其它支持的运算符参见set/?* V( B) h0 }. D* g. ^
set p= #取消p变量$ I. k5 Y$ D+ |* |1 u+ d5 ?- d7 ^+ O4 g
set /p p=请输入( n  E1 n7 N# @2 }5 _0 W3 `
屏幕上显示”请输入”,并会将输入的字符串赋值给变量p" x$ T; n( ^+ g- H+ M2 J2 M
注意这条可以用来取代 choice 命令
+ M0 W. L6 _4 ?3 X. h& w% c注意变量在 if 和 for 的复合语句里是一次性全部替换的,如
- e4 `1 Y1 H6 }: ]% C8 T  n4 E@echo off
# o$ Z- r3 [$ l$ b9 H# D8 k1 sset p=aaa
; E' L6 _. P5 ]! D( S  D( i/ ^6 O* }if %p%==aaa (
( b8 [" G& s6 x1 F6 C$ Techo %p%
$ D3 J' l1 }1 y, t1 wset p=bbb
) z+ E9 ^- d" W9 ]6 @; Vecho %p%8 A) C( v: _( X+ p$ v2 l' a0 w0 c
)% U1 K2 p4 U, b/ s6 ?, q' b
结果将显示+ _9 I; F: E$ |( k/ K2 H1 i! E
aaa' C5 Q1 K: t. w7 {: B3 u& F" M
aaa
1 R8 d( H# {# b- y4 P因为在读取 if 语句时已经将所有 %p% 替换为aaa' z5 O) V, e! P4 D& y! P7 O& z/ P
这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"# \7 z( V, p+ K7 f5 J0 p) I) r
可以启用”延缓环境变量扩充”,用 ! 来引用变量,即 !变量名!
8 G& \) R  o9 p@echo off( T/ A( @9 N  J+ w4 F4 ~, Z
SETLOCAL ENABLEDELAYEDEXPANSION
5 ^. f4 n0 R! ]& X- ]set p=aaa$ c+ y, E" q  f
if %p%==aaa (% X) z  E+ F! n- p5 M
echo %p%% C' ?) Y: y( m$ v- {6 X" d
set p=bbb
! l( s. v, v2 `1 U8 ^1 {echo !p!) K# g, ]$ |' }3 C. K; L% _- T
)
! F8 W- n* z8 E+ K9 XENDLOCAL6 {, J$ [' K+ h9 z5 ]
结果将显示
% d: _1 b9 ?$ q/ v' G5 |aaa3 v: d0 V+ i% x3 g) E
bbb
8 c" S4 h' r$ L- A- s. ^& M还有几个动态变量,运行 set 看不到) {- a% P2 M3 d& s
%CD% #代表当前目录的字符串
  _  d  N% z3 U5 ~% d/ N%DATE% #当前日期
2 J4 d/ ~: A* U$ C+ n%TIME% #当前时间) v1 p: B% ?* T) T4 Y
%RANDOM% #随机整数,介于0~32767/ k  k: T! K9 R+ F9 L
%ERRORLEVEL% #当前 ERRORLEVEL 值
$ K1 O( e) F9 G1 e; o) |- p%CMDEXTVERSION% #当前命令处理器扩展名版本号9 l# Q) K. e2 [4 ?
%CMDCMDLINE% #调用命令处理器的原始命令行9 F) }, j; g1 Q7 O) g0 S; D
可以用echo命令查看每个变量值,如 echo %time%7 d" {6 d# K. v$ I, j7 ?, L" F
注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到
; r$ z0 F0 q7 A  \" g5 a; _0 a$ b0 @6 ~, ~9 h) }/ H) W
32 start$ I+ ]% k2 O. a' P0 z
批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令
; c/ D- v( D) J. _
7 q  _) u% e4 |* `' F33 call  k$ Z8 V5 q. y* X
批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行
/ {! [; e) w/ ?有时有的应用程序用start调用出错的,也可以call调用
! Y- p7 a# l1 w7 l6 |: g& o5 \8 Y' z" @: P1 G. `/ O
34 choice (外部命令)9 D; }7 U5 J4 R5 M  h. a9 F
选择命令
+ ~; q, o) R4 J& s让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……' r+ t" h* _( M) b' m6 `
win98里是choice.com5 y+ y' M* x* N2 z7 x7 |2 j
win2000pro里没有,可以从win98里拷过来% J4 i, D9 d" R7 a
win2003里是choice.exe
" e0 @. i, C& u+ i. Lchoice /N /C y /T 5 /D y>nul# C2 k* E# A, t; b8 R3 [4 J) N
延时5秒
$ X& J# z/ V* K. g
3 j& r( ]& D1 B  a4 @4 _8 E. f! a2 a35 assoc 和 ftype
& ?' F1 K  s1 {# Z9 A& Y  l文件关联
: y6 \: K4 [8 u  B6 jassoc 设置'文件扩展名'关联,关联到'文件类型'1 X2 V5 A& B$ O, [* j6 j: b1 n
ftype 设置'文件类型'关联,关联到'执行程序和参数'4 ]& Q" o% B# ~! p; R* W
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
  c" U4 H+ A; R0 W/ I; V而是先判断.txt属于 txtfile '文件类型'
  D) }/ R* t; a0 b再调用 txtfile 关联的命令行 txtfile=%SystemRoot%system32NOTEPAD.EXE %1
, l& W! e9 S4 X可以在"文件夹选项"→"文件类型"里修改这2种关联: W  L1 A. Z  j+ B! _
assoc #显示所有'文件扩展名'关联
5 [, c3 s5 f) k6 G( J' o/ `) Jassoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
: G' _# ^# r* a- Y' Y/ C8 ]assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
5 u% `5 q+ h+ {assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
$ M0 ?0 T- v* L! z- W" Uftype #显示所有'文件类型'关联
& k) z: v4 h) }ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
, Q4 c2 C: E7 \1 q& Fassoc .txt=Word.Document.8
% h5 Z/ S$ R9 V1 e, L$ x设置.txt为word类型的文档,可以看到.txt文件的图标都变了3 M% c: w6 @' J" [2 P3 T1 m
assoc .txt=txtfile6 ?, j3 u' V; \% W: g( ~; U5 }
恢复.txt的正确关联+ C- h* T8 [( K, w
ftype exefile="%1" %*
: a0 }" N/ j' Q恢复 exefile 的正确关联
, Z# M; d/ v5 @/ L6 Z' y如果该关联已经被破坏,可以运行 command.com ,再输入这条命令( W% H1 F" Z$ F  z) o  b
' }# }; E1 k$ D  A, d1 ?9 h
36 pushd 和 popd
8 B9 k1 y' }* B7 A$ F/ c& b切换当前目录+ d3 Z! g, a2 Q6 F, P
@echo off
0 L5 c. }6 r9 }: Qc: & cd & md mp3 #在 C: 建立 mp3 文件夹
- n7 [! G* d5 m" cmd d:mp4 #在 D: 建立 mp4 文件夹
1 z0 a' k$ O, Qcd /d d:mp4 #更改当前目录为 d:mp4: K) p$ _: H. N9 L& Z8 W
pushd c:mp3 #保存当前目录,并切换当前目录为 c:mp3( C* c, b& ^  ?5 H3 f5 J
popd #恢复当前目录为刚才保存的 d:mp4
# s1 U3 a  y* G2 P& C
  x$ i- y( L* p" K. ?37 for! k: Y" D( e/ }( C7 e- S0 P4 n% b
循环命令) n! m% H% q, z  c
这个比较复杂,请对照 for/? 来看
; z; E) Q8 Z3 c* C+ @+ z4 i* Efor %%i in (c: d: e: f do echo %%i
% k7 i! U$ d! b' E, Q依次调用小括号里的每个字符串,执行 do 后面的命令8 N4 i: R7 S4 }5 [7 x  p6 F
注意%%i,在批处理中 for 语句调用参数用2个%
1 l& O4 a& S9 G* g# O默认的字符串分隔符是"空格键","Tab键","回车键"
2 x8 x' m( r+ W4 V' q/ Pfor %%i in (*.txt) do find "abc" %%i
- v- l8 D* Y8 `9 A* O对当前目录里所有的txt文件执行 find 命令$ @0 D# M8 [* `5 i4 t7 `4 o
for /r . %%i in (*.txt) do find "abc" %%i
( O3 Q5 q6 J  I3 X, C8 S9 N. j3 c在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行
9 P0 v; y7 E" f+ d* ?for /r . %%i in (.) do echo %%~pni
! g7 s8 E2 o# c& r; }- A( B3 Y  J显示当前目录名和所有子目录名,包括路径,不包括盘符% ?/ a- n7 N& v0 I& W- Q2 `
for /r d:mp3 %%i in (*.mp3) do echo %%i>>d:mp3.txt
4 I! v: D4 C) m+ I! X! n把 d:mp3 及其子目录里的mp3文件的文件名都存到 d:mp3.txt 里去
8 O4 e- s/ v  L. c( }for /l %%i in (2,1,8) do echo %%i
' [  ]* d+ }' d2 V4 K. q% P生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1
3 p. l( p+ u; w; l/ w4 {for /f %%i in ('set') do echo %%i  K3 n7 \3 |4 @+ P( H; q
对 set 命令的输出结果循环调用,每行一个1 P. E' M$ G' \. z& Q6 K3 f/ \" \
for /f "eol=P" %%i in ('set') do echo %%i/ }2 B6 k  `; K' Z0 P2 n! z! g1 D
取 set 命令的输出结果,忽略以 P 开头的那几行6 n; U- v" b; k  R& q, N" L  T
for /f %%i in (d:mp3.txt) do echo %%i
0 S) {: j" V7 ~4 |) V: t显示 d:mp3.txt 里的每个文件名,每行一个,不支持带空格的名称7 |7 i6 U7 C( e! d; u
for /f "delims=" %%i in (d:mp3.txt) do echo %%i
% {, K' K* ^5 R1 e显示 d:mp3.txt 里的每个文件名,每行一个,支持带空格的名称
, q0 O& |; K6 q* {# ifor /f "skip=5 tokens=4" %%a in ('dir') do echo %%a* D1 H3 Z/ B: m( _: x
对 dir 命令的结果,跳过前面5行,余下的每行取第4列
$ C+ Y, U1 A% I4 c, W+ O每列之间的分隔符为默认的"空格"
2 v1 G# [$ R7 h% E+ s# {) I! z可以注意到 dir 命令输出的前5行是没有文件名的0 h% |) _# r- ^1 {7 f, m
for /f "tokens=1,2,3 delims=- " %%a in ('date /t') do (
* z7 Q" ]; _5 O* |  D; L* }, c( Wecho %%a& |/ H/ i% E, P) |8 j) ^- z. g
echo %%b
* {& A; I, }5 Q# O0 Zecho %%c& o/ C6 a$ r( v. ]; u/ S
)' g, C8 {6 R5 V$ l% t! J
对 date /t 的输出结果,每行取1、2、3列$ e! Q, P9 q/ v; s  A/ a! w% H
第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列
' u/ ^! ~5 g* B' z1 J7 h分隔符指定为 - 和"空格",注意 delims=- 后面有个"空格"
* V/ t2 u! _/ L! n5 J其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的
! c7 \6 J* y# t' l  x9 e6 ifor /f "tokens=2* delims=- " %%a in ('date /t') do echo %%b7 X: D& V0 ~' j3 K: G& N6 A% S$ e
取第2列给 %%a ,其后的列都给 %%b# S& A6 f! Z: _/ q. w5 B( r' E; A* X
+ c: `6 X! t0 Y" D
38 subst (外部命令)& T. A, V8 |8 v
映射磁盘。* u8 t9 h8 O2 H1 j1 a! J
subst z: serverd #这样输入z:就可以访问serverd了# o$ C& ]. Z1 G+ h+ j
subst z: /d #取消该映射
& t* z3 s! H7 N' m# r+ @subst #显示目前所有的映时
6 M. g; d( ^1 Y! k4 o8 Q/ g- V! g
  H7 z% A+ l. {$ N. V5 j- z! r0 b; _39 xcopy (外部命令)
: ]  p) T+ e3 P7 Z0 R6 J6 J' D, D( Z. ~. f文件拷贝
% a2 G4 A; H" h5 Pxcopy d:mp3 e:mp3 /s/e/i/y
0 x) T3 q2 ^  U9 E3 G6 Y复制 d:mp3 文件夹、所有子文件夹和文件到 e: ,覆盖已有文件
" J; h- e9 Y2 v" h6 U/ q加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问
& g4 i! y& W; j; D; m  a' M6 X. J) M# N7 s# }0 o* w
常见问题:
  • 1.如果你自己编写的.bat文件,双击打开,出现闪退
    7 S) @7 B, v& b: _8 Z
    • 原因:执行速度很快,执行完之后,自行关闭
    • 解决办法:在最后面一行加上 pause
    • 例如:# R/ H' q  X2 m3 T6 s, y
    4 l& Q2 K8 f% }- `) E# E( }* E4 X
@echo off" O. m8 X: ?; o% L# q% d
set p=aaa4 G6 z, J0 p" i' N
if %p%==aaa (
; [+ f2 q7 k: h- q1 R  J1 ?echo %p%2 O  ^9 E0 x  I- G
set p=bbb% [; q7 w8 c; G5 {- u
echo %p%7 l6 U) Z  X7 W; o, z
)* ~  B. `$ [5 U
pause
  • 截图:6 Y8 h6 u  b7 g& p- ^* v7 @; }/ u
  • 2.批处理.bat 文件中输出中文乱码
    $ J5 C' `4 z) {" D! N
    • 原因:记事本新建的文件,编码不是 utf-8
    • 解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
    • 操作截图:
      5 `# C/ U$ P$ p# c) o
    • 效果截图:
      6 S. e: L2 y1 [
      5 Q  G1 o; L4 H% t+ r# y" j# J

    * W4 J2 b2 u" g2 d  y4 N- Y; d9 w

3 U+ D$ h* A2 x# v" W( |) R& }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
青浦海洋数码电脑城
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2001-2013 Comsenz Inc.Powered by Discuz!X3.4( 沪ICP备18024137号 )
快速回复 返回顶部 返回列表