HP OpenVMS Systems Documentation
OpenVMS User's Manual
14.14.1 Using Automatic Foreign Commands
Note the following:
14.14.2 Automatic Foreign Command Restrictions
Note the following restrictions:
$ PRINT LAB.DAT - /AFTER=17:00 - /COPIES=20 - /NAME="COMGUIDE"
When writing command lines:
$ ! Everything between the commands DECK and EOD $ ! is written to the file WEATHER.COM $ ! $ CREATE WEATHER.COM $ DECK $ FORTRAN SUMMER $ LINK SUMMER $ RUN SUMMER $ EOD $ ! $ ! Now execute WEATHER.COM $ @WEATHER $ EXIT
Note that command lines that do not begin with a dollar sign
might be correctly interpreted by DCL, but Compaq strongly
recommends that any DCL command line start with a dollar sign.
15.2 Using Labels in Command Lines
Labels are used in DCL command procedures to mark the beginning of loops, sections of code, or subroutines. Note the following rules when using labels:
As the command interpreter encounters labels, it enters them in a
special section of the local symbol table. The amount of space
available for labels is limited. If a command procedure uses many
symbols and contains many labels, the command interpreter might run out
of symbol table space and issue an error message. If this occurs,
include the DELETE/SYMBOL command in your procedure to delete symbols
as they are no longer needed. (Note, however, that you cannot delete
15.2.2 Duplicate Labels
If a command procedure uses the same label more than once, the new definition replaces the existing one in the local symbol table.
When duplicate labels exist, the GOTO command transfers control to the label that DCL has processed most recently. The GOTO command also uses the following rules when processing duplicate labels:
It is good programming practice to include comments in command procedures. Comments can be helpful when updating or troubleshooting the command procedure. Comments can be used as follows:
The following rules apply when writing comments in command procedures:
Before you begin writing a command procedure, perform the tasks interactively that the command procedure will execute. As you type the necessary commands, note any variables and conditionals that are used, and any iterations that occur.
The following sections contain the steps to write a simple command procedure. The example used throughout these sections is a command procedure called CLEANUP.COM. This procedure can be used to clean up a directory.
Follow these steps to write a command procedure:
|1||Design the command procedure.|
|2||Assign variables and test conditionals.|
|4||End the command procedure.|
|5||Test and debug the program logic.|
|6||Add cleanup tasks.|
|7||Finish the procedure.|
15.5.1 Step 1: Design the Command Procedure
Follow these steps to design a command procedure:
|1||Decide which tasks your procedure will perform.|
|2||Determine any variables your command procedure will use and how they will be loaded.|
|3||Determine what conditionals the command procedure requires and how you will test them.|
|4||Decide how you will exit from the command procedure.|
There are certain commands that are usually executed during clean up operations. The following table lists those commands and the tasks that they perform:
|DIRECTORY||Displays the contents of the current directory|
|TYPE filespec||Displays a file|
|PURGE filespec||Purges a file|
|DELETE filespec||Deletes a file|
|COPY filespec new-filespec||Copies a file|
Any data that changes when you perform a task is a variable. If you create or delete files in your directory, the file names will be different each time you clean your directory; therefore, the file names in CLEANUP.COM are variables.
Any command that must be tested each time you execute a command procedure is considered conditional. Because any or all of the commands in CLEANUP.COM might be executed, depending on the operation you need to perform, each command is conditional.
After you have determined what variables and conditionals you will use in the CLEANUP.COM command procedure, you must decide how to load the variables, test the conditionals, and exit from the command procedure. For the CLEANUP.COM command procedure, the following decisions have been made:
|Load variables||The command procedure gets the file names from the terminal.|
The command procedure:
|Exit from loop||You must enter the EXIT command to exit from the loop.|
To make command procedures easier to understand and maintain, write
statements so the procedures execute from the first command to the last
15.5.2 Step 2: Assign Variables and Test Conditionals
There are many ways to assign values to variables. In this section, we will discuss using the INQUIRE command. For additional methods, see Chapter 16.
Follow these steps to assign values to variables and test conditionals:
|1||Assign values to variables using the INQUIRE command.|
|2||Determine which action should be taken.|
|3||Test the conditional using IF and THEN statements.|
|4||Write program stubs and insert them into the command procedure as placeholders for commands.|
|5||Write error messages, if necessary.|
The INQUIRE command prompts for a value, reads the value from the terminal, and assigns the value to a symbol.
By default, the INQUIRE command:
The following command line is used in CLEANUP.COM to prompt the user for a command name. The INQUIRE command equates the value entered to the symbol COMMAND.
$ INQUIRE COMMAND- "Enter command (DELETE, DIRECTORY, PRINT, PURGE, TYPE)"
To preserve lowercase characters, multiple spaces and tabs when using
the INQUIRE command, enclose your response in quotation marks (" "). To
include quotation marks in your response, enclose the quoted text in
quotation marks (""text"").
184.108.40.206 Testing Conditionals Using IF and THEN
After the INQUIRE command prompts for a variable, the command procedure must include a statement that determines what action is to be taken. For example, to determine which command to execute, you must include statements in the command procedure that check the command entered by the user against each possible command.
To test whether a condition is true, use the IF and THEN commands. The following table shows the possibilities that you must check for in CLEANUP.COM:
|a match is found,||execute the command.|
|a match is not found,||go on to the next command.|
|no match is found after all valid commands have been checked,||output an error message.|
A program stub is a temporary section of code that you use in your procedure while you test the design. Usually, a program stub outputs a message stating the function that it is replacing. After the overall design works correctly, replace each stub with the correct coding.
The following example shows how to assign variables and test conditionals:
$ INQUIRE COMMAND- "Enter command (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE)" $ IF COMMAND .EQS. "EXIT" THEN EXIT $! $! Execute if user entered DELETE $ DELETE: $ IF COMMAND .NES "DELETE" THEN GOTO DIRECTORY (1) (2) $ WRITE SYS$OUTPUT "This is the DELETE section." (3) $! Execute if user entered DIRECTORY $ DIRECTORY: (4) $ IF COMMAND .NES "DIRECTORY" THEN GOTO PRINT $ WRITE SYS$OUTPUT "This is the DIRECTORY section." . . . $! Execute if user entered TYPE $ TYPE: $ IF COMMAND .NES "TYPE" THEN GOTO ERROR (5) $ WRITE SYS$OUTPUT "This is the TYPE section." $! $ ERROR: $ WRITE SYS$OUTPUT "You have entered an invalid command." (6) $! $ EXIT
As you examine the example, note the following:
A loop is a group of statements that execute repeatedly until a condition is met. A loop works as follows:
To write a loop, follow this procedure:
|1||Begin the loop with a label.|
|2||Test a variable to determine whether you need to execute the commands in the loop.|
|3||If you do not need to execute the loop, go to the end of the loop.|
|4||If you need to execute the loop, perform the commands in the body of the loop, then return to the beginning of the loop.|
|5||End the loop.|
The following example shows the usage of loops in the CLEANUP.COM command procedure:
$ GET_COM_LOOP: $ INQUIRE COMMAND- $ "Enter command (DELETE, DIRECTORY. EXIT, PRINT, PURGE, TYPE)" $ IF COMMAND .EQS. "EXIT" THEN GOTO END_LOOP $! $! Execute if user entered DELETE $ DELETE: $ IF COMMAND .NES. "DELETE" THEN GOTO DIRECTORY $ WRITE SYS$OUTPUT "This is the DELETE section." $ GOTO GET_COM_LOOP . . . $ END_LOOP: $ WRITE SYS$OUTPUT "Directory ''F$DIRECTORY()' has been cleaned" $ EXIT
Once a command executes, control is passed back to the GET_COM_LOOP label until a user enters the EXIT command. When an EXIT command is entered, the procedure outputs a message stating that the directory has been cleaned.