BAT 语法

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

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 回帖

相关帖子

回帖

欢迎来到这里!

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

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

推荐标签 标签

  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    32 引用 • 130 回帖 • 2 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 27 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 474 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖 • 67 关注
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    132 引用 • 1114 回帖 • 124 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 4 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    8 引用 • 26 回帖
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    75 引用 • 258 回帖 • 617 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    6 引用 • 63 回帖
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 4 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    93 引用 • 113 回帖
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    62 引用 • 289 回帖 • 1 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖
  • 前端

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

    247 引用 • 1348 回帖
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 742 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 63 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 22 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 588 回帖
  • abitmean

    有点意思就行了

    29 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 6 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 362 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 167 关注
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    5 引用 • 26 回帖 • 528 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    5 引用 • 107 回帖
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖 • 1 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 94 关注