FreeDOS下批处理文件的实用指南。即使您以前没有使用过DOS,您也可能知道它的命令行外壳COMMAND.COM。它已成为DOS的同义词,为此FreeDOS实现了一个类似的外壳,称为“FreeCOM”,但也像在其他DOS系统上一样命名为COMMAND.COM。但是FreeCOMshell可以做的不仅仅是为您提供一个命令行提示符来运行命令。如果您需要在FreeDOS上自动执行任务,您可以使用批处理文件,也称为“BAT文件”,因为这些脚本使用.BAT扩大。批处理文件可以比您在Linux中编写的脚本简单得多。因为在很久以前,这个特性刚被添加到DOS时,就是为了让DOS用户可以“批处理”某些命令。它在条件分支方面没有太多的灵活性,也不支持更高级的功能,例如算术扩展、标准输出和错误消息的重定向、后台进程、测试、循环(这是支持的)以及Linux脚本中常见的其他功能结构。本文是FreeDOS下批处理文件的实用指南。请记住通过用百分号(%)包裹变量名称来引用环境变量,例如%PATH%。但是请注意,由于历史原因,FOR循环的构造略有不同。打印输出批处理文件可能需要向用户打印消息,让他们知道发生了什么。使用ECHO语句打印消息。例如,批处理文件可能使用以下语句来指示它已完成其任务:ECHODoneECHO语句不需要引号。FreeCOMECHO语句不以任何特殊方式处理引号,它像普通文本一样打印它们。通常,FreeDOS在执行批处理文件时打印每一行。这在只为用户定义了几个环境变量的非常短的批处理文件中通常不是问题。但是对于完成更多工作的较长批处理文件,这种不断显示批处理行会变得很麻烦。要抑制此输出,请在ECHO语句中使用OFF关键字,如下所示:ECHOOFF在FreeDOS运行时使用ON关键字恢复显示批处理行。ECHOON大多数批处理文件在第一行包含一个ECHOOFF语句以抑制消息,但shell在执行该语句时仍会在屏幕上打印ECHOOFF。为了隐藏这条语句,批处理文件通常以@符号开头。这样,任何以这个特殊字符开头的行都不会被打印出来,即使ECHO被打开了。@ECHOOFFCOMMENTS在编写长批处理文件时,大多数程序员喜欢使用注释来提醒自己批处理文件的用途。要在批处理文件中注释,请使用REM(备注)关键字。REM之后的任何内容都会被FreeCOMshell忽略。@ECHOOFFREM这是执行“辅助”批处理文件的注释通常,FreeCOM一次只运行一个批处理文件。但是,您可能需要使用另一个批处理文件来执行其他操作,例如为多个批处理文件设置公共环境变量。如果您直接从“正在运行的”批处理文件中调用第二个批处理文件,FreeCOM将完全切换到第二个批处理文件并停止处理第一个批处理文件。要在第一个批处理文件“内部”运行第二个批处理文件,您需要告诉FreeDOSshell使用CALL关键字来调用第二个批处理文件。@ECHOOFFCALLSETENV.BAT条件分支批处理文件支持使用IF语句的简单条件分支。它有三种基本形式:测试上一个命令的返回状态测试一个变量是否等于一个值测试文件是否存在IF语句的一个常见用途是测试程序是否返回成功。大多数程序在正常运行时将返回零值,或在出现错误时返回其他值。在DOS中,这称为错误级别,它是IF测试的特例。名为MYPROG的程序成功退出的测试实际上是检查程序是否返回“零”。使用ERRORLEVEL关键字测试特定值。例如:@ECHOOFFMYPROGIFERRORLEVEL0ECHOSuccess使用ERRORLEVEL测试错误级别是一种笨拙的检查程序退出状态的方法。检查DOS程序不同返回值的一个更有用的方法是使用FreeDOS为你定义的一个特殊变量,称为ERRORLEVEL。它存储最近执行的程序的错误级别,然后您可以使用==来测试不同的值。您可以使用==和IF语句来测试变量是否等于某个值。与某些编程语言一样,您可以使用==直接比较两个值。通常,一侧引用一个环境变量,另一侧引用一个值,但您也可以比较两个变量的值,看它们是否相同。例如,您可以使用这个批处理文件重写上面的ERRORLEVEL代码:@ECHOOFFMYPROGIF%ERRORLEVEL%==0ECHOSuccessIF语句的另一个常见用途是测试文件是否存在,如果存在则采取行动。您可以使用EXIST关键字进行测试。例如,要删除名为TEMP.DAT的临时文件,您可以在批处理文件中使用以下行:@ECHOOFFIFEXISTTEMP.DATDELTEMP.DAT对于任何IF语句,您可以使用NOT关键字来否定测试.要在文件不存在时打印消息,您可以这样写:@ECHOOFFIFNOTEXISTTEMP.DATECHONofileBranchExecution利用IF测试的一种方法是跳转到批处理文件的完全不同的部分,取决于IF测试的结果。在最简单的情况下,如果关键命令失败,您可能希望跳到批处理文件的末尾。或者,如果某些环境变量设置不正确,您可能希望执行其他语句。您可以使用GOTO指令跳转到批处理文件的其他部分。它跳转到批处理文件中称为标签的特定行。请注意,这是一个严格的“转到”跳转:批处理文件的执行将从新选项卡开始。假设程序需要一个现有的空文件来存储临时数据。如果该文件不存在,则需要在运行程序之前创建一个文件。您可以将这些操作添加到您的批处理文件中,以便您的程序始终有一个可用的临时文件:@ECHOOFFIFEXISTtemp.datGOTOprogECHOCreatingtempfile...TOUCHtemp.dat:progECHO运行程序。..MYPROG当然,这是一个很简单的例子。对于这种情况,您可以重写批处理文件以创建临时文件作为IF语句的一部分:@ECHOOFFIFNOTEXISTtemp.datTOUCHtemp.datECHO运行程序...MYPROGIteration如果您需要迭代一组文件执行相同的任务怎么样?您可以使用FOR循环遍历一组文件。这是一个单行循环,每次使用不同的文件运行一个命令。FOR循环对迭代变量使用特殊语法,其使用方式不同于其他DOS环境变量。要在循环中编辑一组文本文件,可以使用以下语句:要在命令行而不是在批处理文件中运行此循环,迭代变量只需要用百分号(%)指定:C:\>FOR%FIN(*.TXT)DOEDIT%F命令行处理FreeDOS提供了一种简单的方法来检测用户在运行批处理文件时可能提供的命令行选项。FreeDOS解析命令行输入并将前九个选项存储在特殊变量%1、%2.....等中,直到%9。请注意,第十一个(及后续)选项不能通过这种方式直接访问。特殊变量%0存储批处理文件的名称。如果您的批处理文件需要处理超过9个选项,您可以使用SHIFT语句删除第一个选项并将每个选项向下移动一个值。因此第二个选项变为%1,第十个选项变为%9。大多数批处理文件只需要移动一个值。但是,如果您需要以其他增量进行移位,则可以向SHIFT语句提供参数。示例:SHIFT2这是一个演示移位操作的简单批处理文件:@ECHOOFFECHO%1%2%3%4%5%6%7%8%9ECHO移位1..SHIFT1ECHO%1%2%3%4%5%6%7%8%9执行带有十个选项的批处理文件显示了SHIFT语句如何重新排列命令行选项,以便批处理文件现在可以使用%9访问第十个参数:C:\SRC>args12345678910123456789移位一位..2345678910C:\SRC>
