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


前へ 次へ 目次 索引



第 16 章
DCL での拡張プログラミング

拡張 DCL プログラミングとは,複雑なコマノド・プロシージャと DCL コマンドの PIPE コマンドを使用することです。

複雑なコマンド・プロシージャは,プログラムと同様の機能を実行できます。コマンド・プロシージャでは,変数入力を使用でき,特定の条件が真のときにだけプロシージャのセクションを実行でき,サブルーチンを実行したり,他のコマンド・プロシージャを起動することができます。

DCL の PIPE コマンドも,プログラムと同様の機能を実行できます。たとえば PIPE コマンドを使用すると,同一 DCL コマンド行から,次に示す 1 つまたは複数の操作を実行できます。

本章では,次のことについて説明します。

本章は次の方を対象にしています。

その他の情報については,次のものを参照してください。

16.1 コマンド・プロシージャ入力の実行

コマンド・プロシージャでは,ユーザが提供するデータを必要とすることがよくあります。このデータ,つまり入力は会話形式で入手でき( 第 15 章 を参照),非会話形式で入手することもできます。本章では,非会話型入力方式について説明し, 第 15 章 で説明していない会話型入力方式についても説明します。

コマンド・プロシージャを実行するたびに,同じデータを使用できます。同じデータを使用するには,コマンド・プロシージャでデータを必要とするコマンドの後のデータ行にデータを指定します。

次のコマンド・プロシージャは, CENSUS.EXE コマンド・プロシージャを実行します。 CENSUS.EXE はプロシージャが実行されるたびに 1993,1994,1995 のデータを読み込みます。


$ ! CENSUS.COM 
$ ! 
$ RUN CENSUS 
1993 
1994 
1995 
$ EXIT 

16.1.1 コマンド・プロシージャにデータを登録する場合の制限事項

DCL は,データ行に指定されたテキストをコマンド・プロシージャに直接渡します。したがって,次に示すように,変換しなければならないデータは処理されません。

16.1.2 その他のデータ入力方式

この後の節では,次に示すように,コマンド・プロシージャに対する入力データを入手するための別の方法について説明します。

16.2 データを渡すためのパラメータの使用

コマンド・プロシージャにデータとしてパラメータを渡す場合には,次のガイドラインに従ってください。

DCL はローカル・シンボル P1〜P8 を使用して,パラメータをコマンド・プロシージャに渡します。 P1 には最初のパラメータ値が割り当てられ,P2 には 2 番目のパラメータ値, P3 には 3 番目のパラメータ値が割り当てられます。以下も同様です。たとえば,次のコマンドは,コマンド・プロシージャ SUM.COM を起動し, 8 つのパラメータをプロシージャに渡します。


$ @SUM 34 52 664 89 2 72 87 3 

16.2.1 整数としてのパラメータの指定

パラメータとして整数を指定した場合には,それは文字列に変換されます。次の例では,P1 は文字列値 24 であり,P2 は文字列値 25 です。


$ @ADDER 24 25 

シンボル P1〜P8 は,整数式と文字列式の両方で使用できます。 DCL は必要な変換を自動的に実行します。

16.2.2 文字列としてのパラメータの指定

文字列内のスペース,タブ,小文字を保存するには,文字列の前後を引用符 (" ") で囲みます。次の例を参照してください。


$ @DATA "Paul Cramer" 

次の例では,P1 は Paul Cramer であり,P2 はヌルです。引用符を省略した場合には,各文字列は独立したパラメータとして渡されます。次の例を参照してください。


$ @DATA Paul Cramer 

この例では,文字列 Paul と Cramer が大文字に変換され,P1 は PAUL に, P2 は CRAMER になります。

もう 1 つの例として,次のコマンドで DATA.COM を起動した場合を考えます。


$ @DATA  "Paul Cramer" 24 "(555) 111-1111") 

P1〜P8 は DATA.COM の中では次のように定義されています。

P1 = Paul Cramer
P2 = 24
P3 = (555) 111-1111
P4--P8 = null

16.2.3 シンボルとしてのパラメータの指定

シンボル値を渡すには,シンボルの前後を一重引用符で囲みます。シンボル値の内部でスペース,タブ,小文字を保存するには,値を 3 組の引用符で囲みます。文字列の一部として引用符を使用する場合には, 3 組の引用符を使用しなければなりません。

別の方法として,テキストを引用符で囲み,シンボルが表示されるときに,シンボルの前に 2 つの一重引用符を指定し,シンボルの後に 1 つの一重引用符を指定する方法があります。

次の例では,P1 は Paul であり,P2 は Cramer です。シンボルをコマンド・プロシージャに渡すときに,DCL は引用符を削除します。


$ NAME = "Paul Cramer" 
$ @DATA 'NAME' 

次の例では,P1 は "Paul Cramer" であり,P2 はヌルです。


$ NEW_NAME = """Paul Cramer""" 
$ @DATA 'NEW_NAME' 

次の例では,P1 は Paul Cramer に変換されます。


$ ! DATA.COM 
$ @NAME "''P1'" 

16.2.4 ヌル値としてのパラメータの指定

空のパラメータを渡すには,コマンド文字列の位置を表す一組の二重引用符を使用します。次の例では,DATA.COM に渡される最初のパラメータは空のパラメータです。


$ @DATA "" "Paul Cramer" 

この例では,P1 が空値で,P2 が Paul Cramer です。

16.3 バッチ・ジョブにデータを渡すためのパラメータの使用

バッチ・モードで実行されるコマンド・プロシージャにパラメータを渡すには, SUBMIT コマンドの修飾子 /PARAMETERS を使用します。

1 つの SUBMIT コマンドを使用して,複数のコマンド・プロシージャを実行する場合には,指定したパラメータは,バッチ・ジョブ内の各コマンド・プロシージャに対して使用されます。

次の例では,コマンドは, 3 つのパラメータをコマンド・プロシージャ ASK.COM と GO.COM に渡します。これらのコマンド・プロシージャはバッチ・ジョブとして実行されます。


$ SUBMIT/PARAMETERS=(TODAY,TOMORROW,YESTERDAY) ASK.COM, GO.COM) 

次の例では,SUBMIT コマンドは,2 つのパラメータをコマンド・プロシージャ LIBRARY.COM と SORT.COM に渡します。


$ SUBMIT- 
_$ /PARAMETERS=(DISK:[ACCOUNT.BILLS]DATA.DAT,DISK:[ACCOUNT]NAME.DAT) - 
_$ LIBRARY.COM, SORT.COM 

ユーザがログインして,各コマンド・プロシージャを実行したかのように,バッチ・ジョブが実行されます。この SUBMIT コマンドが実行するバッチ・ジョブは,ユーザのアカウントにログインし,ユーザのログイン・コマンド・プロシージャを実行し,その後,次のコマンドを実行します。


$ @LIBRARY DISK:[ACCOUNT.BILLS]DATA.DAT DISK:[ACCOUNT]NAME.DAT) 
$ @SORT DISK:[ACCOUNT.BILLS]DATA.DAT DISK:[ACCOUNT]NAME.DAT) 

データをコマンド・プロシージャの中に指定する方法, SYS$INPUT をファイルとして定義する方法でも,データをバッチ・ジョブに渡すことができます。指定されたパラメータは,バッチ・ジョブのそれぞれのコマンド・プロシージャで使用されます。

16.4 ネスティングしたコマンド・プロシージャにデータを渡すためのパラメータの使用

ネスティングしたコマンド・プロシージャに最大 8 つのパラメータを渡すことができます。ネスティングしたプロシージャでのローカル・シンボル P1〜P8 は,起動するプロシージャのローカル・シンボル P1〜P8 と関連づけられません。

次の例では,DATA.COM は,ネスティングしたコマンド・プロシージャ NAME.COM を起動します。


$ ! DATA.COM 
$ @NAME 'P1' Joe Cooper 

DATA.COM の P1 が Paul Cramer という文字列である場合には,この文字列引用符が含まれていないため, 2 つのパラメータとして NAME.COM に渡されます。 NAME.COM では,P1〜P8 は次のように定義されます。

P1 = PAUL
P2 = CRAMER
P3 = JOE
P4 = COOPER
P5--P8 = null

DATA.COM の P1 が "Paul Cramer" (引用符が含まれている) の場合には,次に示すように,3 組の引用符で P1 を囲むことにより, 1 つのパラメータとして値を NAME.COM に渡すことができます。


$ ! DATA.COM 
$ QUOTE = """ 
$ P1 = QUOTE + P1 + QUOTE 
$ @NAME 'P1' "Joe Cooper" 

この例では,コマンド・プロシージャ NAME.COM で P1 は Paul Cramer であり, P2 は Joe Cooper です。

16.5 データを要求するプロンプトの表示

コマンド・プロシージャのデータを会話形式で入手するには, INQUIRE コマンド ( 第 15 章 を参照) または READ コマンドを使用できます。どちらのコマンドも,入力を要求するプロンプトを表示し,応答をシンボルに割り当てます。

READ コマンドと INQUIRE コマンドの相違点は次のとおりです。

INQUIRE コマンド READ コマンド
値を要求するプロンプト 値を要求するプロンプト
ターミナルから値を読み込む 最初のパラメータによって指定されたソースから値を読み込む
値をシンボルに割り当てる 2 番目のパラメータとして指定されたシンボルに値を割り当てる。

READ コマンドは,プロンプトに対する応答としてターミナルに入力されたすべての文字を,正確な文字列値として受け付けます (大文字と小文字の区別,スペース,タブは保存されます)。 /PROMPT 修飾子を省略した場合には,READ コマンドは省略時のプロンプトとして Data: を表示します。

入力されたパラメータを受け付けることができ,また,必須パラメータが指定されなかったときに,ユーザ入力を要求するプロンプトを表示するコマンド・プロシージャを作成することもできます。

次の例では,コマンドは Filename: というプロンプトをターミナルに表示し,論理名 SYS$COMMAND (省略時の設定ではターミナル) によって指定されるソースから応答を読み込み,応答をシンボル FILE に割り当てます。


$ READ/PROMPT="Filename: "  SYS$COMMAND  FILE 

次の例では,プロシージャを起動したときに,ファイル名が指定されなかった場合には,ファイル名を要求するプロンプトが表示されます。


$ ! Prompt for a file name if name 
$ ! is not passed as a parameter 
$ IF P1 .EQS. "" THEN INQUIRE P1 "Filename" 
$ COPY 'P1' DISK5:[RESERVED]*.* 
$ EXIT 

注意

コマンド・プロシージャをキューに登録して,バッチ・ジョブとして実行する場合, DCL は,INQUIRE コマンドに続くデータ行から INQUIRE コマンドに指定されたシンボルの値を読み込みます。データ行を指定しない場合には,シンボルには空値が割り当てられます。

16.6 データを入手するための SYS$INPUT 論理名の使用

コマンド,ユーティリティ,その他のシステム・イメージは,省略時の入力ストリームである論理名 SYS$INPUT に指定されるソースから入力を取得します。コマンド・プロシージャの中では, SYS$INPUT はコマンド・プロシージャ・ファイルとして定義され,データを必要とするコマンドやイメージはこのファイルの中でデータ行を検索します。ただし,SYS$INPUT を再定義すれば,ターミナルや別の入力ファイルからデータを得ることができます。

16.6.1 ターミナルとしての SYS$INPUT の再定義

SYS$INPUT をターミナルとして再定義できます。このようにすると,コマンド・プロシージャから呼び出されたイメージは,コマンド・プロシージャ内のデータ行からではなく,会話形式で入力を入手できます。

コマンド・プロシージャで会話型入力を必要とする DCL コマンドやユーティリティを使用する場合には,SYS$INPUT をターミナルとして再定義しなければなりません。

たとえば,次のコマンド・プロシージャは,入力を会話形式で CENSUS.EXE イメージに提供できるようにします。


$ ! Execute CENSUS getting data from the terminal 
$ DEFINE/USER_MODE SYS$INPUT SYS$COMMAND 
$ RUN CENSUS 
$ EXIT 

DEFINE/USER_MODE コマンドは,CENSUS.EXE を実行しながら, SYS$INPUT を一時的に再定義するため,CENSUS.EXE はターミナルから入力を受け入れます。 CENSUS.EXE が終了すると,SYS$INPUT は元の定義 (コマンド・プロシージャ・ファイル) に戻されます。

たとえば,次のコマンド・プロシージャはEVE エディタを使用します。


$ ! Obtain a list of your files 
$ DIRECTORY 
$ ! 
$ ! Get file name and invoke the EVE editor 
$ EDIT_LOOP: 
$      INQUIRE FILE "File to edit (Press Return to end)" 
$      IF FILE .EQS. "" THEN EXIT 
$      DEFINE/USER_MODE SYS$INPUT SYS$COMMAND 
$      EDIT/TPU 'FILE' 
$      GOTO EDIT_LOOP 

このコマンド・プロシージャは,ユーザが Returnキーを押してループを終了するまで,ファイル名を求めるプロンプトを出します。ファイル名を入力すると,プロシージャは自動的に EVE エディタを起動してファイルを編集します。エディタの実行中,SYS$INPUT はターミナルとして定義されるので,編集内容を会話形式で入力できます。

16.6.2 SYS$INPUT を個別ファイルとして定義する場合

SYS$INPUT をファイルとして定義すれば,コマンド・プロシージャはファイルから入力を得ることができます。コマンド・プロシージャは,データ行のテキストをコマンドまたはイメージに直接渡すことに注意してください。DCL はデータ行は処理しません。データ行に DCL シンボルや式を指定しても,DCL は値をシンボルに置換しませんし,式を評価しません。データ行で感嘆符を使用すると,データを渡す先のイメージが感嘆符(!)を処理します。

データ・ファイルの名前を SYS$INPUT として指定すれば,コマンド・プロシージャ・ファイルにプログラムを登録できます。この操作を実行すると,コンパイラは別のファイルではなく,コマンド・プロシージャからプログラムを読み込みます。

次の例は,FORTRAN コマンドの後にプログラムの文が続くコマンド・プロシージャを示しています。


$ FORTRAN/OBJECT=TESTER/LIST=TESTER SYS$INPUT 
C  THIS IS A TEST PROGRAM 
   A = 1 
   B = 2 
   STOP 
   END 
$ PRINT TESTER.LIS 
$ EXIT 

FORTRAN コマンドは,論理名 SYS$INPUT を使用してコンパイルするファイルを識別します。 SYS$INPUT はコマンド・プロシージャとして定義されているため, FORTRANコンパイラは,FORTRAN コマンドに続く文を (始めにドル記号が付く次の行まで) コンパイルします。コンパイルが終了すると,2 つの出力ファイル TESTER.OBJ と TESTER.LIS が作成されます。このとき,PRINT コマンドは,リスト・ファイルを印刷します。


前へ 次へ 目次 索引