日本-日本語
日本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
ユーザーズ・マニュアル


目次 索引

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

拡張 DCL プログラミングとは,複雑なコマノド・プロシージャと DCL コマンドの PIPE コマンドを使用することです。この章は, 第 13 章 を読み, DCL でのプログラミングについての基本的な知識があり,高度なプログラミング方式を学習したい方を対象にしています。

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

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

  • パイプライン処理(コマンドのシーケンス)

  • 入出力のリダイレクト

  • 複数の条件コマンドの実行

  • バックグラウンド処理

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

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

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

  • コマンド・プロシージャ出力の実行

  • ファイルの読み込みと書き込み (ファイル入出力)

  • ファイル入出力エラーの処理

  • 実行の流れを制御する方法

  • 新しいコマンド・レベルの作成

  • CASE文の書き方

  • PIPE コマンドの使用



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

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

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

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

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



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

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

  • シンボル

  • 論理名

  • 数式



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

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

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

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

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

  • データを要求するプロンプトを表示するための READ,INQUIRE コマンドの使用

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



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

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

  • パラメータはコマンド・プロシージャのファイル指定の後に指定する。

  • 1 つのコマンド・プロシージャに対して最大8つのパラメータを渡すことができる。

  • 渡すパラメータ値の数が 8 未満の場合には,値が渡されなかったシンボルにはヌル値が割り当てられる。ヌル値とは空文字列であり,引用符 (" ") で表現される。

  • パラメータは 1 つ以上のスペースまたはタブで区切る。

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

$ @SUM 34 52 664 89 2 72 87 3 



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

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

$ @ADDER 24 25 

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

14.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


シンボル値を渡すには,シンボルの前後を一重引用符で囲みます。シンボル値の内部でスペース,タブ,小文字を保存するには,値を 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'" 



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

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

$ @DATA "" "Paul Cramer" 

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

14.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 をファイルとして定義する方法でも,データをバッチ・ジョブに渡すことができます。指定されたパラメータは,バッチ・ジョブのそれぞれのコマンド・プロシージャで使用されます。

14.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 です。

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

コマンド・プロシージャのデータを会話形式で入手するには,INQUIRE コマンド ( 第 13 章 を参照 ) または 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 コマンドに指定されたシンボルの値を読み込みます。データ行を指定しない場合には,シンボルには空値が割り当てられます。



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

14.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 はターミナルとして定義されるので,編集内容を会話形式で入力できます。

14.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 コマンドは,リスト・ファイルを印刷します。


目次 索引

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