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


前へ 次へ 目次 索引


C.2 REMINDER.COM コマンド・プロシージャ

所定の時間にターミナルに催促メッセージを表示します。このプロシージャは,メッセージを表示したい時間とメッセージのテキストを求めるプロンプトを出し, CONVERT.COM を使用して時間をデルタ時間に変換します。次に,指定された時間まで待ってから催促メッセージを表示するサブプロセスを生成します。 F$ENVIRONMENT,F$VERIFY,および F$GETDVI 関数の使用方法を示します。

例: REMINDER.COM


 
 
$ ! Procedure to obtain a reminder message and display this 
$ ! message on your terminal at the time you specify. 
$ ! 
$ ! Save current states for procedure and image verification 
$ ! Turn verification off for duration of procedure 
$ 
$ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE")               (1)
$ SAVE_VERIFY_PROC = F$VERIFY(0) 
$ ! 
$ ! Places the current process in a wait state until a specified 
$ ! absolute time.  Then, it rings the bell on the terminal and 
$ ! displays a message. 
$ ! 
$ ! Prompt for absolute time 
$ ! 
$ 
$ GET_TIME: 
$ INQUIRE REMINDER_TIME  "Enter time to send reminder (hh:mm)"    (2)
$ INQUIRE MESSAGE_TEXT "Enter message" 
$ ! 
$ ! Call the CONVERT.COM procedure to convert the absolute time 
$ ! to a delta time 
$ ! 
$ @DISK2:[JONES.TOOLS]CONVERT 'REMINDER_TIME'                     (3)
$ IF .NOT. $STATUS THEN GOTO BADTIME 
$ ! 
$ ! 
$ ! Create a command file that will be executed 
$ ! in a subprocess.  The subprocess will wait until 
$ ! the specified time and then display your message 
$ ! at the terminal.  If you are working at a DEC_CRT 
$ ! terminal, the message has double size blinking 
$ ! characters. Otherwise, the message has normal letters. 
$ ! In either case, the terminal bell rings when the 
$ ! message is displayed. 
$ 
$ CREATE WAKEUP.COM                                        (4)
$ DECK                            ! Lines starting with $ are data lines 
$ WAIT 'WAIT_TIME'                                         (5)
$ BELL[0,7] = %X07                ! Create symbol to ring the bell 
$ IF F$GETDVI("SYS$OUTPUT","TT_DECCRT") .NES. "TRUE" THEN GOTO OTHER_TERM 
$ ! 
$ DEC_CRT_ONLY: 
$ ! Create symbols to set special graphics (for DEC_CRT terminals only) 
$ ! 
$     SET_FLASH = "<ESC>[1;5m"    ! Turn on blinking characters 
$     SET_NOFLASH = "<ESC>[0m"    ! Turn off blinking characters 
$     TOP = "<ESC>#3"             ! Double size characters (top portion) 
$     BOT = "<ESC>#4"             ! Double size characters (bottom portion) 
$ ! 
$ ! Write double size, blinking message to the terminal and ring the bell 
$ ! 
$     WRITE SYS$OUTPUT BELL, SET_FLASH, TOP, MESSAGE_TEXT 
$     WRITE SYS$OUTPUT BELL, BOT, MESSAGE_TEXT 
$     WRITE SYS$OUTPUT F$TIME(), SET_NOFLASH 
$     GOTO CLEAN_UP 
$ ! 
$ OTHER_TERM: 
$      WRITE SYS$OUTPUT BELL,MESSAGE_TEXT 
$      WRITE SYS$OUTPUT F$TIME() 
$ ! 
$ CLEAN_UP: 
$      DELETE WAKEUP.COM;* 
$ EOD 
$ ! 
$ ! Now continue executing commands. 
$ ! 
$ SPAWN/NOWAIT/INPUT=WAKEUP.COM                            (6)
$ END:                                                     (7)
$ !   Restore verification 
$     SAVE_VERIFY_PROC = F$VERIFY(SAVE_VERIFY_PROC, SAVE_VERIFY_IMAGE) 
$     EXIT 
$ ! 
$ BADTIME: 
$    WRITE SYS$OUTPUT "Time must be entered as hh:mm" 
$    GOTO GET_TIME 

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

  1. F$ENVIRONMENT 関数を使用してイメージ・チェック設定値を SAVE_VERITY_IMAGE シンボルにセーブする。次に,F$VERIFY 関数を使用して,プロシージャ・チェック設定値を SAVE_VERIFY_PROC シンボルにセーブする。 F$VERIFY 関数は両方のタイプのチェック設定値をオフにする。

  2. INQUIRE コマンドを使用して,催促メッセージを送信する時間を求めるプロンプトを出す。この値は CONVERT.COM プロシージャへの入力として使用される。メッセージのテキストを求めるプロンプトも出す。

  3. ネストされたプロシージャ CONVERT.COM を実行する。ファイル指定の一部としてディスクとディレクトリを指定するようにする。こうすると,システムは,REMINDER.COM を実行するディレクトリにかかわらず, CONVERT.COM を探すことができる。
    CONVERT.COM は,催促をデルタ時間に変換して,この時間をグローバル・シンボル WAIT_TIME に戻す。このデルタ時間は,現在の時間からメッセージを送信する時間までの時間間隔を示している。 CONVERT.COM がエラーを戻す場合は,プロシージャは BADTIME ラベルに分岐する。

  4. CREATE コマンドを使用して新しいプロシージャ WAKEUP.COM を作成する。このプロシージャはサブプロセスの中から実行される。 CREATE コマンドでドル記号で始まる行を読み込めるようにするには, DECK と EOD コマンドを CREATE コマンドの入力の前後に置く。このため,DECK と EOD コマンドの間の行はすべて WAKEUP.COM に書き込まれる。

  5. WAKEUP.COM は,次のタスクを実行する。

  6. WAKEUP.COM を作成した後,サブプロセスを生成して,入力コマンド・ファイルとして WAKEUP.COM を使用するようにそのサブプロセスに指示する。 /NOWAIT 修飾子があるので,サブプロセスが WAKEUP.COM からコマンドを実行しているときに,ユーザはターミナルで作業を続けることができる。指定された時間に,WAKEUP.COM はターミナルにユーザのメッセージを表示する。
    省略時の設定では,SPAWN コマンドは,グローバル・シンボルとローカル・シンボルを 1 つのサブプロセスに渡す。したがって,ユーザが REMINDER にシンボル WAIT_TIME と MESSAGE_TEXT の値を与えるが,WAKEUP.COM もこの 2 つのシンボルにアクセスできる。

  7. 終了する前に元のチェック設定値を復元する。

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


$ @REMINDER
Enter time to send reminder (hh:mm): 12:00
Enter message: TIME FOR LUNCH
%DCL-S-SPAWNED, process BLUTO_1 spawned
$
   .
   .
   .
TIME FOR LUNCH
11-DEC-1996 12:00:56.99

時間値とメッセージを求めるプロンプトを出します。次に,メッセージを表示するサブプロセスを生成します。ユーザがターミナルで作業を継続していても,サブプロセスは,指定された時間になると,ターミナル・ベルを鳴らしたり,ユーザのメッセージを表示したり,時間を表示したりします。

C.3 DIR.COM コマンド・プロシージャ

DCL コマンド・プロシージャ DIRECTORY/SIZE=ALL/DATE を模倣して,指定されたファイルの(使用済みと割り当てられた)ブロック・サイズと作成日を表示します。 F$PARSE,F$SEARCH,F$FILE_ATTRIBUTES,および F$FAO レキシカル関数の使用方法を示します。

例: DIR.COM


 
 
$ ! 
$ ! Command procedure implementation of DIRECTORY/SIZE=ALL/DATE 
$ ! command 
$ ! 
$ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE") 
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(0) 
$ ! 
$ ! Replace any blank field of the P1 file specification with 
$ ! a wildcard character 
$ ! 
$ P1 = F$PARSE(P1,"*.*;*")                                 (1)
$ ! 
$ ! Define initial values for symbols 
$ ! 
$ FIRST_TIME = "TRUE" 
$ FILE_COUNT = 0 
$ TOTAL_ALLOC = 0 
$ TOTAL_USED = 0 
$ 
$ LOOP:                                                    (2)
$       FILESPEC = F$SEARCH(P1) 
$ ! Find next file in directory 
$       IF FILESPEC .EQS. "" THEN GOTO DONE 
$ ! If no more files, then done 
$       IF .NOT. FIRST_TIME THEN GOTO SHOW_FILE 
$ ! Print header only once 
$ ! 
$ ! Construct and output the header line 
$ ! 
$       FIRST_TIME =  "FALSE"                              (3)
$       DIRSPEC = F$PARSE(FILESPEC,,, "DEVICE") - 
                +F$PARSE(FILESPEC,,, "DIRECTORY") 
$       WRITE SYS$OUTPUT "" 
$       WRITE SYS$OUTPUT  "Directory ",DIRSPEC 
$       WRITE SYS$OUTPUT "" 
$       LASTDIR = DIRSPEC 
$ 
$ ! 
$ ! Put the file name together, get some of the file attributes, and 
$ ! type the information out 
$ ! 
$SHOW_FILE: 
$       FILE_COUNT = FILE_COUNT + 1 
$       FILENAME = F$PARSE(FILESPEC,,, "NAME") -           (4)
                 + F$PARSE(FILESPEC,,, "TYPE") - 
                 + F$PARSE(FILESPEC,,, "VERSION") 
$      ALLOC = F$FILE_ATTRIBUTES(FILESPEC, "ALQ") 
$      USED = F$FILE_ATTRIBUTES(FILESPEC, "EOF") 
$      TOTAL_ALLOC = TOTAL_ALLOC + ALLOC 
$      TOTAL_USED = TOTAL_USED + USED 
$      REVISED = F$FILE_ATTRIBUTES(FILESPEC,"RDT") 
$      LINE = F$FAO("!19AS !5UL/!5<!UL!> !17AS",FILENAME,- 
               USED, ALLOC, REVISED) 
$      WRITE SYS$OUTPUT LINE 
$      GOTO LOOP 
$ 
$ ! 
$ ! Output summary information, reset verification, and exit 
$ ! 
$ DONE:                                                    (5)
$      WRITE SYS$OUTPUT "" 
$      WRITE SYS$OUTPUT "Total of ''FILE_COUNT' files, " + - 
                        "''TOTAL_USED'/''TOTAL_ALLOC' blocks." 
$      SAVE_VERIFY_PROCEDURE = F$VERIFY(SAVE_VERIFY_PROCEDURE,SAVE_VERIFY_IMAGE) 
$      EXIT 

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

  1. F$PARSE 関数を使用して,ユーザが提供するファイル指定である P1 のブランク・フィールドにアスタリスクを置く。 DIR.COM を実行するときにユーザがパラメータを指定しないと, F$PARSE 関数は "*.*;*" の値を P1 に割り当てる。この結果,DIR.COM は現在の省略時のディレクトリにあるすべてのファイルを表示する。

  2. F$SEARCH レキシカル関数がこのディレクトリで P1 によって示される 1 つまたは複数のファイルを検索する。 P1 にワイルドカード文字(アスタリスク) が指定されている場合, F$SEARCH 関数は一致するすべてのファイル指定を戻す。最後のファイル指定が戻されると,DONE ラベルに分岐する。

  3. 最初のループ実行時に,ディレクトリ表示用のヘッダを書き込む。このヘッダには,デバイスとディレクトリの名前が含まれている。これらの名前を得るために,F$PARSE 関数を使用している。

  4. F$PARSE レキシカル関数を使用して,ディレクトリの中のそれぞれのファイル指定からファイル名を取り出す。このとき,F$FILE_ATTRIBUTES レキシカル関数は,使用済みのブロック数,割り当てられたブロック数,それぞれのファイルについての作成日情報を得る。最後に,F$FAO 関数がディレクトリの中のそれぞれのファイルごとに 1 行ずつフォーマットする。 F$FAO 関数はファイル名とファイル属性情報を引数として使用する。

  5. F$SEARCH が空の文字列を戻す場合は,DONE ラベルに分岐して,ファイルの合計数,使用されたブロックの合計数,ディレクトリで割り当てられたブロックの合計数を示す要約情報を表示する。

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


$ @DIR [VERN]*.COM


Directory DISK4:[VERN] 
 
BATCH.COM;1             1/3     11-DEC-1996 11:43 
CALC.COM;3              1/3     11-DEC-1996 11:30 
CONVERT.COM;1           5/6     11-DEC-1996 15:23 
   .
   .
   .
LOGIN.COM;34            2/3     11-DEC-1996 13:17 
PID.COM;7               1/3     11-DEC-1996 09:49 
SCRATCH.COM;6           1/3     11-DEC-1996 11:29) 
 
Total of 15 files, 22/48 blocks. 

このプロシージャは,[VERN] ディレクトリのすべての COM ファイルに関する情報を戻します。

C.4 SYS.COM コマンド・プロシージャ

現在のプロセス,グループ内のすべてのプロセス (現在のプロセスが group 特権を持つ場合),およびシステム上のすべてのプロセス (現在のプロセスが world 特権を持つ場合) についての統計情報を戻します。 F$PID,F$EXTRACT,および F$GETJPI レキシカル関数の使用方法を示します。

例: SYS.COM


 
 
$ ! 
$ ! Displays information about owner, group, or system processes. 
$ ! 
$ ! Turn off verification and save current settings 
$ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE") 
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(0) 
$ CONTEXT = ""                     ! Initialize PID search context  (1)
$ ! 
$ ! Output header line. 
$ ! 
$ WRITE SYS$OUTPUT "   PID    Username    Term    Process " + -     (2)
         "name   State   Pri Image" 
$ ! 
$ ! Output process information. 
$ ! 
$LOOP: 
$ ! 
$ ! Get next PID.  If null, then done. 
$ ! 
$       PID = F$PID(CONTEXT)                               (3)
$       IF PID .EQS. "" THEN GOTO DONE 
$ ! 
$ ! Get image file specification and extract the file name. 
$ ! 
$       IMAGNAME = F$GETJPI(PID,"IMAGNAME")                (4)
$       IMAGNAME = F$PARSE(IMAGNAME,,,"NAME","SYNTAX_ONLY") 
$ ! 
$ ! Get terminal name.  If none, then describe type of process. 
$ ! 
$       TERMINAL = F$GETJPI(PID,"TERMINAL")                (5)
$       IF TERMINAL .EQS. "" THEN - 
                TERMINAL = "-"+F$EXTRACT(0,3,F$GETJPI(PID,"MODE"))+"-" 
$       IF TERMINAL .EQS. "-INT-" THEN TERMINAL = "-DET-" 
$       IF F$GETJPI(PID,"OWNER") .NE. 0 THEN TERMINAL = "-SUB-" 
$ ! 
$ ! Get more information, put process line together, 
$ ! and output it. 
$ ! 
$       LINE = F$FAO("!AS !12AS !7AS !15AS !5AS !2UL/!UL !10AS", - (6)
                PID,F$GETJPI(PID,"USERNAME"),TERMINAL,- 
                F$GETJPI(PID,"PRCNAM"),- 
                F$GETJPI(PID,"STATE"),F$GETJPI(PID,"PRI"),- 
                F$GETJPI(PID,"PRIB"),IMAGNAME) 
$       WRITE SYS$OUTPUT LINE 
$       GOTO LOOP 
$ ! 
$ ! Restore verification and exit. 
$ ! 
$DONE: 
$  SAVE_VERIFY_PROCEDURE = F$VERIFY(SAVE_VERIFY_PROCEDURE,SAVE_VERIFY_IMAGE) 
$  EXIT 

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

  1. CONTEXT シンボルが空の値で初期化される。このシンボルをF$PID 関数と一緒に使用すると,プロセス識別番号のリストを得ることができる。

  2. ヘッダを書き込む。

  3. 最初のプロセス識別 (PID) 番号を得る。現在のプロセスに group または world 特権がない場合には,現在のプロセスの PID 番号が戻される。現在のプロセスが group 特権を持っている場合には,グループ・リストの中の最初の PID 番号が戻され,現在のプロセスが world 特権を持っている場合には,システム・リストの中の最初の PID 番号が戻される。最後の PID 番号が戻されるまで,順に PID 番号を戻し続ける。この時点で,空の文字列が戻され,プロシージャの終わりに分岐する。

  4. F$GETJPI レキシカル関数を使用して,それぞれの PID 番号のイメージ・ファイル指定を得る。 F$PARSE 関数は,F$GETJPI 関数が戻す指定からファイル名を取り出す。

  5. F$GETJPI 関数を使用して,それぞれの PID 番号のターミナル名を得る。 F$EXTRACT 関数は,F$GETJPI(PID,"MODE") が戻す MODE 指定の最初の 3 文字を取り出して,プロセスのタイプを判別する。 F$GETJPI 関数をもう一度使用して,プロセスがサブプロセスかどうかを判別する。

  6. F$GETJPI レキシカル関数を使用して,ユーザ名,プロセス名,プロセス状態,プロセス優先順位,戻されたそれぞれの PID 番号のプロセスの基本優先順位を得る。 F$FAO レキシカル関数は,この情報を画面に合わせてフォーマットする。

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


$ @SYS


   PID    Username    Term    Process name   State   Pri Image 
00050011  NETNONPRIV   -NET-   MAIL_14411      LEF    9/4 MAIL 
00040013  STOVE        RTA6:   STOVE           LEF    9/4 
00140015  MAROT        -DET-   DMFB0ACP        HIB    9/8 F11BAC 
00080016  THOMPSON     -DET-   MTA0ACP         HIB   12/8 MTAAACP 
00070017  JUHLES       TTF1:   JUHLES          LEF    9/4 
   .
   .
   .
00040018  MARCO        TTA2:   MARCO           HIB    9/4 RTPAD 
0018001A  VERN         RTA3:   VERN            LEF    9/4 
0033001B  YISHA        RTA7:   YISHA           CUR    4/4 
0002004A  SYSTEM       -DET-   ERRFMT          HIB   12/7 ERRFMT 

このプロシージャは,システム上のすべてのプロセスに関する情報を戻します。現在のプロセスは world 特権を持っています。

C.5 GETPARMS.COM コマンド・プロシージャ

このコマンド・プロシージャは,プロシージャに渡すパラメータの数を戻します。別のプロシージャから GETPARMS.COM を呼び出せば,呼び出し側プロシージャに渡されたパラメータの数を判別できます。

例: GETPARMS.COM


 
 
$ ! Procedure to count the number of parameters passed to a command 
$ ! procedure.  This number is returned as the global symbol PARMCOUNT. 
$ ! 
$ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE")        (1)
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(0) 
$ ! 
$ IF P1 .EQS. "?" THEN GOTO TELL                           (2)
$ ! 
$ ! Loop to count the number of parameters passed.  Null parameters are 
$ ! counted until the last non-null parameter is passed. 
$ ! 
$       COUNT = 0                                          (3)
$       LASTNONNULL = 0 
$ LOOP: 
$       IF COUNT .EQ. 8 THEN GOTO END_COUNT 
$       COUNT = COUNT + 1 
$       IF P'COUNT' .NES. "" THEN LASTNONNULL = COUNT 
$ GOTO LOOP 
$ ! 
$ END_COUNT:                                               (4)
$ ! 
$ ! Place the number of non-null parameters passed into PARMCOUNT. 
$ ! 
$ PARMCOUNT == LASTNONNULL 
$ ! 
$ ! Restore verification setting, if it was on, before exiting 
$ !                                                             (5)
$ SAVE_VERIFY_PROCEDURE = F$VERIFY(SAVE_VERIFY_PROCEDURE,SAVE_VERIFY_IMAGE) 
$ EXIT 
$ ! 
$ TELL:                                                    (6)
$ TYPE SYS$INPUT 
        This procedure counts the number of parameters passed to 
        another procedure.  This procedure can be called by entering 
        the following string in any procedure: 
 
             @GETPARMS 'P1 'P2 'P3 'P4 'P5 'P6 'P7 'P8 
 
        On  return,  the  global  symbol  PARMCOUNT 
        contains the number of parameters passed to the procedure. 
$ ! 
$ EXIT 

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

  1. 現在のイメージとプロシージャのチェック設定値をセーブしてから,チェックをオフに設定する。

  2. 疑問符がパラメータとしてプロシージャに渡された場合には, TELL ラベル (注 6) に分岐する。

  3. プロシージャに渡されたパラメータ数をカウントするループが設定される。カウンタ COUNT と LASTNONNULL は,ループに入る前に 0 に初期化される。ループの中で,COUNT は増分され,8 の値になっているかどうかテストされる。 COUNT が 8 に等しい場合には,最大数のパラメータが入力されている。空以外のパラメータが渡されるたびにLASTNONNULL はそのパラメータの番号に定義される。
    IF コマンドを実行するたびに,COUNT シンボルは異なる値を持つ。 1 回目は,COUNT の値は 1 で,IF コマンドは P1 をチェックし, 2 回目は,P2 をチェックし,以下も同様である。

  4. パラメータ・カウントが 8 になると,END_COUNT に分岐する。 LASTNONNULL シンボルには,最後に渡された空以外のパラメータのカウントが入っている。この値はグローバル・シンボル PARMCOUNT に収められる。 PARMCOUNT は,呼び出し側のコマンド・レベルで値をテストできるようにグローバル・シンボルとして定義しなくてはならない。

  5. 元のチェック設定値が復元される。

  6. TELL ラベルでは,TYPE コマンドが入力ストリームに収められたデータを表示する。コマンド・プロシージャの中では,入力ストリームはコマンド・プロシージャ・ファイルである。 TYPE コマンドは,GETPARMS.COM の使用方法に関する命令を表示する。

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

SORTFILES.COM プロシージャは,3 つの空以外のパラメータを渡すようにユーザに要求します。SORTFILES.COM プロシージャには,次の行が入っています。


$ @GETPARMS 'P1' 'P2' 'P3' 'P4' 'P5' 'P6' 'P7' 'P8' 
$ IF PARMCOUNT .NE. 3 THEN GOTO NOT_ENOUGH 
   . 
   . 
   . 
$NOT_ENOUGH: 
$ WRITE SYS$OUTPUT - 
"Three non-null parameters required.  Type SORTFILES HELP for info." 
$ EXIT 

SORTFILES.COM プロシージャは,次のようにして起動できます。


$ @SORTFILES DEF 4
Three non-null parameters required. Type SORTFILE HELP for info. 

このプロシージャを正しく起動するには,すなわち,SORTFILES に渡されたパラメータをそのまま GETPARMS に渡して処理するには,シンボル P1 〜 P8 が 1 組の二重引用符で囲まれていなくてはなりません。

GETPARMS からの戻り値が 3 でない場合には, SORTFILES はエラー・メッセージを出力して終了します。


前へ 次へ 目次 索引