BAT 语法

本贴最后更新于 1608 天前,其中的信息可能已经物是人非

BAT 文件语法和技巧(bat 文件的编写及使用)(转载一)

比较有用的东比较有用的东西
首先,批处理文件是一个文本文件,这个文件的每一行都是一条 DOS 命令(大部分时候就好象我们在 DOS 提示符下执行的命令行一样),你可以使用 DOS 下的 Edit 或者 Windows 的记事本(notepad)等任何文本文件编辑工具创建和修改批处理文件。

其次,批处理文件是一种简单的程序,可以通过条件语句(if)和流程控制语句(goto)来控制命令运行的流程,在批处理中也可以使用循环语句(for)来循环执行一条命令。当然,批处理文件的编程能力与 C 语言等编程语句比起来是十分有限的,也是十分不规范的。批处理的程序语句就是一条条的 DOS 命令(包括内部命令和外部命令),而批处理的能力主要取决于你所使用的命令。

第三,每个编写好的批处理文件都相当于一个 DOS 的外部命令,你可以把它所在的目录放到你的 DOS 搜索路径(path)中来使得它可以在任意位置运行。一个良好的习惯是在硬盘上建立一个 bat 或者 batch 目录(例如 C:\BATCH),然后将所有你编写的批处理文件放到该目录中,这样只要在 path 中设置上 c:\batch,你就可以在任意位置运行所有你编写的批处理程序。

第四,在 DOS 和 Win9x/Me 系统下,C:盘根目录下的 AUTOEXEC.BAT 批处理文件是自动运行批处理文件,每次系统启动时会自动运行该文件,你可以将系统每次启动时都要运行的命令放入该文件中,例如设置搜索路径,调入鼠标驱动和磁盘缓存,设置系统环境变量等。下面是一个运行于 Windows 98 下的 autoexec.bat 的示例:

1234567 @ECHO</code> <code>OFF PATH C:\WINDOWS;C:\WINDOWS\COMMAND;C:\UCDOS;C:\DOSTools;C:\SYSTOOLS;C:\WINTOOLS;C:\BATCH LH SMARTDRV.EXE /X LH DOSKEY.COM /INSERT LH CTMOUSE.EXE SET TEMP=D:\TEMP ``SET TMP=D:\TEMP

** 批处理的作用
**简单的说,批处理的作用就是自动的连续执行多条命令。

这里先讲一个最简单的应用:在启动 wps 软件时,每次都必须执行(> 前面内容表示 DOS 提示符):
C:>cd wps
C:\WPS>spdos
C:\WPS>py
C:\WPS>wbx
C:\WPS>wps
如果每次用 WPS 之前都这样执行一遍,您是不是觉得很麻烦呢?

好了,用批处理,就可以实现将这些麻烦的操作简单化,首先我们编写一个 runwps.bat 批处理文件,内容如下:

12345678 @echo</code> <code>off c: cd\wps spdos py wbx wps cd</code>

以后,我们每次进入 wps,只需要运行 runwps 这个批处理文件即可。

**常用命令
**
echo、@、call、pause、rem(小技巧:用::代替 rem)是批处理文件最常用的几个命令,我们就从他们开始学起。
echo 表示显示此命令后的字符
echo off 表示在此语句后所有运行的命令都不显示命令行本身
@ 与 echo off 相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。
call 调用另一个批处理文件(如果不用 call 而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)。
pause 运行此句会暂停批处理的执行并在屏幕上显示 Press any key to continue...的提示,等待用户按任意键后继续
rem 表示此命令后的字符为解释行(注释),不执行,只是给自己今后参考用的(相当于程序中的注释)。

例 1:用 edit 编辑 a.bat 文件,输入下列内容后存盘为 c:\a.bat,执行该批处理文件后可实现:将根目录中所有文件写入 a.txt 中,启动 UCDOS,进入 WPS 等功能。

  批处理文件的内容为:         命令注释:

    @echo off           不显示后续命令行及当前命令行
    dir c:*.* >a.txt       将 c 盘文件列表写入 a.txt
    call c:\ucdos\ucdos.bat    调用 ucdos
    echo 你好            显示"你好"
    pause              暂停,等待按键继续
    rem 准备运行 wps         注释:准备运行 wps
    cd ucdos            进入 ucdos 目录
    wps               运行 wps  

批处理文件的参数

批处理文件还可以像 C 语言的函数一样使用参数(相当于 DOS 命令的命令行参数),这需要用到一个参数表示符"%"。

%[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者 Tab)分隔的字符串。变量可以从 %0 到 %9,%0 表示批处理命令本身,其它参数字符串用 %1 到 %9 顺序表示。

例 2:C:根目录下有一批处理文件名为 f.bat,内容为:

12 @echo</code> <code>off format %1

如果执行 C:>f a:
那么在执行 f.bat 时,%1 就表示 a:,这样 format %1 就相当于 format a:,于是上面的命令运行时实际执行的是 format a:

例 3:C:根目录下一批处理文件名为 t.bat,内容为:

123 @echo</code> <code>off type %1 ``type %2

那么运行 C:>t a.txt b.txt
%1 : 表示 a.txt
%2 : 表示 b.txt>
于是上面的命令将顺序地显示 a.txt 和 b.txt 文件的内容。
**
特殊命令**

if goto choice for 是批处理文件中比较高级的命令,如果这几个你用得很熟练,你就是批处理文件的专家啦。

一、if 是条件语句,用来判断是否符合规定的条件,从而决定执行不同的命令。有三种格式:

  1. if [not] "参数" == "字符串" 待执行的命令

参数如果等于(not 表示不等,下同)指定的字符串,则条件成立,运行命令,否则运行下一句。

例:if "%1"=="a" format a:

  1. if [not] exist [路径]文件名 待执行的命令
    如果有指定的文件,则条件成立,运行命令,否则运行下一句。

如: if exist c:\config.sys type c:\config.sys
表示如果存在 c:\config.sys 文件,则显示它的内容。

  1. if errorlevel < 数字 > 待执行的命令

很多 DOS 程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),通过 if errorlevel 命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令(返回值必须按照从大到小的顺序排列)。如果返回值等于指定的数字,则条件成立,运行命令,否则运行下一句。

如 if errorlevel 2 goto x2

二、goto 批处理文件运行到这里将跳到 goto 所指定的标号(标号即 label,标号用:后跟标准字符串来定义)处,goto 语句一般与 if 配合使用,根据不同的条件来执行不同的命令组。

如:

goto end

:end
echo this is the end

标号用":字符串"来定义,标号所在行不被执行。

三、choice 使用此命令可以让用户输入一个字符(用于选择),从而根据用户的选择返回不同的 errorlevel,然后于 if errorlevel 配合,根据用户的选择运行不同的命令。

注意:choice 命令为 DOS 或者 Windows 系统提供的外部命令,不同版本的 choice 命令语法会稍有不同,请用 choice /?查看用法。

choice 的命令语法(该语法为 Windows 2003 中 choice 命令的语法,其它版本的 choice 的命令语法与此大同小异):

CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]

描述:
  该工具允许用户从选择列表选择一个项目并返回所选项目的索引。

参数列表:
 /C  choices    指定要创建的选项列表。默认列表是 "YN"。

 /N         在提示符中隐藏选项列表。提示前面的消息得到显示,选项依旧处于启用状态。

 /CS        允许选择分大小写的选项。在默认情况下,这个工具是不分大小写的。

 /T  timeout    做出默认选择之前,暂停的秒数。可接受的值是从 0 到 9999。如果指定了 0,就不会有暂停,默认选项
           会得到选择。

 /D  choice    在 nnnn 秒之后指定默认选项。字符必须在用 /C 选项指定的一组选择中; 同时,必须用 /T 指定 nnnn。

 /M  text     指定提示之前要显示的消息。如果没有指定,工具只显示提示。

 /?         显示帮助消息。

 注意:
 ERRORLEVEL 环境变量被设置为从选择集选择的键索引。列出的第一个选择返回 1,第二个选择返回 2,等等。如果用户按的键不是有效的选择,该工具会发出警告响声。如果该工具检测到错误状态,它会返回 255 的 ERRORLEVEL 值。如果用户按 Ctrl+Break 或 Ctrl+C 键,该工具会返回 0 的 ERRORLEVEL 值。在一个批程序中使用 ERRORLEVEL 参数时,将参数降序排列。

示例:
 CHOICE /?
 CHOICE /C YNC /M "确认请按 Y,否请按 N,或者取消请按 C。"
 CHOICE /T 10 /C ync /CS /D y
 CHOICE /C ab /M "选项 1 请选择 a,选项 2 请选择 b。"
 CHOICE /C ab /N /M "选项 1 请选择 a,选项 2 请选择 b。"
 
如果我运行命令:CHOICE /C YNC /M "确认请按 Y,否请按 N,或者取消请按 C。"
屏幕上会显示:
确认请按 Y,否请按 N,或者取消请按 C。 [Y,N,C]?
 
 
例:test.bat 的内容如下(注意,用 if errorlevel 判断返回值时,要按返回值从高到低排列):

12345678910111213141516 @echo</code> <code>off choice /C dme /M "defrag,mem,end" if errorlevel 3 goto end if errorlevel 2 goto mem if errotlevel 1 goto defrag  </code> <code>:defrag c:\dos\defrag goto end   :mem mem goto end  </code> <code>:end echo good bye

此批处理运行后,将显示"defrag,mem,end[D,M,E]?" ,用户可选择 d m e ,然后 if 语句根据用户的选择作出判断,d 表示执行标号为 defrag 的程序段,m 表示执行标号为 mem 的程序段,e 表示执行标号为 end 的程序段,每个程序段最后都以 goto end 将程序跳到 end 标号处,然后程序将显示 good bye,批处理运行结束。

**四、for 循环命令,只要条件符合,它将多次执行同一命令。
**
语法:
对一组文件中的每一个文件执行某个特定命令。

FOR %%variable IN (set) DO command [command-parameters]

%%variable    指定一个单一字母可替换的参数。
(set)      指定一个或一组文件。可以使用通配符。
command     指定对每个文件执行的命令。
command-parameters 为特定命令指定参数或命令行开关。

例如一个批处理文件中有一行:
for %%c in (*.bat *.txt) do type %%c

则该命令行会显示当前目录下所有以 bat 和 txt 为扩展名的文件的内容。

批处理示例

  1. IF-EXIST

首先用记事本在 C:\建立一个 test1.bat 批处理文件,文件内容如下:
@echo off
IF EXIST \AUTOEXEC.BAT TYPE \AUTOEXEC.BAT
IF NOT EXIST \AUTOEXEC.BAT ECHO \AUTOEXEC.BAT does not exist

然后运行它:
C:>TEST1.BAT

如果 C:\存在 AUTOEXEC.BAT 文件,那么它的内容就会被显示出来,如果不存在,批处理就会提示你该文件不存在。

接着再建立一个 test2.bat 文件,内容如下:
@ECHO OFF
IF EXIST %1 TYPE %1
IF NOT EXIST %1 ECHO %1 does not exist

执行:
C:>TEST2 AUTOEXEC.BAT
该命令运行结果同上。

说明:
(1) IF EXIST 是用来测试文件是否存在的,格式为
IF EXIST [路径 + 文件名] 命令
(2) test2.bat 文件中的 %1 是参数,DOS 允许传递 9 个批参数信息给批处理文件,分别为 %1~%9(%0 表示 test2 命令本身) ,这有点象编程中的实参和形参的关系,%1 是形参,AUTOEXEC.BAT 是实参。

  1. 更进一步的,建立一个名为 TEST3.BAT 的文件,内容如下:
    @echo off
    IF "%1" == "A" ECHO XIAO
    IF "%2" == "B" ECHO TIAN
    IF "%3" == "C" ECHO XIN

如果运行:
C:>TEST3 A B C
屏幕上会显示:
XIAO
TIAN
XIN

如果运行:
C:>TEST3 A B
屏幕上会显示
XIAO
TIAN

在这个命令执行过程中,DOS 会将一个空字符串指定给参数 %3。

  1. IF-ERRORLEVEL

建立 TEST4.BAT,内容如下:
@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:IF ERRORLEVEL 1 ECHO 文件拷贝失败
IF ERRORLEVEL 0 ECHO 成功拷贝文件

然后执行文件:
C:>TEST4

如果文件拷贝成功,屏幕就会显示"成功拷贝文件",否则就会显示"文件拷贝失败"。

IF ERRORLEVEL 是用来测试它的上一个 DOS 命令的返回值的,注意只是上一个命令的返回值,而且返回值必须依照从大到小次序顺序判断。因此下面的批处理文件是错误的:
@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:
IF ERRORLEVEL 0 ECHO 成功拷贝文件
IF ERRORLEVEL 1 ECHO 未找到拷贝文件
IF ERRORLEVEL 2 ECHO 用户通过 ctrl-c 中止拷贝操作
IF ERRORLEVEL 3 ECHO 预置错误阻止文件拷贝操作
IF ERRORLEVEL 4 ECHO 拷贝过程中写盘错误

无论拷贝是否成功,后面的:

未找到拷贝文件
用户通过 ctrl-c 中止拷贝操作
预置错误阻止文件拷贝操作
拷贝过程中写盘错误

都将显示出来。

以下就是几个常用命令的返回值及其代表的意义:
backup
0 备份成功
1 未找到备份文件
2 文件共享冲突阻止备份完成
3 用户用 ctrl-c 中止备份
4 由于致命的错误使备份操作中止

diskcomp
0 盘比较相同
1 盘比较不同
2 用户通过 ctrl-c 中止比较操作
3 由于致命的错误使比较操作中止
4 预置错误中止比较

diskcopy
0 盘拷贝操作成功
1 非致命盘读/写错
2 用户通过 ctrl-c 结束拷贝操作
3 因致命的处理错误使盘拷贝中止
4 预置错误阻止拷贝操作

format
0 格式化成功
3 用户通过 ctrl-c 中止格式化处理
4 因致命的处理错误使格式化中止
5 在提示"proceed with format(y/n)?"下用户键入 n 结束

xcopy
0 成功拷贝文件
1 未找到拷贝文件
2 用户通过 ctrl-c 中止拷贝操作
4 预置错误阻止文件拷贝操作
5 拷贝过程中写盘错误

  1. IF STRING1 == STRING2

建立 TEST5.BAT,文件内容如下:
@echo off
IF "%1" == "A" formAT A:

执行:
C:>TEST5 A
屏幕上就出现是否将 A:盘格式化的内容。

注意:为了防止参数为空的情况,一般会将字符串用双引号(或者其它符号,注意不能使用保留符号)括起来。
如:if [%1]==[A] 或者 if %1*==A*

  1. GOTO

建立 TEST6.BAT,文件内容如下:
@ECHO OFF
IF EXIST C:\AUTOEXEC.BAT GOTO _COPY
GOTO _DONE
:_COPY
COPY C:\AUTOEXEC.BAT D:
:_DONE

注意:
(1) 标号前是 ASCII 字符的冒号":",冒号与标号之间不能有空格。
(2) 标号的命名规则与文件名的命名规则相同。
(3) DOS 支持最长八位字符的标号,当无法区别两个标号时,将跳转至最近的一个标号。

  1. FOR

建立 C:\TEST7.BAT,文件内容如下:
@ECHO OFF
FOR %%C IN (*.BAT *.TXT *.SYS) DO TYPE %%C

运行:
C:>TEST7

  • BAT
    8 引用 • 99 回帖

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 640 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    246 引用 • 1338 回帖
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    20 引用 • 7 回帖 • 1 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 47 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    336 引用 • 324 回帖
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 666 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 725 关注
  • Follow
    4 引用 • 12 回帖 • 11 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    181 引用 • 821 回帖 • 2 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    730 引用 • 1280 回帖
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 2 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    952 引用 • 944 回帖
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    325 引用 • 1395 回帖 • 2 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    107 引用 • 127 回帖 • 336 关注
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用 • 1 关注
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 690 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 399 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 498 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 5 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖 • 2 关注
  • 印象笔记
    3 引用 • 16 回帖
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    167 引用 • 314 回帖
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖 • 1 关注
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 177 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    91 引用 • 59 回帖 • 2 关注