|
≫ |
|
|
|
OpenVMS
OpenVMS ユーザーズ・マニュアル
- この IF 文は,BATCH.COM がバッチ・モードで実行されているかどうかをテストする。BATCH.COM を会話形式で起動した場合,バッチ・ジョブとして実行されるコマンド文字列またはコマンド・プロシージャをパラメータとして指定する。パラメータを指定しないと,BATCH.COM はコマンドを求めるプロンプトを出し,これらのコマンドをファイルに書き込んでから,このコマンド・プロシージャをバッチ・ジョブとして実行する。
バッチ・ジョブから 1 つまたは複数のコマンドを実行する準備が整うと, BATCH.COM は SUBMIT コマンドを使用して BATCH.COM 自体をバッチ・ジョブとしてキューに登録し,このジョブからコマンドを実行する (注 8 を参照)。 BATCH.COM をバッチ・ジョブとして起動した場合には,プロシージャは EXECUTE_BATCH_JOB ラベルに分岐する。BATCH.COM をバッチ・モードで実行するときには,実行するコマンドまたはコマンド・プロシージャを P1 として,省略時のディレクトリを P2 として指定しなければならない。
- これらのコマンドは,バッチ・ジョブの実行準備を行う。最初に,バッチ・ジョブの名前を構築する。コマンド文字列が渡された場合, BATCH.COM は動詞名をジョブ名として使用し,コマンド・プロシージャが渡された場合は,ファイル名を使用する。入力が渡されなかった場合には,ジョブに BATCH という名前を付ける。
- パラメータを連結して,実行するコマンド文字列にする。コマンド文字列は COMMAND シンボルに割り当てられる。
- SUBMIT コマンドは,255 文字より長いパラメータは渡すことができない。したがって,プロシージャは,コマンド文字列とディレクトリ名の長さが 255 文字未満になっているかどうかをテストする。両方の文字列が 255 文字未満であり,ユーザが実際にはコマンド文字列を渡した場合には,SUBMIT ラベルに分岐する。
- Ctrl/Y ハンドラが設定されるので,コマンド・プロシージャのこのセクションでユーザが Ctrl/Y を押すと,クリーンアップ処理が実行される。
- 実行するコマンドを収める一時ファイルを作成する。ユーザが長いコマンド文字列を指定した場合は,プロシージャは WRITE_LARGE_COMMAND に分岐して,このコマンドを一時ファイルに書き込む。そうでない場合には,実行するコマンドを求めるプロンプトを出す。それぞれのコマンドは一時ファイルに書き込まれる。
- 一時ファイルをクローズする前に,シンボル割り当て文をファイルに書き込むようにする。この文は,一時ファイルのファイル名を BATCH$DELETE_FILESPEC シンボルに割り当てる。一時ファイルをクローズした後,プロシージャは省略時の Ctrl/Y ハンドラを再設定する。次に,COMMAND シンボルを定義して,実行時に COMMAND シンボルが一時コマンド・ファイルを起動するようにする。
- 定義されたジョブ名を使用して,プロシージャ自体をバッチ・ジョブとしてキューに登録する (注 2 を参照)。また,実行するコマンドまたはコマンド・プロシージャと,コマンドを実行するディレクトリの 2 つのパラメータも渡す。次に,EXIT ラベルに分岐する (注 11 を参照)。
- 一時ファイルの作成中にユーザが Ctrl/Y を押すと,ここのセクションでクリーンアップ処理を実行する。
- このセクションは,一時ファイルを作成できないときにエラー・メッセージを作成する。
- 元のチェック設定値を再設定してから終了する。
- これらのコマンドは,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 を使用して,バッチ・ジョブの中からプログラムを実行しています。
PASCAL または FORTRAN で書かれたファイルのコンパイル,リンク,実行を行います。処理するファイルを求めるプロンプトを出し,ファイル・タイプが PAS か FOR かを判別します。ファイル・タイプが PAS でも FOR でもない場合,またはファイルが現在の省略時のディレクトリに存在しない場合には,該当するエラー・メッセージを出力します。このプロシージャは,IF-THEN-ELSE 言語構成の使用方法を示しています。
例: COMPILE_FILE.COM
$! This command procedure compiles, links, and runs a file written in Pascal
$! or FORTRAN.
$!
$ ON CONTROL_Y THEN EXIT
$!
$ TOP:
$ INQUIRE FILE "File to process"
$ IF F$SEARCH(FILE) .NES. "" (1)
$ THEN
$ FILE_TYPE = F$PARSE(FILE,,,"TYPE") (2) ! determine file type
$ FILE_TYPE = F$EXTRACT(1,F$LENGTH('FILE_TYPE'),FILE_TYPE) ! remove period
$! Remove type from file specification
$ PERIOD_LOC = F$LOCATE(".",FILE)
$ FILE = F$EXTRACT(0,PERIOD_LOC,FILE)
$ ON WARNING THEN GOTO OTHER
$ GOTO 'FILE_TYPE'
$ ELSE (3)
$ WRITE SYS$OUTPUT FILE, "does not exist"
$ ENDIF (4)
$!
$ GOTO END
$!
$!
$!
$ FOR: (5)
$ ON ERROR THEN GOTO PRINT
$ FORTRAN/LIST 'FILE'
$ GOTO LINK
$!
$ PAS:
$ ON ERROR THEN GOTO PRINT
$ PASCAL/LIST 'FILE'
$ GOTO LINK
$!
$ OTHER:
$ WRITE SYS$OUTPUT "Can't handle files of type .''FILE_TYPE'"
$ GOTO END
$!
$ LINK: (6)
$ ON ERROR THEN GOTO END
$ WRITE SYS$OUTPUT "Successful compilation ...."
$ LINK 'FILE'
$ DEFINE/USER_MODE SYS$INPUT SYS$COMMAND
$ RUN 'FILE'
$ GOTO CLEANUP
$!
$ PRINT: (7)
$ WRITE SYS$OUTPUT "Unsuccessful compilation, printing listing file ...."
$ PRINT 'FILE'
$!
$ CLEANUP:
$ DELETE 'FILE'.OBJ;
$ DELETE 'FILE'.LIS;
$!
$ END:
$ INQUIRE/NOPUNCTUATION ANS "Process another file (Y or N)? "
$ IF ANS THEN GOTO TOP
$ EXIT
|
COMPILE_FILE.COM コマンド・プロシージャの説明
- IF コマンドは,F$SEARCH レキシカル関数を使用して,ディレクトリを検索し,ファイルが存在するかどうかを判別する。
- THEN コマンドの後のコマンド・ブロックは,次のことを行う。
- F$LENGTH レキシカル関数を使用して,ファイル・タイプの長さを判別する。
- ファイル・タイプを判別する。
- ファイル・タイプからピリオドを削除する。
- ファイル指定からファイル・タイプを削除して,ファイル名を判別する。
- ファイル名からピリオドを削除する。
- エラーが生じたときのアクションを定義する。
- FILE_TYPE シンボルによって定義されるラベルに分岐する。
- "File to process:" プロンプトに対してユーザが入力したファイルがディレクトリの中にない場合には,ELSE コマンドの後のコマンドを実行する。
- ENDIF コマンドは,IF-THEN-ELSE コマンド言語構成を終了する。
- FORTRAN プログラムをコンパイルして,LINK ラベルに分岐する。コンパイル中にエラーが生じると,PRINT ラベルに分岐する。
- プログラムが正しくコンパイルされたことを表示して,プログラムをリンクしてから実行し,CLEANUP ラベルに分岐する。エラーが生じると,プログラムは END ラベルに分岐する。
- プログラムのリスト・ファイルを省略時の印刷キューに登録する。
例: COMPLILE_FILE.COM コマンド・プロシージャの実行結果例
$ @COMPILE_FILE
File to process: RAND.PAS
Successful compilation
%DELETE-I-FILDEL,WORK:[DESCH]RAND.OBJ;1 deleted (3 blocks)
%DELETE-I-FILDEL,WORK:[DESCH]RAND.LIS;1 deleted (9 blocks)
Process another file (Y or N)? N [Return]
|
|