| 前へ | 次へ | 目次 | 索引 |
使用中のシステムがネットワークまたは OpenVMS Cluster の一部で,多数のノードにログインできる場合には,現在使用中のノードを示すように DCL プロンプトを設定できます。このためには,ログイン・コマンド・プロシージャの中に F$GETSYI 関数を指定して,ノード名を判別します。次に,SET PROMPT コマンドを使用して,ノード固有のプロンプトを設定します。
プロンプト文字列の中でノード名の一部分だけを使用したい場合には,F$EXTRACT 関数を使用して,該当する文字を取り出します。文字の取り出しについては,第 15.6.2 項 を参照してください。
次の例では,シンボル NODE が FF$GETSYI("NODENAME")として定義され,その後,ノード名がプロンプトとして使用されます。
$ NODE = F$GETSYI("NODENAME")
$ SET PROMPT = "''NODE'$ "
.
.
.
|
F$GETQUI 関数を使用すると,バッチ・キューと印刷キューについての各種の情報を得ることができます。キューの中のジョブやファイルについての情報を得るには,該当ジョブに対する読み込みアクセス権か SYSPRV または OPER 特権を持っていなくてはなりません。
次の例は,バッチ・キュー VAX1_BATCH が終了状態にあるかどうかを判別する方法を示しています。戻される値は真か偽のいずれかです。キューが終了状態にない場合には,コマンド・プロシージャはジョブをキューに登録します。
$ QSTOPPED = F$GETQUI("DISPLAY_QUEUE", "QUEUE_STOPPED", "VAX1_BATCH")
$ IF QSTOPPED THEN GOTO NOBATCH
$ SUBMIT/QUEUE=VAX1_BATCH TEST.COM
$ NOBATCH:
.
.
.
|
F$PID 関数を使用すると,チェックすることが許容されているすべてのプロセスのプロセス識別番号(PID)を得ることができます。
PID 番号を入手した後,F$GETJPI 関数を使用すれば,プロセスに関する特定の情報を入手できます。
次の例は,チェックすることが許容されているプロセスの PID を得て表示する方法を示しています。
$ ! Display the time when this procedure $ ! begins executing $ WRITE SYS$OUTPUT F$TIME() $ ! $ CONTEXT = "" $ START: $ ! Obtain and display PID numbers until $ ! F$PID returns a null string $ ! $ PID = F$PID(CONTEXT) $ IF PID .EQS. "" THEN EXIT $ WRITE SYS$OUTPUT "Pid --- ''PID'" $ GOTO START |
システムは CONTEXT シンボルを使用して,ポインタを PID のシステム・リストに保持しています。ループを通過するたびに,ポインタを変更して,リストの中の次の PID を指すようにします。すべての PID が表示されると,プロシージャは終了します。
次のプロシージャは,PID とそれぞれのプロセスの UIC を表示します。
$ CONTEXT = "" $ START: $ ! Obtain and display PID numbers and UICs $ ! $ PID = F$PID(CONTEXT) $ IF PID .EQS. "" THEN EXIT $ UIC = F$GETJPI(PID,"UIC") $ WRITE SYS$OUTPUT "Pid --- ''PID' Uic--- ''UIC' " $ GOTO START |
WRITE コマンドの中に F$GETJPI 関数を指定すれば,このコマンド・プロシージャを短くできます。
$ CONTEXT = "" $ START: $ PID = F$PID(CONTEXT) $ IF PID .EQS. "" THEN EXIT $ WRITE SYS$OUTPUT "Pid --- ''PID' Uic --- ''F$GETJPI(PID,"UIC")'" $ GOTO START |
OpenVMS Cluster 内の任意のノードからプロセスに関する情報を入手するには,F$CONTEXT 関数を使用します。
次の例では,選択基準を設定するために F$CONTEXT が 3 回呼び出されています。
$!Establish an error and Ctrl/Y handler
$!
$ ON ERROR THEN GOTO error
$ ON CONTROL_Y THEN GOTO error
$!
$ ctx = ""
$ temp = F$CONTEXT("PROCESS", ctx, "NODENAME", "*","EQL")(1)
$ temp = F$CONTEXT("PROCESS", ctx, "USERNAME", "M*,SYSTEM","EQL")(2)
$ temp = F$CONTEXT("PROCESS", ctx, "CURPRIV", "SYSPRV,OPER", "ALL")(3)
$!
$!Loop over all processes that meet the selection criteria.
$!Print the PID number and the name of the image for each process.
$!
$loop: (4)
$ pid = F$PID(ctx)
$ IF pid .EQS. ""
$ THEN
$ GOTO endloop
$ ELSE
$ image = F$GETJPI(pid,"IMAGNAME")(5)
$ SHOW SYMBOL pid
$ WRITE SYS$OUTPUT image (6)
$ GOTO loop
$ ENDIF
$!The loop over the processes has ended.
$!
$endloop:
$!
$ EXIT
$!
$!Error handler. Clean up the context's memory with
$!the CANCEL selection item keyword.
$!
$error:
$ IF F$TYPE(ctx).eqs. "PROCESS_CONTEXT" THEN - (7)
-$ temp = F$CONTEXT("PROCESS", ctx, "CANCEL")(8)
$!
$ EXIT
|
例を調べる場合には,次のことに注意してください。
ファイルとデバイスについての情報を得るには,次のレキシカル関数を使用します。
| F$DEVICE | 指定された選択基準を満たすシステム上のすべてのデバイスのデバイス名を戻す。 |
| F$FILE_ATTRIBUTES | ファイル属性についての情報を戻す。 |
| F$GETDVI | 指定されたデバイスについての情報を戻す。 |
| F$PARSE | ファイル指定を解析して,要求された 1 つまたは複数のフィールドを戻す。 |
| F$SEARCH | ディレクトリでファイルを検索する。 |
システム・サービス $GETDVI を使用することによって特定のデバイスについての情報を得るには,デバイス名をサービスに提供しなければなりません。デバイス名がわからない場合には,F$DEVICE レキシカル関数を使用して検索できます。
F$DEVICE 関数を使用すると,デバイス名,デバイス・クラス,またはデバイス・タイプに基づくワイルドカード検索ができます。デバイス・タイプに基づいて検索を行うには,デバイス・クラスも指定しなければなりません。
コマンド・プロシージャのループの中で F$DEVICE 関数を使用すると,指定された選択基準に一致するデバイス名が戻されます。F$DEVICE 関数を実行するたびに,選択基準に一致する次のデバイスが戻されます。デバイス名が戻される順序は一定でないことに注意してください。最後のデバイス名が戻されてから F$DEVICE 関数を呼び出すと,空の文字列が戻されます。
次の例のコマンド・プロシージャは,ユニット番号が 0 のユニット上のすべての RA60 のデバイス名を表示します。
$ START:
$ DEVICE_NAME = F$DEVICE("*0:","DISK","RA60")
$ IF DEVICE_NAME .EQS. "" THEN EXIT
$ SHOW SYMBOL DEVICE_NAME
$ GOTO START
|
ファイルを処理する際には,あらかじめ F$SEARCH 関数を使用してそのファイルが存在するかどうかを調べなくてはなりません。たとえば,次のコマンド・プロシージャは,F$PARSE を使用して,デバイスとディレクトリ文字列を STATS.DAT ファイルに適用しています。次に,F$SEARCH 関数を使用して,DISK3:[JONES.WORK] に STATS.DAT が存在するかどうか判別します。存在すれば,ファイルを処理し,存在しない場合には,別の入力ファイルを求めるプロンプトを出します。
$ FILE = F$PARSE("STATS.DAT","DISK3:[JONES.WORK]",,,"SYNTAX_ONLY")
$ IF F$SEARCH(FILE).EQS. "" THEN GOTO GET_FILE
$ PROCESS_FILE:
.
.
.
$ GET_FILE:
$ INQUIRE FILE "File name"
$ GOTO PROCESS_FILE
|
ファイルの存在を判別した後,F$PARSE または F$FILE_ATTRIBUTES 関数を使用すれば,ファイルについての補足情報を得ることができます。
$ IF F$SEARCH("STATS.DAT").EQS. "" THEN GOTO GET_FILE
$ PROCESS_FILE:
$ NAME = F$PARSE("STATS.DAT",, "NAME")
.
.
.
$ GET_FILE:
$ INQUIRE FILE "File name"
$ GOTO PROCESS_FILE
|
プロシージャの終了後にユーザが必要としないファイルが作成された場合には,プロシージャを終了する前にこれらのファイルを削除またはパージします。最も新しいバージョンを除くすべてバージョンを削除するには,PURGE コマンドを使用します。ファイルの特定のバージョンを削除するには,DELETE コマンドと一緒にバージョン番号を指定します。ファイルのすべてのバージョンを削除するには,DELETE コマンドのバージョン・フィールドにワイルドカード文字を使用します。
コマンド・プロシージャの中で DELETE コマンドを使用するときに,エラー・メッセージが出されないようにするには,F$SEARCH 関数を使用して,削除する前にそのファイルが存在するかどうかをチェックします。たとえば,特定のモジュールが存在する場合にのみ TEMP.DAT というファイルを作成するコマンド・プロシージャを作成することができます。次のコマンド行は,TEMP.DAT が存在する場合にだけ DELETE コマンドを出します。
$ IF F$SEARCH("TEMP.DAT").NES. "" THEN DELETE TEMP.DAT;*
|
| F$LOGICAL | 論理名の同値文字列を戻す。 |
| F$TRNLNM | 論理名の同値文字列または要求された属性を戻す。 |
F$TRNLNM 関数は,OpenVMS オペレーティング・システムの以前のバージョンで使用されていた F$LOGICAL に代わるものです。コマンド・プロシージャが現在のシステム手法を使用して論理名を処理するようにするには,F$LOGICAL の代わりに F$TRNLNM を使用してください。 |
場合によっては,コマンド・プロシージャの変数としてシンボルではなく,論理名を使用するとよいことがあります。プログラムは,DCL シンボルにアクセスするより論理名にアクセスする方が簡単だからです。したがって,コマンド・プロシージャから実行するプログラムに情報を渡すには,シンボルを使用して情報を得てから,DEFINE または ASSIGN コマンドを使用して,シンボルの値を論理名に定義します。
また,F$TRNLNM 関数を使用して論理名の値を判断してから,その値をシンボルに割り当てることもできます。
次の例は,論理名 NAMES が定義されているかどうかをテストします。定義されている場合には,プロシージャは PAYROLL.EXE を実行し,定義されていない場合には,FILE シンボルの値を得て,この値を使用して論理名 NAMES を作成します。PAYROLL.EXE は,論理名 NAMES を使用して従業員名のファイルを表しています。
$ ! Make sure that NAMES is defined
$ IF F$TRNLNM("NAMES").NES. "" THEN GOTO ALL_SET
$ INQUIRE FILE "File with employee names"
$ DEFINE NAMES 'FILE'
$ !
$ ! Run PAYROLL, using the file indicated by NAMES
$ ALL_SET:
$ RUN PAYROLL
.
.
.
|
このコマンド・プロシージャは,PAYROLL プログラムで使用される論理名を定義します。
$ DEFINE NAMES DISK4:[JONES]EMPLOYEE_NAMES.DAT
$ RUN PAYROLL
.
.
.
$ WRITE SYS$OUTPUT "Finished processing ",F$TRNLNM("NAMES")
|
プロシージャの終わりに,ファイルが処理されたことを示すメッセージが WRITE コマンドによって表示されます。
15.6 文字列の処理
| F$CVTIME | 時刻文字列についての情報を戻す。 |
| F$EDIT | 文字列を編集する。 |
| F$ELEMENT | 各要素が区切り文字によって分けられている文字列から要素を取り出す。 |
| F$EXTRACT | 文字列の一部を取り出す。 |
| F$FAO | 出力文字列を書式化する。 |
| F$LENGTH | 文字列の長さを決定する。 |
| F$LOCATE | 文字列の中の文字または部分文字列を探して,オフセットを戻す。 |
文字列を調べる理由の 1 つに,文字列の中に文字(または部分文字列)が存在するかどうかの判別があります。このためには,F$LENGTH と F$LOCATE 関数を使用します。F$LOCATE 関数が戻す値が F$LENGTH 関数が戻す値と等しければ,探している文字は存在しません。
次のプロシージャは,バージョン番号を含むファイル名を要求しています。バージョン番号が存在するかどうかを判別するために,ユーザが入力したファイル名の中に,バージョン番号の前に置くセミコロン(;)があるかどうかをテストします。
$ INQUIRE FILE "Enter file(include version number)"
$ IF F$LOCATE(";", FILE).EQ. F$LENGTH(FILE)THEN -
GOTO NO_VERSION
.
.
.
|
F$LOCATE 関数は,セミコロンのオフセットを戻します。オフセットは 0 で始まるため,セミコロンが文字列の最初の文字であれば,F$LOCATE 関数は整数 0 を戻します。文字列の中にセミコロンがなければ,F$LOCATE 関数は,文字列の最後の文字のオフセットより 1 だけ大きいオフセットを戻します。この値は,番号 1 から始まる文字列の長さに相当する F$LENGTH が戻す長さと同じです。
15.6.2 文字列の一部の取り出し
文字列の一部を取り出すには,F$EXTRACT 関数または F$ELEMENT 関数のどちらかを使用します。定義されたオフセットから始まる部分文字列を取り出すには F$EXTRACT 関数を使用し,2 つの区切り文字の間の文字列の一部を取り出すには,F$ELEMENT 関数を使用します。どちらの関数を使用するかを選択するためには,解析する文字列の一般形式がわかっていなければなりません。
ファイル指定または時刻文字列を解析するには,F$EXTRACT または F$ELEMENT を使用する必要はありません。代わりに,F$PARSE または F$CVTIME を使用して,ファイル指定または時刻文字列の一部を取り出します。
グループ名を取り出すのと同時に,グループ名の長さを判断することもできます。
文字列にその文字列の異なる部分を区切る区切り文字をが含まれている場合には,F$ELEMENT 関数を使用して,必要な部分を取り出すことができます。F$ELEMENT を使用すると,文字列の中でカンマで区切られた部分を取り出すことにより,異なるアクセス・タイプを入手できます。システム・アクセスを判断するには,最初の要素を入手します。オーナ・アクセスを判断するには,2 番目の要素を入手します。以下も同様です。F$ELEMENT 関数を使用する場合には,要素番号は 0 から始まります。この理由から,4 番目の要素を指定するときは,整数 3 を使用します。
次のコマンド・プロシージャは,F$EXTRACT 関数を使用して UIC のグループ部分を取り出します。このとき,ユーザの UIC グループに応じて,異なるコマンド・セットを実行できます。
$ UIC = F$USER()
$ GROUP_LEN = F$LOCATE(",",UIC)- 1
$ GROUP = F$EXTRACT(1,GROUP_LEN, UIC)
$ GOTO 'GROUP'_SECTION
.
.
.
$ WRITERS_SECTION:
.
.
.
$ MANAGERS_SECTION:
.
.
.
|
最初に,F$USER 関数によって UIC を判別します。次に,F$LOCATE を使用してコンマのオフセットを検出して,グループ名の長さを判別します。コンマによって UIC のグループとユーザ部分が区切られているからです。左括弧とコンマの間にあるものがグループ名の部分になります。たとえば,UIC [WRITERS,SMITH] のグループ名は WRITERS です。
長さを判別した後,プロシージャは F$EXTRACT 関数によってグループの名前を取り出します。名前はオフセット 1 で始まり,コンマの前の文字で終わります。最後に,該当するラベルに処理を移します。
次の例では,保護コードの各アクセス・タイプがカンマでどのように区切られるかを示しています。
$ UIC = F$USER()
$ GROUP = F$EXTRACT(1, F$LOCATE(",",UIC)- 1, UIC)
$ GOTO 'GROUP'_SECTION
|
次の例では,保護コードの各アクセス・タイプがカンマでどのように区切られるかを示しています。
$ PROT = F$ENVIRONMENT("PROTECTION")
$ SHOW SYMBOL PROT
PROT = "SYSTEM=RWED, OWNER=RWED, GROUP=RE, WORLD"
|
この例のコマンドは,省略時の保護コードからワールド・アクセスの部分(4 番目の要素)を取り出します。
$ PROT = F$ENVIRONMENT("PROTECTION")
$ WORLD_PROT = F$ELEMENT(3,",",PROT)
.
.
.
|
この例では,F$ELEMENT 関数は,3 番目のコンマと文字列の終わりの間にあるすべてを戻すため,省略時の保護がワールド・ユーザの読み込みアクセスを許容している場合には,文字列 " WORLD=R" が戻されます。
ワールド・アクセス文字列を得たら,さらにそれを調べる必要があります。たとえば,次のようにします。
$ PROT = F$ENVIRONMENT("PROTECTION")
$ WORLD_PROT = F$ELEMENT(3,",",PROT)
$ IF F$LOCATE("=", WORLD_PROT).EQ. F$LENGTH(WORLD_PROT)-
THEN GOTO NO_WORLD_ACCESS
.
.
.
|
| 前へ | 次へ | 目次 | 索引 |