OpenVMS
ユーザーズ・マニュアル


前へ 次へ 目次 索引


B.8 FORTUSER.COM コマンド・プロシージャ

FORTRAN プログラムの作成,コンパイル,実行を行う会話型ユーザの,ターミナル環境を制御するシステム定義のログイン・コマンド・プロシージャのサンプルを示します。FORTUSER.COM が,ログイン・コマンド・プロシージャとしてリストされる専用アカウントにログインした場合は,FORTUSER.COM が受け入れるコマンドしか実行できません。このプロシージャは,レキシカル関数を使用してオプション・テーブルを参照し,ユーザが入力したコマンドと有効なコマンドのリストとを比較する方法も示しています。

例: FORTUSER.COM


 
 
$ ! Procedure to create, compile, link, execute, and debug 
$ ! FORTRAN programs.  Users can enter only the commands listed 
$ ! in the symbol OPTION_TABLE. 
$ SET NOCONTROL=Y                                          (1)
$ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE")
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(0)
$ OPTION_TABLE = "EDIT/COMPILE/LINK/RUN/EXECUTE/DEBUG/PRINT/HELP/FILE/DONE/"  (2)
$ TYPE SYS$INPUT                                           (3)
 
        VMS FORTRAN Command Interpreter 
 
        Enter name of file with which you would like to work. 
$ ! 
$ ! Set up for initial prompt 
$ ! 
$ PROMPT = "INIT"                                          (4)
$ GOTO HELP                      ! Print the initial help message 
$ ! 
$ ! after the first prompting message, use the prompt: Command 
$ ! 
$ INIT: 
$ PROMPT = "GET_COMMAND" 
$ GOTO FILE                      ! Get initial file name 
$ ! 
$ ! Main command parsing routine.  The routine compares the current 
$ ! command against the options in the option table.  When it finds 
$ ! a match, it branches to the appropriate label. 
$ ! 
$ GET_COMMAND: 
$       ON CONTROL_Y THEN GOTO GET_COMMAND     ! Ctrl/Y resets prompt  (5)
$       SET CONTROL=Y 
$       ON WARNING THEN GOTO GET_COMMAND       ! If any, reset prompt 
$       INQUIRE COMMAND "Command" 
$       IF COMMAND .EQS. "" THEN GOTO GET_COMMAND 
$       IF F$LOCATE(COMMAND + "/", OPTION_TABLE).EQ. F$LENGTH(OPTION_TABLE)- (6)
               THEN GOTO INVALID_COMMAND 
$       GOTO 'COMMAND' 
$ ! 
$ INVALID_COMMAND:                                         (7)
$       WRITE SYS$OUTPUT " Invalid command" 
$ ! 
$ HELP:                                                    (8)
$       TYPE SYS$INPUT 
        The commands you can enter are: 
        FILE      Name of FORTRAN program in your current 
                  default directory.  Subsequent commands 
                  process this file. 
        EDIT      Edit the program. 
        COMPILE   Compile the program with FORTRAN. 
        LINK      Link the program to produce an executable image. 
        RUN       Run the program's executable image. 
        EXECUTE   Same function as COMPILE, LINK, and RUN. 
        DEBUG     Run the program under control of the debugger. 
        PRINT     Queue the most recent listing file for printing. 
        DONE      Return to interactive command level. 
        HELP      Print this help message. 
 
        Enter Ctrl/Y to restart this session 
$ GOTO 'PROMPT'                                            (9)
$ EDIT:                                                    (10)
$       DEFINE/USER_MODE SYS$INPUT SYS$COMMAND: 
$       EDIT 'FILE_NAME'.FOR 
$       GOTO GET_COMMAND 
$ COMPILE: 
$       FORTRAN 'FILE_NAME'/LIST/OBJECT/DEBUG 
$       GOTO GET_COMMAND 
$ LINK: 
$       LINK 'FILE_NAME'/DEBUG 
$       PURGE 'FILE_NAME'.*/KEEP=2 
$       GOTO GET_COMMAND 
$ RUN: 
$       DEFINE/USER_MODE SYS$INPUT SYS$COMMAND: 
$       RUN/NODEBUG 'FILE_NAME' 
$       GOTO GET_COMMAND 
$ DEBUG: 
$       DEFINE/USER_MODE SYS$INPUT SYS$COMMAND: 
$       RUN 'FILE_NAME' 
$       GOTO GET_COMMAND 
$ EXECUTE: 
$       FORTRAN 'FILE_NAME'/LIST/OBJECT 
$       LINK/DEBUG 'FILE_NAME' 
$       PURGE 'FILE_NAME'.*/KEEP=2 
$       RUN/NODEBUG 'FILE_NAME' 
$       GOTO GET_COMMAND 
$ PRINT: 
$       PRINT 'FILE_NAME' 
$       GOTO GET_COMMAND 
$ BADFILE:                                                 (11)
$       WRITE SYS$OUTPUT "File must be in current default directory." 
$ FILE: 
$       INQUIRE FILE_NAME "File name" 
$       IF FILE_NAME .EQS. "" THEN GOTO FILE 
$       IF F$PARSE(FILE_NAME,,,"DIRECTORY").NES. F$DIRECTORY()-  (12)
        THEN GOTO BADFILE 
$       FILE_NAME = F$PARSE(FILE_NAME,,,"NAME")
$       GOTO GET_COMMAND 
$ DONE: 
$ EXIT 

FORTUSER.COM コマンド・プロシージャの説明

  1. SET NOCONTROL=Y コマンドは,このプロシージャの制御下でログインするユーザが,プロシージャまたはプロシージャの中のコマンドやプログラムに割り込めないようにする。

  2. このオプション・テーブルには,ユーザが実行できるコマンドがリストされる。それぞれのコマンドはスラッシュによって区切られている。

  3. プロシージャ自体を示している。

  4. シンボル名 PROMPT にプロシージャの中のラベルの値が割り当てられる。プロシージャを初めて起動するとき,このシンボルの値は INIT になる。HELP コマンド・テキストは,PROMT ラベルを指定する GOTO コマンドで終了する。このテキストを初めて表示する場合には,GOTO コマンドの結果,HELP ラベルに分岐する。このとき,ユーザが入力可能なコマンドを示す HELP メッセージが表示される。次に,プロシージャは INIT ラベルに戻って,そこで PROMT の値を "GET_COMMAND" に変更し,最後に,FILE ラベルに分岐して,ファイル名を得る。これ以降は,ヘルプ・テキストが表示されると,GET_COMMAND ラベルに分岐して,次のコマンドを得る。

  5. Ctrl/Y 条件アクションが,警告条件アクションと同じように,GET_COMMAND ラベルに戻るように設定される。プロシージャは,コマンドを求めるプロンプトを出し,入力があるまでプロンプトを出し続ける。セッションを終了して会話型コマンド・レベルに戻るには,DONE コマンドを入力する。

  6. F$LOCATE レキシカル関数と F$LENGTH レキシカル関数を使用して,オプションのリストにコマンドが指定されているかどうかを判別する。F$LOCATE 関数は,ユーザが入力したコマンドで末尾にスラッシュが付くものを検索する。たとえば,EDIT と入力すると,EDIT/ を検索する。オプション・リストにコマンドが指定されていない場合には,プロシージャは INVALID_COMMAN ラベルに分岐する。オプション・リストにコマンドが指定されている場合は,該当するラベルに分岐する。

  7. INVALID_COMMAND ラベルで,プロシージャはエラー・メッセージを出し,有効なコマンドの一覧を示すヘルプ・テキストを表示する。

  8. ヘルプ・テキストには,有効なコマンドがリストされる。このテキストは一番最初に表示される。また,ユーザが HELP コマンドや無効なコマンドを入力したときも表示される。

  9. HELP テキストの末尾の GOTO コマンドはシンボル名 PROMPT を指定している。このプロシージャを初めて起動するとき,このシンボルはINIT の値になり,それ以降は GET_COMMAND の値になる。

  10. リストの中の有効な各コマンドは,オプション・テーブルに対応するエントリを持ち,コマンド・プロシージャの中に対応するラベルを持つ。ターミナルから入力を読み込む EDIT などのコマンドの場合は,入力ストリームを SYS$COMMAND として定義する DEFINE コマンドがプロシージャに含まれる。

  11. BADFILE ラベルで,プロシージャはファイルが現在のディレクトリになくてはならないことを示すメッセージを表示する。次に,別のファイル名を求めるプロンプトを出す。

  12. ファイル名を得ると,現在の省略時のディレクトリ以外のディレクトリをユーザが指定しなかったかどうかをチェックする。ここで F$PARSE 関数を使用して,ファイル名を取り出す(それぞれのコマンドには,該当する省略時のファイル・タイプがある)。次に,GET_COMMAND ラベルに戻って,ファイルを処理するコマンドを得る。

FORTUSER.COM コマンド・プロシージャの実行結果例

この例は,このコマンド・プロシージャを専用コマンド・プロシージャとして使用する方法を示しています。


Username: CLASS30
Password:
 
            OpenVMS Version 7.1
 
    OpenVMS FORTRAN Command Interpreter
 
    Enter name of file with which you would like to work.
 
    The commands you can enter are:
 
    FILE       Name of FORTRAN program in your current
               default directory.  Subsequent commands
               process this file.
    EDIT       Edit the program.
    COMPILE    Compile the program with VAX FORTRAN.
    LINK       Link the program to produce an executable image.
    RUN        Run the program's executable image.
    EXECUTE    Same function as COMPILE, LINK and RUN.
    DEBUG      Run the program under control of the debugger.
    PRINT      Queue the most recent listing file for printing.
    DONE       Return to interactive command level.
    HELP       Print this help message.
 
    Enter Ctrl/Y to restart this session
File name: AVERAGE
Command: COMPILE
Command: LINK
Command: RUN
Command: FILE
File name: READFILE
Command: EDIT

このサンプル実行は,CLASS30 というユーザが FORTUSER コマンド・プロシージャによって制御されるアカウントにログインするときのセッションを示しています。FORTUSER コマンド・プロシージャは,ユーザが実行できるコマンドと,セッションを再開するための命令を表示します。次に,ユーザが AVERAGE ファイルを指定して,それをコンパイル,リンク,実行します。この後,ユーザは FILE コマンドを入力して,別のファイルで作業を開始します。

B.9 LISTER.COM コマンド・プロシージャ

入力データを求めるプロンプトを出し,データを桁揃えしてからソートし,出力ファイルに書き込みます。このプロシージャは,READ と WRITE コマンドとともに,割り当て文の部分文字列オーバレイ形式を示しています。

例: LISTER.COM


 
 
$ ! Procedure to accumulate programmer names and document file names. 
$ ! After all programmer names and file names are entered, they are 
$ ! sorted in alphabetic order by programmer name and printed on 
$ ! the system printer. 
$ ! 
$ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE")       (1)
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(0)
$ ! 
$ OPEN/WRITE OUTFILE DATA.TMP         ! Create output file (2)
$ ! 
$ ! Loop to obtain programmers' last names and file names, 
$ ! and write this data to DATA.TMP. 
$ ! 
$ LOOP:                                                    (3)
$        INQUIRE NAME "Programmer(press Return to quit)" 
$        IF NAME .EQS. "" THEN GOTO FINISHED 
$        INQUIRE FILE "Document file name" 
$        RECORD[0,20]:='NAME'                              (4)
$        RECORD[21,20]:='FILE' 
$        WRITE OUTFILE RECORD 
$        GOTO LOOP 
$ FINISHED: 
$        CLOSE OUTFILE 
$ ! 
$ DEFINE/USER_MODE SYS$OUTPUT: NL:   ! Suppress sort output 
$ SORT/KEY=(POSITION:1,SIZE=20)DATA.TMP DOC.SRT           (5)
$ ! 
$ OPEN/WRITE OUTFILE DOCUMENT.DAT                          (6)
$ WRITE OUTFILE "Programmer Files as of ",F$TIME()
$ WRITE OUTFILE "" 
$ RECORD[0,20]:="Programmer Name" 
$ RECORD[21,20]:="File Name" 
$ WRITE OUTFILE RECORD 
$ WRITE OUTFILE "" 
$ ! 
$ CLOSE OUTFILE                                            (7)
$ APPEND DOC.SRT DOCUMENT.DAT 
$ PRINT DOCUMENT.DAT 
$ ! 
$ INQUIRE CLEAN_UP "Delete temporary files [Y,N]"          (8)
$ IF CLEAN_UP THEN DELETE DATA.TMP;*,DOC.SRT;* 
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(SAVE_VERIFY_PROCEDURE,SAVE_VERIFY_IMAGE)
$ EXIT 

LISTER.COM コマンド・プロシージャの説明

  1. LISTER.COM は,現在のチェック設定値をセーブして,チェックをオフに設定する。

  2. OPEN コマンドが書き込み用の一時ファイルをオープンする。

  3. INQUIRE コマンドは,プログラマ名とファイル名を求めるプロンプトを出す。INQUIRE コマンドのプロンプトに対して Return と表示される空の行を入力すると,プロシージャは,これ以上入力されるデータがないとみなして,FINISHED ラベルに分岐する。

  4. シンボル NAME と FILE に値を割り当てた後,割り当て文の文字列オーバレイ形式を使用して,RECORD シンボルの値を構築する。RECORD の 1 〜 21 桁には,NAME の現在の値が書き込まれる。コマンド・インタプリタは,NAME の値にスペースを埋め込んで,指定された 20 文字の長さにする。

    同様に,RECORD の次の 20 桁に FILE の値が埋め込まれると,RECORD の値が出力ファイルに書き込まれる。

  5. ファイルがクローズされると,プロシージャは出力ファイルDATA.TMP をソートする。DEFINE コマンドは,SORT コマンド出力を空のファイルである NL に向ける。これ以外の場合は,これらの統計情報はターミナルに表示される。

    ソート操作は,最初の 20 桁,すなわちプログラマ名によって実行される。

    ソート済み出力ファイルには,DOC.SRT の名前が付けられる。

  6. OPEN コマンドで最終的な出力ファイルである DOCUMENT.DAT を作成する。ファイルに書き込まれる最初の数行はヘッダ行で,タイトル,日時,カラムの見出しが示される。

  7. DOCUMENT.DAT ファイルをクローズして,ソート済み出力ファイル DOC.SRT をこのファイルに追加する。次に,出力ファイルはシステム・プリンタのキューに登録される。

  8. 最後に,中間ファイルを削除するかどうかを決定するようにプロンプトを出す。INQUIRE コマンド・プロンプトに対して真の応答(T,t,Y,または y)を入力すると,ファイル DATA.TMP と DOC.SRT は削除される。偽の応答を入力すると,この 2 つのファイルは保管される。

LISTER.COM コマンド・プロシージャ実行結果例


$ @LISTER
Programmer: WATERS
Document file name: CRYSTAL.CAV
Programmer: JENKINS
Document file name: MARIGOLD.DAT
Programmer: MASON
Document file name: SYSTEM.SRC
Programmer: ANDERSON
Document file name: JUNK.J
Programmer: [Return]
Delete temporary files [Y,N]:y

このプロシージャを実行して得られる出力ファイルは次のようになります。


Programmer Files as of 31-DEC-1999 16:18:58.79 
 
Programmer Name      File Name 
 
ANDERSON             JUNK.J 
JENKINS              MARIGOLD.DAT 
MASON                SYSTEM.SRC 
WATERS               CRYSTAL.CAV 

B.10 CALC.COM コマンド・プロシージャ

算術計算を行い,その結果を16 進値と 10 進値に変換します。

例: CALC.COM


 
 
$ ! Procedure to calculate expressions.  If you enter an 
$ ! assignment statement, then CALC.COM evaluates the expression 
$ ! and assigns the result to the symbol you specify.  In the next 
$ ! iteration, you can use either your symbol or the symbol Q to 
$ ! represent the current result. 
$ ! 
$ ! If you enter an expression, then CALC.COM evaluates the 
$ ! expression and assigns the result to the symbol Q.  In 
$ ! the next iteration, you can use the symbol Q to represent 
$ ! the current result. 
$ ! 
$ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE")
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(0)
$ START: 
$     ON WARNING THEN GOTO START                           (1)
$     INQUIRE STRING "Calc"                                (2)
$     IF STRING .EQS. "" THEN GOTO CLEAN_UP 
$     IF F$LOCATE("=",STRING).EQ. F$LENGTH(STRING)THEN GOTO EXPRESSION 
$ ! 
$ ! Execute if string is in the form symbol = expression 
$ STATEMENT:                                               (3)
$     'STRING' ! Execute assignment statements 
$     SYMBOL = F$EXTRACT(0,F$LOCATE("=",STRING)-1,STRING)! get symbol name 
$     Q = 'SYMBOL'        ! Set up q for future iterations 
$     LINE = F$FAO("Decimal = !SL       Hex = !-!XL      Octal = !-!OL",Q)
$     WRITE SYS$OUTPUT LINE 
$     GOTO START 
$ ! 
$ ! 
$ ! Execute if string is an expression 
$ EXPRESSION:                                              (4)
$     Q = F$INTEGER('STRING')        ! Can use Q in next iteration 
$     LINE = F$FAO("Decimal = !SL       Hex = !-!XL      Octal = !-!OL",Q)
$     WRITE SYS$OUTPUT LINE 
$     GOTO START 
$ ! 
$ CLEAN_UP: 
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(SAVE_VERIFY_PROCEDURE,SAVE_VERIFY_IMAGE)
$ EXIT 

CALC.COM コマンド・プロシージャの説明

  1. プロシージャを再開するエラー処理条件を設定する。警告またはそれ以上の重大度を持つエラーが生じると,プロシージャは始めに戻って,ON 条件を再設定する。

    この方法を使用すると,ユーザが式を間違って入力してもプロシージャは終了しない。

  2. INQUIRE コマンドは,算術式を求めるプロンプトを出す。プロシージャは,次のいずれかの形式の式を受け入れる。


    名前 = 式 
    



    ユーザが Return を押すと,プロシージャは,CALC セッションが終わったとみなして,終了する。

    ユーザが "名前 = 式" 形式で入力した場合は,プロシージャは STATEMENT ラベルで実行を継続し,そうでない場合は,EXPRESSION ラベルに分岐する。

  3. 割り当て文を実行して,式の結果をシンボルに割り当てる。次に,シンボル名を取り出して,シンボルの値を Q に割り当てる。こうしておくと,ユーザは,次にプロシージャを反復するときに Q を使用することもできるし,シンボルを使用することもできる。次に,プロシージャはこの結果を表示し,START ラベルに戻る。

  4. 式を評価して,評価結果を Q シンボルに割り当てる。ユーザは,次にプロシージャを反復するときに Q を使用できる。次に,この結果を表示して START ラベルに戻る。

CALC.COM コマンド・プロシージャの実行結果例


$ @CALC
Calc: 2 * 30
Decimal = 60        Hex = 0000003C  Octal = 00000000074
Calc: Q + 3
Decimal = 63        Hex = 0000003F  Octal = 00000000077
Calc: TOTAL = Q + 4
Decimal = 67        Hex = 00000043  Octal = 00000000103
Calc: 5 + 7
Decimal = 12    Hex = 0000000C  Octal = 00000000014 
Calc:[Return]
$

プロシージャからのプロンプトの 1 つ 1 つに,ユーザは算術式を入力します。プロシージャはその結果を 10 進数,16 進数,8 進数で表示します。データのない行で Return を押しただけの空の行で CALC セッションは終わりです。

B.11 BATCH.COM コマンド・プロシージャ

コマンド文字列,コマンド・プロシージャ,コマンドのリストのうちのいずれかを受け取って,バッチ・ジョブとして実行します。

例: BATCH.COM


 
$ VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE")
$ VERIFY_PROCEDURE = F$VERIFY(0)
$! 
$! Turn off verification and save current settings. 
$!(This comment must appear after you turn verification 
$! off; otherwise it will appear in the batch job log file.)
$! 
$! 
$! If this is being executed as a batch job, 
$!(from the SUBMIT section below)go to the EXECUTE_BATCH_JOB section 
$! Otherwise, get the information you need to prepare to execute the 
$! batch job. 
$! 
$ IF F$MODE().EQS. "BATCH" THEN GOTO EXECUTE_BATCH_JOB    (1)
$! 
$! 
$! Prepare to submit a command(or a command procedure)as a batch job. 
$! First, determine a mnemonic process name for the batch job.  Use the 
$! following rules: 
$! 
$! 1)If the user is executing a single command, then use the verb name. 
$!    Strip off any qualifiers that were included with the command. 
$! 2)If the user is executing a command procedure, then use the file name. 
$! 3)Otherwise, use BATCH. 
$! 
$ JOB_NAME = P1         (2)
$ IF JOB_NAME .EQS. "" THEN JOB_NAME = "BATCH" 
$ IF F$EXTRACT(0,1,JOB_NAME).EQS. "@" THEN JOB_NAME = F$EXTRACT(1,999,JOB_NAME)
$ JOB_NAME = F$EXTRACT(0,F$LOCATE("/",JOB_NAME),JOB_NAME)
$ JOB_NAME = F$PARSE(JOB_NAME,,,"NAME","SYNTAX_ONLY")
$ IF JOB_NAME .EQS. "" THEN JOB_NAME = "BATCH" 
$! 
$! 
$! Get the current default device and directory. 
$! 
$ ORIGDIR = F$ENVIRONMENT("DEFAULT")
$! 
$! 
$! Concatenate the parameters to form the command string to be executed. 
$! If the user did not enter a command string, the symbol COMMAND will have 
$! a null value. 
$! 
$ COMMAND = P1 + " " + P2 + " " + P3 + " " + P4 + " " + -  (3)
            P5 + " " + P6 + " " + P7 + " " + P8 
$! 
$! 
$! If the user is executing a single command and if both the command and the 
$! original directory specification are small enough to be passed as 
$! parameters to the SUBMIT command, then submit the batch job now 
$! 
$ IF(P1 .NES. "").AND.(F$LENGTH(COMMAND).LE. 255).AND. -    (4)
       (F$LENGTH(ORIGDIR).LE. 255)THEN GOTO SUBMIT 
$! 
$! 
$! If the single command to be executed in the batch job is very large, or 
$! if you have to prompt for commands to execute in the batch job, then 
$! create a temporary command procedure to hold those commands and get the 
$! fully expanded name of the command procedure. 
$! 
$ CREATE_TEMP_FILE: 
$   ON CONTROL_Y THEN GOTO CONTROL_Y_HANDLER               (5)
$   OPEN/WRITE/ERROR=FILE_OPEN_ERROR TEMPFILE SYS$SCRATCH:'JOB_NAME'.TMP (6)
$   FILESPEC = F$SEARCH("SYS$SCRATCH:" + JOB_NAME + ".TMP")
$! 
$!  By default, have the batch job continue if it encounters any errors. 
$! 
$   WRITE TEMPFILE "$ SET NOON" 
$! 
$!  Either write the single large command to the file, or prompt for 
$!  multiple commands and write them to the file. 
$! 
$   IF COMMAND .NES. "       " THEN GOTO WRITE_LARGE_COMMAND 
$ 
$   LOOP: 
$       READ /END_OF_FILE=CLOSE_FILE /PROMPT="Command: " SYS$COMMAND COMMAND 
$       IF COMMAND .EQS. "" THEN GOTO CLOSE_FILE 
$       WRITE TEMPFILE "$ ",COMMAND 
$       GOTO LOOP 
$ 
$ WRITE_LARGE_COMMAND: 
$   WRITE TEMPFILE "$ ",COMMAND 
$ 
$! 
$! Finish the temporary file by defining a symbol so that you will know 
$! the name of the command procedure to delete and then close the file. 
$! Define the symbol COMMAND to mean "execute the command procedure 
$! you have just created".  Then submit the batch job and execute 
$! this command procedure in the batch job. 
$! 
$ CLOSE_FILE:                                              (7)
$   WRITE TEMPFILE "$ BATCH$DELETE_FILESPEC == """,FILESPEC,"""" 
$   CLOSE TEMPFILE 
$   ON CONTROL_Y THEN EXIT 
$   COMMAND = "@" + FILESPEC 
$! 
$! 
$! Submit BATCH.COM as a batch job, and pass it two parameters. 
$! P1 is the command(or name of the command procedure)to execute. 
$! P2 is the directory from which to execute the command. 
$! 
$ SUBMIT:                                                  (8)
$   SUBMIT/NOTIFY/NOPRINT 'F$ENVIRONMENT("PROCEDURE")' /NAME='JOB_NAME' - 
          /PARAMETERS=("''COMMAND'","''ORIGDIR'")
$   GOTO EXIT 
$! 
$! 
$! The user pressed Ctrl/Y while the temporary command procedure was open. 
$! Close the command procedure, delete it if it exists, and exit. 
$! 
$ CONTROL_Y_HANDLER:                                       (9)
$   CLOSE TEMPFILE 
$   IF F$TYPE(FILESPEC).NES. "" THEN DELETE/NOLOG 'FILESPEC' 
$   WRITE SYS$OUTPUT "Ctrl/Y caused the command procedure to abort." 
$   GOTO EXIT 
$! 
$! 
$! The temporary command procedure could not be created. 
$! Notify the user and exit. 
$! 
$ FILE_OPEN_ERROR:                                         (10)
$   WRITE SYS$OUTPUT "Could not create sys$scratch:",job_name,".tmp" 
$   WRITE SYS$OUTPUT "Please correct the situation and try again." 
$! 
$! 
$! Restore the verification states and exit. 
$! 
$ EXIT:                                                    (11)
$  VERIFY_PROCEDURE = F$VERIFY(VERIFY_PROCEDURE,VERIFY_IMAGE)
$  EXIT 
$! 
$! 
$! BATCH.COM was invoked as a batch job.  P1 contains the command 
$! to execute and P2 the default directory specification. 
$! Return a status code that indicates the termination status of P1. 
$! 
$ EXECUTE_BATCH_JOB:                                      (12)
$    SET NOON 
$    VERIFY_PROCEDURE = F$VERIFY(VERIFY_PROCEDURE,VERIFY_IMAGE)
$    SET DEFAULT 'P2' 
$    'P1' 
$    IF F$TYPE(BATCH$DELETE_FILESPEC).EQS. "" THEN EXIT $STATUS 
$    STATUS = $STATUS 
$    DELETE /NOLOG 'BATCH$DELETE_FILESPEC' 
$    EXIT STATUS 

BATCH.COM コマンド・プロシージャの説明

  1. この IF 文は,BATCH.COM がバッチ・モードで実行されているかどうかをテストする。BATCH.COM を会話形式で起動した場合,バッチ・ジョブとして実行されるコマンド文字列またはコマンド・プロシージャをパラメータとして指定する。パラメータを指定しないと,BATCH.COM はコマンドを求めるプロンプトを出し,これらのコマンドをファイルに書き込んでから,このコマンド・プロシージャをバッチ・ジョブとして実行する。

    バッチ・ジョブから 1 つまたは複数のコマンドを実行する準備が整うと,BATCH.COM は SUBMIT コマンドを使用して BATCH.COM 自体をバッチ・ジョブとしてキューに登録し,このジョブからコマンドを実行する(注 8 を参照)。BATCH.COM をバッチ・ジョブとして起動した場合には,プロシージャは EXECUTE_BATCH_JOB ラベルに分岐する。BATCH.COM をバッチ・モードで実行するときには,実行するコマンドまたはコマンド・プロシージャを P1 として,省略時のディレクトリを P2 として指定しなければならない。

  2. これらのコマンドは,バッチ・ジョブの実行準備を行う。最初に,バッチ・ジョブの名前を構築する。コマンド文字列が渡された場合,BATCH.COM は動詞名をジョブ名として使用し,コマンド・プロシージャが渡された場合は,ファイル名を使用する。入力が渡されなかった場合には,ジョブに BATCH という名前を付ける。

  3. パラメータを連結して,実行するコマンド文字列にする。コマンド文字列は COMMAND シンボルに割り当てられる。

  4. SUBMIT コマンドは,255 文字より長いパラメータは渡すことができない。したがって,プロシージャは,コマンド文字列とディレクトリ名の長さが 255 文字未満になっているかどうかをテストする。両方の文字列が 255 文字未満であり,ユーザが実際にはコマンド文字列を渡した場合には,SUBMIT ラベルに分岐する。

  5. Ctrl/Y ハンドラが設定されるので,コマンド・プロシージャのこのセクションでユーザが Ctrl/Y を押すと,クリーンアップ処理が実行される。

  6. 実行するコマンドを収める一時ファイルを作成する。ユーザが長いコマンド文字列を指定した場合は,プロシージャは WRITE_LARGE_COMMAND に分岐して,このコマンドを一時ファイルに書き込む。そうでない場合には,実行するコマンドを求めるプロンプトを出す。それぞれのコマンドは一時ファイルに書き込まれる。

  7. 一時ファイルをクローズする前に,シンボル割り当て文をファイルに書き込むようにする。この文は,一時ファイルのファイル名を BATCH$DELETE_FILESPEC シンボルに割り当てる。一時ファイルをクローズした後,プロシージャは省略時の Ctrl/Y ハンドラを再設定する。次に,COMMAND シンボルを定義して,実行時に COMMAND シンボルが一時コマンド・ファイルを起動するようにする。

  8. 定義されたジョブ名を使用して,プロシージャ自体をバッチ・ジョブとしてキューに登録する(注 2 を参照)。また,実行するコマンドまたはコマンド・プロシージャと,コマンドを実行するディレクトリの 2 つのパラメータも渡す。次に,EXIT ラベルに分岐する(注 11 を参照)。

  9. 一時ファイルの作成中にユーザが Ctrl/Y を押すと,ここのセクションでクリーンアップ処理を実行する。

  10. このセクションは,一時ファイルを作成できないときにエラー・メッセージを作成する。

  11. 元のチェック設定値を再設定してから終了する。

  12. これらのコマンドは,BATCH.COM がバッチ・モードで実行されるときに実行される。最初に,ON エラー処理機能が使用可能になり,ユーザの省略時のチェック設定値が設定される。次に,省略時の値が P2 によって示されるディレクトリに設定され,P1 によって示されるコマンドまたはコマンド・プロシージャが実行される。一時ファイルが作成された場合には,このファイルは削除される。BATCH$DELETE_FILESPEC を削除する前に,P1 の完了状態がセーブされる。この完了状態は EXIT コマンドによって戻される。

BATCH.COM コマンド・プロシージャの実行結果例


$ @BATCH RUN MYPROG
Job RUN(queue SYS$BATCH, entry 1715)started on SYS$BATCH

この例は,BATCH.COM を使用して,バッチ・ジョブの中からプログラムを実行しています。


前へ 次へ 目次 索引