前へ | 次へ | 目次 | 索引 |
入力データを求めるプロンプトを出し,データを桁揃えしてからソートし,出力ファイルに書き込みます。このプロシージャは,READ と WRITE コマンドとともに,割り当て文の部分文字列オーバレイ形式を示しています。
$ ! 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 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-1996 16:18:58.79 Programmer Name File Name ANDERSON JUNK.J JENKINS MARIGOLD.DAT MASON SYSTEM.SRC WATERS CRYSTAL.CAV |
算術計算を行い,その結果を16 進値と 10 進値に変換します。
$ ! 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 |
名前 = 式 |
式 |
ユーザが Return を押すと,プロシージャは, CALC セッションが終わったとみなして,終了する。
ユーザが "名前 = 式" 形式で入力した場合は,プロシージャはSTATEMENT ラベルで実行を継続し,そうでない場合は,EXPRESSION ラベルに分岐する。
$ @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 セッションは終わりです。
C.11 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 RUN MYPROG Job RUN (queue SYS$BATCH, entry 1715) started on SYS$BATCH |
この例は,BATCH.COM を使用して,バッチ・ジョブの中からプログラムを実行しています。
C.12 COMPILE_FILE.COM コマンド・プロシージャ
PASCAL または FORTRAN で書かれたファイルのコンパイル,リンク,実行を行います。処理するファイルを求めるプロンプトを出し,ファイル・タイプが PAS か FOR かを判別します。ファイル・タイプが PAS でも FOR でもない場合,またはファイルが現在の省略時のディレクトリに存在しない場合には,該当するエラー・メッセージを出力します。このプロシージャは,IF-THEN-ELSE 言語構成の使用方法を示しています。
$! 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 コマンド・プロシージャの説明
例: 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] |
前へ | 次へ | 目次 | 索引 |