前へ | 次へ | 目次 | 索引 |
所定の時間にターミナルに催促メッセージを表示します。このプロシージャは,メッセージを表示したい時間とメッセージのテキストを求めるプロンプトを出し, CONVERT.COM を使用して時間をデルタ時間に変換します。次に,指定された時間まで待ってから催促メッセージを表示するサブプロセスを生成します。 F$ENVIRONMENT,F$VERIFY,および F$GETDVI 関数の使用方法を示します。
$ ! 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 コマンド・プロシージャの実行結果例
$ @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 レキシカル関数の使用方法を示します。
$ ! $ ! 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 [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 レキシカル関数の使用方法を示します。
$ ! $ ! 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 |
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 を呼び出せば,呼び出し側プロシージャに渡されたパラメータの数を判別できます。
$ ! 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 コマンド・プロシージャの実行結果例
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 はエラー・メッセージを出力して終了します。
前へ | 次へ | 目次 | 索引 |