即使您以前没有使用过 DOS,您可能也知道它的命令行 shell,简单地命名为 COMMAND.COM
。COMMAND.COM
shell 已经成为 DOS 的代名词,因此 FreeDOS 也实现了一个类似的 shell,名为“FreeCOM”——但像其他 DOS 系统一样,也命名为 COMMAND.COM
,这并不奇怪。
但是 FreeCOM shell 的功能不仅仅是提供一个命令行提示符来运行命令。如果您需要在 FreeDOS 上自动化任务,您可以使用批处理文件来完成,也称为“BAT 文件”,因为这些脚本使用 .BAT
扩展名。
批处理文件比您可能在 Linux 上编写的脚本简单得多。这是因为当此功能最初添加到 DOS 时,很久以前,它旨在作为 DOS 用户“批量处理”某些命令的一种方式。条件分支的灵活性不大,批处理文件不支持更高级的功能,例如算术扩展、标准输出与错误消息的单独重定向、后台进程、测试、循环以及 Linux 脚本中常见的其他脚本结构。
这是一份关于 FreeDOS 下批处理文件的实用指南。请记住,通过用百分号 (%
) 包裹变量名来引用环境变量,例如 %PATH%
。但是,请注意,由于历史原因,FOR
循环使用略有不同的结构。
打印输出
您的批处理文件可能需要向用户打印消息,让他们知道发生了什么。使用 ECHO
语句打印消息。例如,批处理文件可以使用以下语句指示任务已完成
ECHO Done
您不需要在 ECHO
语句中使用引号。FreeCOM ECHO
语句不会以任何特殊方式处理引号,并且会像普通文本一样打印它们。
通常,FreeDOS 会在执行批处理文件中的每一行时将其打印出来。这对于只定义几个用户环境变量的非常短的批处理文件通常不是问题。但是对于执行更多工作的较长批处理文件,这种批处理行的持续显示可能会变得麻烦。要抑制此输出,请使用 OFF
关键字来 ECHO
语句,如下所示
ECHO OFF
要恢复显示 FreeDOS 运行时批处理行的状态,请改用 ON
关键字
ECHO ON
大多数批处理文件在第一行都包含 ECHO OFF
语句,以抑制消息。但是 shell 仍然会将 ECHO OFF
打印到屏幕上,因为它执行该语句。为了隐藏该消息,批处理文件通常在前面使用 at 符号 (@
)。批处理文件中任何行开头的这个特殊字符都会抑制打印该行,即使 ECHO
已打开。
@ECHO OFF
注释
在编写任何长批处理文件时,大多数程序员都喜欢使用注释来提醒自己批处理文件的用途。要在批处理文件中输入注释,请使用 REM
(代表 remark)关键字。REM
之后的任何内容都会被 FreeCOM shell 忽略。
@ECHO OFF
REM This is a comment
执行“辅助”批处理文件
通常,FreeCOM 一次只运行一个批处理文件。但是,您可能需要使用另一个批处理文件来执行某些操作,例如设置跨多个批处理文件通用的环境变量。
如果您只是从“正在运行”的批处理文件中调用第二个批处理文件,FreeCOM 会完全切换到第二个批处理文件并停止处理第一个批处理文件。要改为在第一个批处理文件“内部”运行第二个批处理文件,您需要告诉 FreeCOM shell 使用 CALL
关键字调用第二个批处理文件。
@ECHO OFF
CALL SETENV.BAT
条件评估
批处理文件确实支持使用 IF
语句的简单条件评估结构。这有三种基本形式
- 测试上一个命令的返回状态
- 测试变量是否等于某个值
- 测试文件是否存在
IF
语句的常见用途是测试程序是否成功返回到操作系统。大多数程序在正常完成时将返回零值,如果发生错误,则返回其他值。在 DOS 中,这称为错误级别,并且是 IF
测试的特殊情况。
要测试调用的程序 MYPROG
是否成功退出,您实际上要检查程序是否返回了“零”错误级别。使用 ERRORLEVEL
关键字测试特定值,例如
@ECHO OFF
MYPROG
IF ERRORLEVEL 0 ECHO Success
使用 ERRORLEVEL
测试错误级别是检查程序退出状态的一种笨拙方法。检查 DOS 程序的不同可能返回代码的更有效方法是使用 FreeDOS 为您定义的特殊变量 ERRORLEVEL
。这存储最近执行程序的错误级别。然后,您可以使用 ==
测试来测试不同的值。
您可以使用 ==
测试和 IF
语句来测试变量是否等于某个值。与某些编程语言一样,您使用 ==
直接比较两个值。通常,您会在一侧引用环境变量,而在另一侧引用值,但是您也可以比较两个变量的值,以查看它们是否相同。例如,您可以使用以下批处理文件重写上面的 ERRORLEVEL
代码
@ECHO OFF
MYPROG
IF %ERRORLEVEL%==0 ECHO Success
IF
语句的另一个常见用途是测试文件是否存在,并在存在时采取操作。您可以使用 EXIST
关键字测试文件。例如,要删除名为 TEMP.DAT
的临时文件,您可以在批处理文件中使用以下行
@ECHO OFF
IF EXIST TEMP.DAT DEL TEMP.DAT
对于任何 IF
语句,您都可以使用 NOT
关键字来否定测试。要在文件不存在时打印消息,您可以编写
@ECHO OFF
IF NOT EXIST TEMP.DAT ECHO No file
分支执行
利用 IF
测试的一种方法是根据先前测试的结果跳转到批处理文件的完全不同的部分。在最简单的情况下,您可能希望在关键命令失败时跳到批处理文件的末尾。或者,如果某些环境变量未正确设置,您可能希望执行其他语句。
您可以使用 GOTO
指令跳转到批处理文件的不同部分。这将跳转到批处理文件中的特定行,称为标签。请注意,这是一个严格的“go-to”跳转;批处理文件执行在新标签处继续。
假设程序需要一个现有的空文件来存储临时数据。如果该文件不存在,您需要在运行程序之前创建一个文件。您可以将以下行添加到批处理文件中,以便您的程序始终拥有一个临时文件来工作
@ECHO OFF
IF EXIST temp.dat GOTO prog
ECHO Creating temp file...
TOUCH temp.dat
:prog
ECHO Running the program...
MYPROG
当然,这是一个非常简单的示例。对于这种情况,您可以改为重写批处理文件,以将创建临时文件作为 IF
语句的一部分
@ECHO OFF
IF NOT EXIST temp.dat TOUCH temp.dat
ECHO Running the program...
MYPROG
迭代
如果您需要对一组文件执行相同的任务怎么办?您可以使用 FOR
循环迭代一组文件。这是一个单行循环,每次对不同的文件运行单个命令。
FOR
循环对迭代变量使用特殊语法,其使用方式与其他 DOS 环境变量不同。要循环遍历一组文本文件以便您可以依次编辑每个文件,请在批处理文件中使用以下语句
@ECHO OFF
FOR %%F IN (*.TXT) DO EDIT %%F
请注意,如果您在命令行上运行此循环,而不是在批处理文件中运行,则迭代变量仅用一个百分号 (%
) 指定
C:\> FOR %F IN (*.TXT) DO EDIT %F
命令行处理
FreeDOS 提供了一种简单的方法来评估用户在运行批处理文件时可能提供的任何命令行选项。FreeDOS 解析命令行,并将前九个批处理文件选项存储在特殊变量 %1
、%2
、.. 一直到 %9
中。请注意,第十一个选项(及以后的选项)无法以这种方式直接访问。(特殊变量 %0
存储批处理文件的名称。)
如果您的批处理文件需要处理九个以上的选项,您可以使用 SHIFT
语句删除第一个选项,并将每个选项向下移动一个值。因此,第二个选项变为 %1
,第十个选项变为 %9
。
大多数批处理文件需要向下移动一个值。但是,如果您需要向下移动其他增量,您可以为 SHIFT
语句提供该参数,例如
SHIFT 2
这是一个简单的批处理文件,演示了向下移动一个值
@ECHO OFF
ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9
ECHO Shift by one ..
SHIFT 1
ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9
使用十个参数执行此批处理文件显示了 SHIFT
语句如何重新排序命令行选项,以便批处理文件现在可以将第十个参数作为 %9
访问
C:\SRC>args 1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9
Shift by one ..
2 3 4 5 6 7 8 9 10
C:\SRC>
评论已关闭。