标签 批处理 下的文章

编写你自己的简单程序来自动执行通常需要大量输入的任务的批处理文件,是一种极好的方法。

 title=

在 Linux 上,创建 shell 脚本 来自动执行重复的任务是很常见的。类似地,在开源版的旧式 DOS 操作系统 FreeDOS 上,你可以创建一个包含数个 FreeDOS 命令的 批处理文件 。然后,你就可以运行你的批处理文件来按顺序执行每个命令。

你可以使用一个 ASCII 文本编辑器来创建批处理文件,诸如 FeeDOS 的 Edit 应用程序。在你创建一个批处理文件后,你可以使用一个文件名称加上扩展名 .bat 来保存它。文件名称应该是唯一的。如果你使用 FreeDOS 的一个命令的名称作为你自己的文件名称,那么可能将会执行 FreeDOS 的命令,而不会是你的批处理文件。

实际上,所有的内部的和外部的 FreeDOS 命令都可以在一个批处理文件中使用。在你创建一个批处理文件时,你其实就是在编写一个程序。FreeDOS 批处理文件可能没有结构化编程语言的功能,但是对于耗时短暂却重复乏味的任务来说,它是非常方便的。

注释你的代码

对于任何程序员来说,学习的第一个好习惯都应该是:在一个程序中放置注释来解释该代码正在做什么。这是一件非常容易完成的事情,但是你需要仔细,不要傻傻地让操作系统来执行你的注释。避免出现这种情况的方法是在一个注释行的开头处放置 REM(“remark” 的缩写) 。

FreeDOS 忽略以 REM 开头的代码行。但是任何查看源文件代码(即你在你的批处理文件中所编写的文本)的人都可以读取你的注释并理解它在做什么。这也是一种临时性禁用一个命令而不需要删除它的一种方法。只需要打开你的批处理文件来进行编辑,在你想要禁用行的开头处放置 REM ,并保存它。在你想要重新启用这个命令时,只需要打开文件来进行编辑和移除 REM 。这种技巧有时被称为 “注释掉” 一个命令。

开始设置

在你开始编写你自己的批处理文件前,我建议在 FreeDOS 中创建一个临时目录。这将会为你提供一个处理批处理文件的安全空间,不会意外地删除、移动,或重命名重要的系统文件或目录。在 FreeDOS 上,你可以使用 MD 命令来 创建一个目录

C:\>MD TEMP
C:\>CD TEMP
C:\TEMP>

FreeDOS 的 ECHO 命令会控制当你运行一个批处理文件时在屏幕上显示的东西。例如,这里是一个简单是单行批处理文件:

ECHO Hello world

如果你创建这个文件并运行它,你将看到在屏幕上显示的句子。从命令行中完成这项操作的最快的方法是:使用 COPY 命令来从你的键盘中(CON)获取输入,并将其放置到文件 TEST1.BAT 之中。接下来,按下组合键 Ctrl+Z 来停止复制过程,按下你键盘上的 ReturnEnter 按键来返回一个提示。

在你的临时目录中尝试创建这个文件为 TEST1.BAT ,接下来运行它:

C:\TEMP>COPY CON TEST1.BAT
CON => TEST1.BAT
ECHO Hello world
^Z

C:\TEMP>TEST1
Hello world

当你想要显示一段文本时,这可能很有用。例如,在一个程序完成它的任务时,你可能会在你的屏幕上看到一条告诉你需要等待的消息,或者在一个网络环境中时,你可能会看到一条登录消息。

如果你想要显示一个空行怎么办?你可能会认为 ECHO 命令本身就可以达到目的,但是单独一个 ECHO 命令只会询问 FreeDOS 来响应 ECHO 是打开还是关闭:

C:\TEMP>ECHO
ECHO is on

获取一个空白行的方法是在 ECHO后紧接着使用一个 +符号:

C:\TEMP>ECHO+

C:\TEMP>

批处理文件变量

变量是一个存储你需要你的批处理文件临时记住的信息的位置。这是编程的一个重要的功能,因为你不能总是知道你的批处理文件需要使用什么样的数据。这里有一个用于演示的简单示例。

创建 TEST3.BAT

@MD BACKUPS
COPY %1 BACKUPS\%1

变量是使用百分比符号和随后的数字表示的,因此,这个批处理文件将在你的当前目录中创建一个 BACKUPS 子目录,然后将复制变量 %1BACKUPS 文件夹之中。这个变量是什么?当你运行批处理文件时,变量由你决定:

C:\TEMP>TEST3 TEMP1.BAT
TEST1.BAT => BACKUPS\TEST1.BAT

你的批处理文件已经复制 TEST1.BAT 到一个名称为 BACKUPS 的子目录,因为在你运行批处理文件时,你标识这个文件为一个参数。你的批处理文件将把 %1 替换为 TEST1.BAT

变量是按位置的。变量 %1 是你提供给命令的第一个参数,变量 %2 是第二个参数,以此类推。假设你创建一个批处理文件来列出一个目录的内容:

DIR %1

尝试运行它:

C:\TEMP>TEST4.BAT C:\HOME
ARTICLES
BIN
CHEATSHEETS
GAMES
DND

这像预期一样的工作。但是下面这个却失败了:

C:\TEMP>TEST4.BAT C:\HOME C:\DOCS
ARTICLES
BIN
CHEATSHEETS
GAMES
DND

如果你尝试它,你将得到第一个参数(C:\HOME)的列表,而得不到第二个参数(C:\DOCS)的列表。这是因为你的批处理文件仅查找一个变量(%1),此外,DIR 命令也仅能获取一个目录。

此外,当你运行一个批处理文件时,你也不需要为其具体指定扩展名 —— 除非你运气相当不好地为批处理文件选取了一个与 FreeDOS 外部命令或类似命令相同的名称。当 FreeDOS 执行命令时,它按下面的顺序执行:

  1. 内部命令
  2. 带有 *.COM 扩展名的外部命令
  3. 带有 *.EXE 扩展名的外部命令
  4. 批处理文件

多个参数

好的,选择重新编写 TEST4.BAT 文件来使一个命令可以获取两个参数,以便你可以看到这是如何工作的。首先,使用 EDIT 应用程序来创建一个简单的名称为 FILE1.TXT 的文本文件。在其中放置一段某种类型(例如,“Hello world”)的语句,并在你的 TEMP 工作目录中保存文件。

接下来,使用 EDIT 来更改你的 TEST4.BAT 文件:

COPY %1 %2
DIR

保存它,然后执行命令:

C:\TEMP\>TEST4 FILE1.TXT FILE2.TXT

在运行你的批处理文件时,你会看一个你的 TEMP 目录的目录列表。在列出的文件之中,你有 FILE1.TXTFILE2.TXT ,它们是由你的批处理文件所创建的。

嵌套批处理文件

批处理文件的另一个功能是能够 “嵌套” ,这意味着一个批处理文件可以在另外一个批处理文件中被调用和运行。为查看这是如何工作的,从一对简单的批处理文件开始:

第一个文件被称为 NBATCH1.BAT

@ECHO OFF
ECHO Hello
CALL NBATCH2.BAT 
ECHO world

第一行 (@ECHO OFF) 轻轻地告诉批处理文件在你运行它时仅显示命令 (而不是命令本身) 的输出。你可能会在前面的示例中注意到这里有很多关于批处理文件正在做什么的反馈;在这种情况下,你正在允许你的批处理文件仅显示结果。

第二个批处理被称为 NBATCH2.BAT :

echo from FreeDOS

使用 EDIT 来创建这两个文件,并在你的 TEMP 子目录中保存它们。运行 NBATCH1.BAT 来查看会发生什么:

C:\TEMP\>NBATCH1.BAT 
Hello
from FreeDOS
world

你的第二个批处理文件将在第一个批处理文件之中通过 CALL 命令来执行,它将提供在你 “Hello world” 信息中间的字符串 “from FreeDOS” 。

FreeDOS 脚本

编写你自己的简单程序来自动执行通常需要大量输入的任务的批处理文件,是一种极好的方法。你使用的 FreeDOS 越多, 你将越熟悉它的命令,在你熟知命令后,在一个批处理文件中列出它们仅是一件使你的 FreeDOS 系统让你生活轻松的事情。尝试一下!


via: https://opensource.com/article/21/3/batch-files-freedos

作者:Kevin O'Brien 选题:lujun9972 译者:[robsean]](https://github.com/robsean) 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

FreeDOS 下批处理文件的实用指南。

 title=

即使你以前没有使用过 DOS,你也可能知道它的命令行 shell,即 COMMAND.COM。它已经成为 DOS 的同义词,FreeDOS 为此也实现了一个类似的 shell,称为 “FreeCOM”,但也命名为 COMMAND.COM,就像在其他 DOS 系统上一样。

但是 FreeCOM shell 可以做的不仅仅是为你提供一个命令行提示符让你在其中运行命令,如果你需要在 FreeDOS 上自动执行任务,你可以使用 批处理文件,也称为 “BAT 文件”,因为这些脚本使用 .BAT 扩展名。

批处理文件可能比你在 Linux 编写的脚本要简单得多。因为在很久以前,这个功能最初被添加到 DOS 时,它是为了让 DOS 用户“批量处理”某些命令。它的条件分支没有太大的灵活性,也不支持更高级的功能,例如算术扩展、标准输出和错误消息的重定向、后台进程、测试、循环(这项支持)和 Linux 脚本中常见的其他结构。

本文是 FreeDOS 下批处理文件的实用指南。记住通过用百分号(%)包裹变量名称来引用环境变量,例如 %PATH%。但是,请注意,由于历史原因,FOR 循环的构造略有不同。

打印输出

批处理文件可能需要向用户打印消息,让用户知道发生了什么。使用 ECHO 语句打印消息。例如,一个批处理文件可能使用以下语句表明它已完成了任务:

ECHO Done

ECHO 语句不需要引号。FreeCOM ECHO 语句不会以任何特殊方式处理引号,它会像普通文本一样打印它们。

通常,FreeDOS 在执行批处理文件时会打印每一行。这在一个非常短的批处理文件中通常不是问题,它只为用户定义了几个环境变量。但是对于执行更多工作的较长批处理文件而言,批处理行的这种一直显示可能会变得很麻烦。要阻止此输出,在 ECHO 语句中使用 OFF 关键字,如下所示:

ECHO OFF

使用 ON 关键字在 FreeDOS 运行时恢复显示批处理行。

ECHO ON

大多数批处理文件在第一行包含一个 ECHO OFF 语句,以阻止消息,但是 shell 在执行语句时仍然会在屏幕上打印 ECHO OFF。为了隐藏该语句,批处理文件通常在前面使用 @ 符号。这样,任何以这个特殊字符开头的行都不会打印,即使打开了 ECHO

@ECHO OFF

注释

编写较长批处理文件时,大多数程序员都喜欢使用 注释 来提醒自己这个批处理文件的用途。在批处理文件中注释,使用 REM(remark)关键字。REM 之后的任何内容都会被 FreeCOM shell 忽略。

@ECHO OFF
REM This is a comment

执行“辅助”批处理文件

通常,FreeCOM 一次只运行一个批处理文件。但是,你可能需要使用另一个批处理文件来执行其他操作,例如为多个批处理文件设置公共环境变量。

如果你从"正在运行"的批处理文件中直接调用第二个批处理文件,FreeCOM 将完全切换到第二个批处理文件,并停止处理第一个。要改为在第一个批处理文件“内部”运行第二个批处理文件,你需要告诉 FreeDOS shell 使用 CALL 关键字去 调用 第二个批处理文件。

@ECHO OFF
CALL SETENV.BAT

条件分支

批处理文件确实支持使用 IF 语句的简单条件分支。它有三种基本形式:

  1. 测试上一条命令的返回状态
  2. 测试一个变量是否等于一个值
  3. 测试文件是否存在

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 测试的一种方法是跳转到批处理文件中完全不同的部分,这取决于 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 环境变量不同。要循环编辑一组文本文件,可以使用以下语句:(LCTT 译注:原文此处写错了,少写了一个 %

@ECHO OFF
FOR %%F IN (*.TXT) DO EDIT %%F

注意,如果在命令行中运行此循环,而不是在批处理文件中,那么迭代变量仅需要指定一个百分号(%):

C:\> FOR %F IN (*.TXT) DO EDIT %F

命令行处理

在运行批处理文件时,FreeDOS 提供了一种简单的方法来检测用户可能提供的命令行选项。FreeDOS 解析命令行输入,并将前九个选项存储在特殊变量 %1%2 ..... 等中,直到 %9。注意,无法通过这种方式直接访问第十一个(及之后)选项。特殊变量 %0 存储批处理文件的名称。

如果你的批处理文件需要处理 9 个以上的选项,你可以使用 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>

via: https://opensource.com/article/21/6/automate-tasks-bat-files-freedos

作者:Jim Hall 选题:lujun9972 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出