日本-日本語
日本HPホーム 製品 & サービス OpenVMS製品情報
≫  お問い合わせ


OpenVMS マニュアル


 

OpenVMS ドキュメント
ライブラリ

タイトルページ
目次
まえがき
第 1 章:OpenVMS オペレーティング・システムの概要
第 2 章:DCL を使用したシステムとの会話
第 3 章:ファイル情報の格納
第 4 章:ディレクトリ・ファイルの編成
第 5 章:拡張ファイル指定
第 6 章:ディスクとテープ・ドライブの使用方法
第 7 章:Mail を使用して他のユーザと通信する
第 8 章:EVE エディタによるテキスト・ファイルの編集
第 9 章:ファイルのソートとマージ
第 10 章:資源へのアクセスの制御
第 11 章:デバイスとファイルの論理名定義
第 12 章:シンボル,コマンド,式の定義
第 13 章:コマンド・プロシージャの概要
第 14 章:DCL での拡張プログラミング
第 15 章:レキシカル関数を使用しての情報の取得と処理
第 16 章:プロセスとバッチ・ジョブ
付録 A :文字セット
付録 B :コマンド・プロシージャの例
用語集
索引
PDF
OpenVMS ホーム
OpenVMS

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


目次 索引

  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-1999 11:43 
CALC.COM;3              1/3     11-DEC-1999 11:30 
CONVERT.COM;1           5/6     11-DEC-1999 15:23 
   .
   .
   .
LOGIN.COM;34            2/3     11-DEC-1999 13:17 
PID.COM;7               1/3     11-DEC-1999 09:49 
SCRATCH.COM;6           1/3     11-DEC-1999 11:29) 
 
Total of 15 files, 22/48 blocks. 

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

B.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 特権を持っています。

B.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 はエラー・メッセージを出力して終了します。

B.6 EDITALL.COM コマンド・プロシージャ

EDT エディタを繰り返し起動して,同じファイル・タイプを持つファイルのグループを編集します。このプロシージャは,レキシカル関数を使用して出力からファイル名を取り出す方法を示しています。また,コマンド・プロシージャの中で起動されたプログラムの入力ストリームを再定義する方法も示しています。

例: EDITALL.COM

 
 
$ ! Procedure to edit all files in a directory with a 
$ ! specified file type. Use P1 to indicate the file type. 
$ ! 
$ ON CONTROL_Y THEN GOTO DONE           ! Ctrl/Y action    (1)
$ ON ERROR THEN GOTO DONE 
$ ! 
$ ! Check for file type parameter.  If one was entered, continue; 
$ ! otherwise, prompt for a parameter. 
$ ! 
$ IF P1 .NES. "" THEN GOTO OKAY                            (2)
$ INQUIRE P1 "Enter file type of files to edit" 
$ ! 
$ ! List all files with the specified file type and write the DIRECTORY 
$ ! output to a file named DIRECT.OUT 
$ ! 
$ OKAY: 
$ DIRECTORY/VERSIONS=1/COLUMNS=1 -                         (3)
         /NODATE/NOSIZE - 
         /NOHEADING/NOTRAILING - 
         /OUTPUT=DIRECT.OUT *.'P1' 
$ IF .NOT. $STATUS THEN GOTO ERROR_SEC                     (4)
$ ! 
$ OPEN/READ/ERROR=ERROR_SEC DIRFILE DIRECT.OUT             (5)
$ ! 
$ ! Loop to read directory file 
$ ! 
$ NEWLINE:                                                 (6)
$        READ/END=DONE DIRFILE NAME 
$        DEFINE/USER_MODE SYS$INPUT SYS$COMMAND:   ! Redefine SYS$INPUT 
$        EDIT 'NAME'                               ! Edit the file 
$        GOTO NEWLINE 
$ ! 
$ DONE:                                                    (7)
$        CLOSE DIRFILE/ERROR=NOTOPEN               ! Close the file 
$ NOTOPEN: 
$        DELETE DIRECT.OUT;*                       ! Delete temp file 
$ EXIT 
$ ! 
$ ERROR_SEC: 
$        WRITE SYS$OUTPUT "Error:  ",F$MESSAGE($STATUS) 
$        DELETE DIRECT.OUT;* 
$ EXIT 

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

  1. ON コマンドは,このプロシージャの条件処理を設定する。このプロシージャの実行時に Ctrl/Y が押されると,DONE ラベルに分岐する。同様に,エラーまたは重大エラーが生じても,DONE ラベルに分岐する。

  2. パラメータが入力されたかどうかをチェックする。入力されていない場合には,ファイル・タイプを求めるプロンプトを出す。

  3. DIRECTORY コマンドは,P1 として指定されたファイル・タイプを持つすべてのファイルをリストする。コマンド出力は DIRECT.COM ファイルに書き込まれる。 /VERSIONS=1 修飾子は,それぞれのファイルの最も大きいバージョン番号だけをリストするように要求する。 NOHEADING 修飾子と/NOTRAILING 修飾子は,出力に見出し行やディレクトリ要約を含めないように要求する。 /COLUMNS=1 修飾子は,レコードごとにファイル名が 1 つずつ指定されるようにする。

  4. IF コマンドは,$STATUS の値をテストすることによって, DIRECTORY コマンドからの戻り値をチェックする。 DIRECTORY コマンドが正しく実行されないと,$STATUS は偶数の整数値になり,プロシージャはERROR_SEC ラベルに分岐する。

  5. OPEN コマンドは,ディレクトリ出力ファイルをオープンして,それに論理名 DIRFILE を指定する。

  6. READ コマンドは,DIRECTORY コマンド出力の行をシンボル名 NAME に読み込む。すべての行を読み込むと,DEFINE コマンドを使用して,編集セッションの入力ストリーム (SYS$INPUT) がターミナルになるように再定義する。次に,エディタを起動して,NAME シンボルをファイル指定として指定する。編集セッションが完了すると,コマンド・インタプリタは,コマンド・プロシージャの中の次の行を読み込んで,NEWLINE ラベルに分岐する。ディレクトリの中にある指定されたファイル・タイプのすべてのファイルを編集すると,DONEラベルに分岐する。

  7. DONE ラベルは,READ コマンドの /END 修飾子のターゲット・ラベルであるとともに,プロシージャの始めに設定された ON CONTROL_Y 条件と ON ERROR 条件のターゲット・ラベルでもある。このラベルでは,クリーンアップ処理を行う。
    CLOSE コマンドは,DIRECTORY コマンドの出力ファイルをクローズし, /ERROR 修飾子はファイルの中の次の行のラベルを指定する。このように/ERROR 修飾子を使用すると,ディレクトリ・ファイルがオープンされていないときに表示されるはずのエラー・メッセージが出されなくなる。このような状況は,ディレクトリ・ファイルをオープンする前に Ctrl/Y を押した場合などに生じる。
    クリーンアップ処理の 2 番目のステップは,一時ディレクトリ・ファイルを削除することである。

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

$ @EDITALL DAT
*  .
   .
   .
%DELETE-I-FILDEL, device:[directory]DIRECT.OUT;1 deleted (x blocks)

EDITALL プロシージャが DAT として指定された P1 によって起動されます。このプロシージャは,省略時のディレクトリにあるファイル・タイプ DAT を持つすべてのファイルのディレクトリ・リストを作成し,エディタを起動してそれぞれのファイルを編集します。ファイル・タイプ DAT を持つ最後のファイルを編集し終わると,一時ファイル DIRECT.OUT を削除して,ターミナルにメッセージを表示します。

B.7 MAILEDIT.COM コマンド・プロシージャ

このコマンド・プロシージャは, MAIL ユーティリティでテキスト・エディタを起動しています。

例: MAILEDIT.COM

 
 
$ ! Command procedure to invoke an editor for Mail. 
$ ! 
$ ! Inputs: 
$ ! 
$ !     P1 = Input file name. 
$ !     P2 = Output file name. 
$ ! 
$ ! If MAIL$EDIT is undefined, Mail will invoke the user's selected 
$ ! callable editor set by the mail SET EDITOR command. 
$ ! 
$ ! If MAIL$EDIT is defined to be a command procedure, Mail will create 
$ ! a subprocess to edit the mail, but any SET EDITOR command in Mail 
$ ! will override the definition of MAIL$EDIT for the remainder of that 
$ ! Mail session. 
$ ! 
$ ! Note that this procedure is run in the context of a subprocess. 
$ ! LOGIN.COM is not executed.  However, all process logical names 
$ ! and DCL global symbols are copied.  In particular, note that the 
$ ! user's individual definition of the symbol EDIT is used if there 
$ ! is one. Otherwise, the system default editor is used. 
$ ! 
$ ! The default directory is the same as the parent process 
$ ! 
$ DEFINE /USER SYS$INPUT 'F$TRNLNM("SYS$OUTPUT")'          (1)
$ IF P1 .EQS. "" THEN GOTO NOINPUT                         (2)
$ EDIT /OUTPUT='P2' 'P1'                                   (3)
$ EXIT 
$NOINPUT: 
$ EDIT 'P2'                                                (4)
$ EXIT 

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

  1. DEFINE コマンドは,エディタ入力をコマンド・ファイルからではなく,ターミナルから得られるようにする。

  2. IF 文は,異なる出力ファイル名を持つファイルを編集することと,同じファイル名を持つファイルを編集することを区別する。

  3. この EDIT コマンドは,入力ファイル名と出力ファイル名でエディタを起動する。この行を,たとえば次のように編集すると,ユーザが選択したエディタを起動できる。
    $ RUN XYZ_EDITOR.EXE /INPUT= 'P1' /OUTPUT='P2'

  4. この EDIT コマンドは,1 つのファイル名でエディタを起動する。この行を,たとえば次のように編集すると,ユーザが選択したエディタを起動できる。
    $ RUN XYZ_EDITOR.EXE /INPUT= 'P2' /OUTPUT='P2'

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

$DEFINE MAIL$EDIT MAILEDIT.COM
$MAIL
MAIL> SHOW EDITOR
Your editor is defined by the file MAILEDIT.COM.


目次 索引

© 2012 Hewlett-Packard Development Company, L.P.