[an error occurred while processing this directive]

HP OpenVMS Systems Documentation

Content starts here

OpenVMS 用户手册


前页 目录 索引

13.6.3.1 限制

执行命令过程时应用以下限制:

  • 命令过程以一个限定词名开始时,不能在执行过程命令 (@) 之前包括空格。
  • 命令过程以一个参数开始时,必须在执行过程命令 (@) 之前带一个空格。

13.6.4 以交互方式执行命令过程

要交互地执行命令过程,输入一个执行过程命令 (@) 后面跟随命令过程的文件说明。

例如,这个命令执行在 WORKDISK: 磁盘上 [MAINT.PROCEDURES] 目录中的过程 SETD.COM:


$ @WORKDISK:[MAINT.PROCEDURES]SETD [Return]

您可以定义一个表示长命令行的符号名。然后使用这个符号执行命令过程。

要使用一个符号执行上一个例子展示的命令过程,把这行包括在您的注册命令过程中:


$ SETD == "@WORKDISK:[MAINT.PROCEDURES]SETD"

然后,要执行过程 SETD.COM,可输入这个符号名,如同其他命令:


$ SETD [Return]

按照默认,交互地执行命令过程时,操作系统把输出显示在终端上。然而,执行命令时使用 /OUTPUT 限定词可以把输出重定向到一个文件。

您把命令过程输出重定向到一个文件时,这个过程把任何出错消息发送到终端和接收输出的文件。

这个命令把 SETD.COM 的输出写入文件 RESULTS.TXT,而不是终端:


$ @SETD/OUTPUT=RESULTS.TXT

总是把 /OUTPUT 限定词放在命令过程名之后,中间没有空格。否则,DCL 把这个限定词解释为传递给过程的参数。

13.6.5 以批量作业方式执行命令过程

如果使用的命令过程需要很长的处理时间 (例如,编译或汇编大的程序),那么把这些过程提交为批量作业,将允许您继续交互地使用终端。

要以批量模式执行命令过程,输入 DCL 命令 SUBMIT 可把命令过程提交到批队列 (一个等待执行的批量作业列表)。当提交作业时,它被放入默认批队列 SYS$BATCH,在此它被添加到等待执行的作业队列末端。当在您之前的作业完成时,就执行您的作业。在 OpenVMS 系统上,可以同时执行的批量作业的数目由系统管理员在建立这个批队列时指定。

以下例子展示如何执行命令过程 JOB1.COM。SUBMIT 命令使用默认文件类型 .COM;如果命令过程有文件类型 .COM 时就不必输入文件类型:


$ SUBMIT JOB1
Job JOB1 (queue SYS$BATCH, entry 651, started on SYS$BATCH))

13.6.5.1 远程批量作业

如果您的系统是网络的一部分,那么可以把命令过程提交为远程节点上的批量作业。在命令过程中,您可以使用 DCL 命令打开和关闭远程节点上的文件,并且使用与局部文件一样的命令和限定词,读取和写入那些文件的记录。

13.6.5.2 重新启动批量作业

按照默认,如果在作业完成之前系统失败,那么批量作业就从第一行开始重新执行。然而,可以在命令过程中使用以下符号指定不同的重新启动点:

  • $RESTART
    一个全局符号,如果在执行之前批量作业至少已启动一次,这个全局符号的值就为真值。不要为 $RESTART 指定值;系统将赋予适当的值。
  • BATCH$RESTART
    一个全局符号,使用 SET RESTART_VALUE 命令可指定它的值。

使用 $RESTART 和 BATCH$RESTART

以下过程描述如何使用 $RESTART 和 BATCH$RESTART 符号:

步骤 动作
1 从标号开始过程的每个可能启动点。
2 作为每个段的第一步,使用 SET RESTART_VALUE 命令把 BATCH$RESTART 的值赋予这个标号。
3 在过程的开始,测试 $RESTART。
4 如果 $RESTART 为真,则使用 BATCH$RESTART 作为转移标号发出一个 GOTO 语句。

以下命令过程从一个库中抽取许多模块、连接那些模块,然后排序作为结果的文件:


$! SORT_MODULES.COM
!
$! Set default to the directory containing
$! the library whose modules are to be sorted
$ SET DEFAULT WORKDISK:[ACCOUNTS.DATA83]
$!
$! Check for restarting
$ IF $RESTART THEN GOTO "BATCH$RESTART"
$!
$ EXTRACT_LIBRARIES:
$ SET RESTART_VALUE=EXTRACT_LIBRARIES
   .
   .
   .
$ CONCATENATE_LIBRARIES:
$ SET RESTART_VALUE=CONCATENATE_LIBRARIES
   .
   .
   .
$ SORT_FILE:
$ SET RESTART_VALUE=SORT_FILE
   .
   .
   .
$ EXIT

如果这个命令过程异常结束,它就从文件开始、从标号为 CONCATENATE_LIBRARIES 的语句或者从标号为 SORT_FILE 的语句重新执行,视 BATCH$RESTART 的值而定。如果抽取了许多独立的模块,就可使每个抽取作为一个独立段。

13.6.6 执行磁盘和磁带卷上的命令过程

以下几节描述如何执行在磁盘和磁带卷上的命令过程。

13.6.6.1 在专用磁盘上执行

用 SUBMIT 命令提交命令过程时,不能存取在已分配设备上的文件。然而,您可以执行位于专用磁盘上的命令过程,并且使用 /SHARE 限定词装上这个磁盘。

13.6.6.2 在磁带卷上执行

您可以执行驻留在磁带卷上的命令过程,如果:

  • 这个过程不调用任何其他过程。
  • 这个过程不发出任何指向这个 GOTO 命令之前标号的 GOTO 命令。

如果出现这些条件之一,完成以下动作可以执行这个命令过程:

步骤 动作
1. 把命令过程复制到共享磁盘卷。
2. 执行这个共享磁盘卷上的命令过程。

13.7 退出和中断命令过程

使用本节描述的任何方法退出命令过程时,需要知道命令级。

命令级是 DCL 级解释程序的输入流。在终端输入命令时,是在命令级 0 输入命令。简单交互命令过程 (如 CLEANUP.COM) 在命令级 1 执行。当这个过程终止并且 DCL 提示重新出现在屏幕上,就退回到命令级 0。

13.7.1 退出方法

有三种方法退出正在执行的命令过程:

  • 把 EXIT 命令放入命令过程中
  • 把 STOP 命令放入命令过程中
  • 在程序执行期间输入 Ctrl/Y

使用 EXIT 命令退出

如果退出原因是过程结束或者 EXIT 命令,那么控制返回下一个更高的命令级。把一个值指定为 EXIT 命令的参数,可以把这个状态值返回给下一个更高的命令级。

如果在 DCL 级调用命令过程 SUB,而 SUB 又调用子例行程序 SUB1,那么发生以下事情:

  1. 退出 SUB1 就返回到 SUB 在调用 SUB1 之后的下一个命令行。
  2. 退出 SUB 就返回到 DCL 命令级。

使用 STOP 命令退出

如果退出原因是 STOP 命令,那么控制总是返回到 DCL 命令级,不管执行的 STOP 命令处于哪一个命令级。

如果在批量作业中执行 STOP 命令,批量作业就终止。

使用 Ctrl/Y 退出

按下 Ctrl/Y 可以中断命令过程,然后使用 EXIT 或 STOP 命令可终止这个过程。在这种情况下,EXIT 和 STOP 命令都返回到 DCL 级。

在以下例子中,按下 Ctrl/Y 可中断 TESTALL 过程。EXIT 命令终止这个过程的处理,并返回到 DCL 级。(注意,在中断过程后,也可以输入 STOP 命令 。)


$ @TESTALL[Return]
[Ctrl/Y]
$ EXIT[Return]
$

13.7.2 退出处理例行程序

中断命令过程时,如果中断的命令 (或映象) 声明任何退出处理例行程序,那么 EXIT 命令给出这些例行程序控制。然而,STOP 命令不执行这些例行程序。

13.8 处理出错

按照默认,命令出错或严重出错时,命令解释程序执行一个 EXIT 命令。这使过程退到上一个命令级。对于其他严重级 (成功、警告和通知),命令过程继续。

命令解释程序处理出错有一个例外方法。如果在命令过程中引用一个标号而这个标号不存在 (例如,如果包括命令 GOTO ERR1,而在这个过程中 ERR1 没有用作一个标号),那么 GOTO 命令发出一个警告并且退出命令过程。

当系统发出一个 EXIT 命令作为出错处理例行程序的一部分时,它把 $STATUS 的值传递给上一个命令级,并且有一个更改。命令解释程序把 $STATUS 的高端数字设置为 1,以便命令解释程序不会重新显示与这个状态值关联的消息。

在以下例子中,命令过程 TEST.COM 在输出文件说明中包含一个错误:


$ CREATE DUMMY.DAT\
THIS IS A TEST FILE
$ SHOW TIME

执行这个过程时,CREATE 命令用 $STATUS 返回错误,并且显示相应的消息。然后,命令解释程序检查 $STATUS 的值,确定已发生错误,发出 EXIT 命令并返回 $STATUS 的值。当这个过程退出时,这个出错消息不会重新显示,因为 CREATE 命令已经显示了这条消息一次。在 DCL 命令级,可以查看包含出错消息的 $STATUS,但是其高端数字已设置为 1。例如:


$ @TEST
%CREATE-E-OPENOUT, error opening DUMMY.DAT\ as output
-RMS-F-SYN, file specification syntax error
%DCL-W-SKPDAT, image data (records not beginning with "$") ignored
$ SHOW SYMBOL $STATUS
  $STATUS = "%X109110A2"
$ WRITE SYS$OUTPUT F$MESSAGE(%X109110A2)
  %CREATE-E-OPENOUT, error opening !AS as output

13.8.1 默认出错动作

以下表格描述当命令过程正在执行而发生出错条件或者 Ctrl/Y 中断时采取的默认动作。可以使用 ON、SET [NO]ON 和 SET [NO]CONTROL=Y 命令取代这些默认动作。

中断 默认动作
出错或严重出错 过程退出到下一个命令级。
在 DCL 命令级或命令级 1 按下Ctrl/Y  中断过程;如果没有其他映象强制它退出,那么这个过程可以继续。
在命令级 1 以下按下 Ctrl/Y 过程退出到下一个更高命令级。

13.9 其他处理出错方法

以下几节描述处理出错的其他方法。

13.9.1 ON 命令

如果发生一个严重或更严重的出错,那么 ON 命令指定要执行的动作。如果发生这样的出错,系统采取以下动作:

  • 执行 ON 命令指定的动作。
  • 设置 $STATUS 和 $SEVERITY 指出指定 ON 动作的结果。一般而言,$STATUS 和 $SEVERITY 设置为成功。
  • 重新设置默认出错动作 (如果出错或严重出错,就退出)。

一个 ON 命令动作只执行一次。因此,在命令过程执行 ON 命令指定的动作之后,其默认出错动作被重新设置。

ON 命令指定的动作只应用于执行这个命令所在的命令级。因此,如果在一个调用另一个过程的过程中执行一个 ON 命令,那么 ON 命令动作不应用于嵌套的过程。

ON 命令的格式如下所示:


ON condition THEN [$] command

在此,"condition" 是以下关键字之一:

ON 关键字 采取的动作
WARNING 如果有警告、出错或严重出错,命令过程就执行指定的动作。
ERROR 如果出错或严重出错,命令过程执行指定的动作。如果有警告,则过程继续。
SEVERE_ERROR 如果严重 (致命的) 出错,命令过程执行指定的动作。如果有警告或出错,则过程继续。

如果为特定严重级建立 ON 命令动作,那么当发生同级或更严重的出错时命令解释程序就执行指定的动作。当发生较轻的出错时,命令解释程序继续处理这个文件。

例子: 使用 ON 命令

这个命令可以用来取代默认出错处理,以便当发生警告、出错或严重出错时退出过程:


$ ON WARNING THEN EXIT

例子: 出错后恢复

如果命令过程包括这个命令,那么命令过程正常执行直到出错或严重出错为止:


$ ON ERROR THEN GOTO ERR1

如果发生这样的出错,那么过程在 ERR1 恢复执行。$STATUS 和 $SEVERITY 设置为成功,而默认出错动作被重新设置。如果在另一个 ON 或 SET NOON 命令执行之前发生第二个出错,那么这个过程退到上一个命令级。ON 命令指定的动作只应用于执行这个命令的命令级。因此,如果在一个调用另一个过程的过程中执行 ON 命令,那么 ON 命令动作不应用于嵌套的过程。

图 13-1 说明 ON 命令动作。

图 13-1 ON 命令动作


  1. 这个 ON 命令取代默认命令动作 (对于警告,继续;对于出错或严重出错,退出)。如果编译 A.FOR 时发生或严重出错,那么命令过程继续下一个命令。
  2. 如果上一个 ON 命令有效,默认命令动作就被重新设置。因而,如果编译 A.FOR 和 B.FOR 时出错或严重出错,那么命令过程就退出。
  3. 如果编译 C.FOR 时发生警告、出错或严重出错,命令过程就退出。
  4. 如果命令过程在一个命令执行之前不退出,这个命令动作就生效。

附录 B 中的样例命令过程 FORTUSER.COM 和 CALC.COM 也说明使用 ON 命令建立出错处理 。

13.10 使用 SET NOON 命令

在命令过程中使用 SET NOON 命令,把 ON 命令设置为 NO 状态,可以阻止命令解释程序检查从命令返回的状态。使用 SET NOON 命令时,命令解释程序继续把值放入 $STATUS 和 $SEVERITY,但不执行任何出错检查。使用 SET ON 命令或 ON 命令,可以恢复出错检查。

当过程撤消出错检查时,它可以在命令或程序执行之后明确地检查 $STATUS 的值。

在以下例子中,在 RUN 命令之前的 SET NOON 命令确保如果程序 TESTA 或 TESTB 返回一个出错条件时,命令过程就继续。SET ON 命令恢复命令解释程序的默认出错检查。


$ SET NOON
$ RUN TESTA
$ RUN TESTB
$ SET ON

在以下例子中,第一个 IF 命令检查 $STATUS 是否有真值 (即,如果它是奇数值)。如果有,FORTRAN 命令就成功,而 LINK 命令就执行。在 LINK 命令执行之后,再次测试 $STATUS。如果 $STATUS 是奇数,RUN 命令就执行;否则,RUN 命令不执行。SET ON 命令恢复当前的 ON 条件动作;即是说,在 SET NOON 命令执行之前的条件有效:


$ SET NOON
$ FORTRAN MYFILE
$ IF $STATUS THEN LINK MYFILE
$ IF $STATUS THEN RUN MYFILE
$ SET ON

SET ON 或 SET NOON 命令只应用于当前命令级;即是这个命令执行的命令级。如果在调用另一个命令过程的命令过程中使用 SET NOON 命令,那么默认出错检查机制将在嵌套的过程中有效。注意,在 DCL 级交互输入 SET NOON 没有意义。

13.11 处理 Ctrl/Y 中断

按照默认,当命令过程正在执行时按下 Ctrl/Y,命令解释程序在一个特殊的命令级 (称为 Ctrl/Y 命令级) 提示输入命令。在 Ctrl/Y 命令级,可以输入在命令解释程序中执行的 DCL 命令,然后用 CONTINUE 命令恢复命令过程的执行。另外,输入一个强制命令过程停止执行的 DCL 命令,您可以停止这个过程。

本节描述一些取代方法,命令过程使用 ON 命令处理 Ctrl/Y 中断。

13.11.1 停止命令过程

按下 Ctrl/Y,您可以中断正在交互执行的命令过程。您按下 Ctrl/Y 时,命令解释程序建立一个新命令级,称为 Ctrl/Y 级,并提示输入命令。当中断发生取决于正在执行的命令或程序时:

  • 如果这个命令本身被命令解释程序执行 (例如,IF、GOTO 或赋值语句),那么命令解释程序在 Ctrl/Y 级提示输入命令之前,这个命令就完成执行。
  • 如果这个命令或程序是一个独立映象 (即,一个不同于命令解释程序的映象),那么这个命令被中断,并且命令解释程序在 Ctrl/Y 级提示输入命令。

在 Ctrl/Y 级,命令解释程序存储所有以前建立命令级的状态,使它在任何 Ctrl/Y 中断之后都可以恢复到正确的状态。

在中断过程之后,您可以做以下事情:

  • 输入在命令解释程序中执行的 DCL 命令。
    这些命令是 SET VERIFY、SHOW TIME、SHOW TRANSLATION、ASSIGN、EXAMINE、DEPOSIT、SPAWN 和 ATTACH 命令。在输入一个或多个这些命令之后,可以用 CONTINUE 命令恢复过程的执行。有关在命令解释程序中执行的完整命令列表,请参阅 14.7.2 节
    当输入 CONTINUE 命令时,命令过程恢复执行中断的命令或程序或最近完成的命令行。
  • 输入执行另一个映象的 DCL 命令。
    输入调用新映象的任何命令时,命令解释程序返回到命令级 0 并执行这个命令。这会终止命令过程的执行。在新映象开始之前,允许执行中断映象说明的任何退出处理程序。
  • 输入 EXIT 或 STOP 命令终止命令过程的执行。
    如果使用 EXIT 命令,那么允许执行中断映象说明的退出处理程序。然而,STOP 命令不执行这些例行程序。

注意

如果在 Ctrl/Y 之后不退出命令过程 (明确地从命令级或者作为 ON 例行程序的一部分),那么您输入的下一个命令在这个命令过程的上下文中解释。例如,假设您在交互级定义以下符号:


$ MAIL = "mail/edit=(send,reply,forward)"

如果您输入 Ctrl/Y 中断一个不包括这个定义的命令过程,然后输入命令 MAIL 发送一条消息,就不会自动调用您的编辑程序。


前页 后页 目录 索引