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


目次 索引



プログラム・スタブ とは,設計をテストするときに,プロシージャで使用する一時的なコード・セクションです。通常,プログラム・スタブは,そのスタブのかわりに実際に使用される機能を示すメッセージを出力します。全体の設計が正しく動作することを確認した後は,各スタブを正しいコーディングに置き換えます。

例: 変数の割り当てと条件のテスト

次の例では,変数の割り当てと条件のテスト方法を示しています。

$ INQUIRE COMMAND- 
  "Enter command (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE)" 
$ IF COMMAND .EQS. "EXIT" THEN EXIT 
$! 
$! Execute if user entered DELETE 
$ DELETE: 
$    IF COMMAND .NES "DELETE" THEN GOTO DIRECTORY         (1) (2)
$    WRITE SYS$OUTPUT "This is the DELETE section."       (3)
$! Execute if user entered DIRECTORY 
$ DIRECTORY:                                              (4)
$    IF COMMAND .NES "DIRECTORY" THEN GOTO PRINT 
$    WRITE SYS$OUTPUT "This is the DIRECTORY section." 
   .
   .
   .
$! Execute if user entered TYPE 
$ TYPE: 
$    IF COMMAND .NES "TYPE" THEN GOTO ERROR               (5)
$    WRITE SYS$OUTPUT "This is the TYPE section." 
$! 
$ ERROR: 
$    WRITE SYS$OUTPUT "You have entered an invalid command." (6)
$! 
$ EXIT 

例を確認するときは,次のことに注意してください。

  1. この IF 文は,ユーザが入力したコマンド (COMMAND) が "DELETE" に等しいかどうかをテストする。COMMAND が DELETE に等しい場合には,コマンド・プロシージャは次のコマンドを実行する。

  2. この文には GOTO コマンドも指定されている。 GOTO コマンドは,実行の流れをプロシージャ内のラベルに変更するために使用する。この場合,COMMAND が DELETE に等しくない場合には,プロシージャは DIRECTORY ラベルに進む。

  3. この文はプログラム・スタブである。コマンド・プロシージャのロジックのテストが終了した後,この行は DELETE 操作にとって必要な実際のコマンドに置き換えられる。

  4. これは DIRECTORY サブルーチンのラベルである。各コマンド・ブロックを識別するラベルは,オプション・リストのコマンドと同じである。このため,GOTO 文でシンボル COMMAND を使用できる ( これはユーザの要求に等しく定義されている )。

  5. この IF 文は,"TYPE" コマンドが入力されたかどうかをテストする。 "TYPE" が入力された場合には,プロシージャは "This is the TYPE section." を出力する。しかし,これはテストする最後のコマンドであるため,入力されたコマンドが "TYPE"でない場合には,プログラムはエラー・メッセージを表示する。

  6. すべてのコマンドをテストした後,正しいコマンド名が見つからない場合には,プログラムは "You have entered an invalid command." を出力する。



13.5.3 手順 3: ループを追加する

ループとは,条件が満足されるまで繰り返し実行される文の集まりです。ループは次のように機能します。

  1. ユーザ入力から値を入手します。

  2. コマンドを処理します。

  3. ユーザがコマンド・プロシージャを終了するまで,処理を繰り返します。

ループを作成するには,次の手順を実行します。

手順 操作
1 ループの先頭にラベルを付ける。
2 変数を調べて,ループの中のコマンドを実行する必要があるかどうかを判別する。
3 ループを実行する必要がない場合には,ループの終わりに進む。
4 ループを実行する必要がある場合には,ループ本体の中のコマンドを実行してから,ループの始めに戻る。
5 ループを終了する。

次の例では, CLEANUP.COM コマンド・プロシージャでのループの使い方を示しています。

$ GET_COM_LOOP: 
$     INQUIRE COMMAND- 
$     "Enter command (DELETE, DIRECTORY. EXIT, PRINT, PURGE, TYPE)" 
$     IF COMMAND .EQS. "EXIT" THEN GOTO END_LOOP 
$! 
$! Execute if user entered DELETE 
$ DELETE: 
$     IF COMMAND .NES. "DELETE" THEN GOTO DIRECTORY 
$     WRITE SYS$OUTPUT "This is the DELETE section." 
$     GOTO GET_COM_LOOP 
   .
   .
   .
$ END_LOOP: 
$     WRITE SYS$OUTPUT "Directory ''F$DIRECTORY()' has been cleaned" 
$ EXIT 

コマンドを実行した後,ユーザが EXIT コマンドを入力するまで,制御は GET_COM_LOOP ラベルに戻されます。 EXIT コマンドが入力されると,プロシージャはディレクトリが整理されたことを示すメッセージを出力します。

13.5.4 手順 4: コマンド・プロシージャを終了する

コマンド・プロシージャを終了するには,次の手順を実行します。

手順 操作
1 どこでコマンド・プロシージャを終了するかを判断する。
2 必要に応じて EXIT または STOP コマンドを指定する。



コマンド・プロシージャで EXIT コマンドを使用すると,次のことが可能になります。

  • プロシージャが特定の行を実行しないようにすることができる。

  • 複数の実行パスを持つプロシージャを終了できる。

  • コマンド・プロシージャを終了できる。

次の例は,プロシージャの最後に指定されているエラー処理ルーチンを実行しないようにするために,EXIT コマンドを使用する方法を示しています。

   .
   .
   .
$ EXIT ! End of normal execution path 
$ ERROR_ROUTINE 
   .
   .
   .

次の例は,複数の実行パスを持つプロシージャを終了するために, EXIT コマンドを使用する方法を示しています。

$ START: 
$     IF P1 .EQS. "TAPE" .OR. P1 .EQS. "DISK" THEN GOTO 'P1' 
$     INQUIRE P1 "Enter device (TAPE or DISK)" 
$     GOTO START 
$ TAPE: !Process tape files 
   .
   .
   .
$     EXIT 
$ DISK: ! Process disk files 
   .
   .
   .
$     EXIT 

各ラベル (TAPE と DISK) の後のコマンドは,プロシージャで異なるパスを与えます。 DISK ラベルの前の EXIT コマンドは,プロシージャがそのラベルに明示的に分岐した場合を除き,DISK ラベルの後のコマンドが実行されないようにします。

プロシージャの最後に EXIT コマンドを指定する必要はありません。これは,プロシージャのエンド・オブ・ファイルにより,暗黙に EXIT コマンドが実行されるからです。しかし,なるべく EXIT コマンドを指定するようにしてください。

コマンド・プロシージャで STOP コマンドを使用すると,重大なエラーが発生したときに,プロシージャを終了することができます。会話形式で実行されているコマンド・プロシージャで STOP コマンドを使用した場合には,制御は DCL レベルに戻されます。バッチ・モードで実行されているコマンド・プロシージャの場合には,バッチ・ジョブが終了します。

このコマンド行は,重大なエラーが発生したときに,プロシージャを停止するように要求します。

$ ON SEVERE_ERROR THEN STOP 



13.5.5 手順 5: プログラム・ロジックをテストおよびデバッグする

プログラム・スタブを使用してコードを作成した場合には,コマンド・プロシージャの全体的なロジックをテストしなければなりません。可能性のあるすべての実行パスをテストしなければなりません。

コマンド・プロシージャをテストおよびデバッグするには,次の手順を実行します。

手順 操作
1 コマンド・プロシージャに正しい各コマンドを入力して,プログラム・ロジックをテストする。
2 誤ったコマンドを入力して,プログラム・ロジックのテストを継続する。
3 EXIT コマンドを使用して,コマンド・プロシージャを終了することにより,プログラム・ロジックのテストを終了する。
4 必要な場合には,SET VERIFY,SET PREFIX, SHOW SYMBOL コマンドを使用して,プログラムをデバッグする。

次の例では,可能な各コマンドと無効なコマンドを入力および実行して,コマンド・プロシージャをテストし,最後にプロシージャを終了する方法を示しています。

$ @CLEANUP 
  Enter command (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE): DELETE 
  This is the DELETE section. 
  Enter command (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE): DIRECTORY 
  This is the DIRECTORY section. 
   .
   .
   .
  Enter command (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE): PRINF 
  You have entered an invalid command. 
  Enter command (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE): EXIT 
$ 



次のコマンドは,コマンド・プロシージャをデバッグするのに役立ちます。

  • SET VERIFY
    実行する前に各行を表示する。チェック設定でエラーが発生した場合には,そのエラーと,エラーを生成した行が表示される。 SET VERIFY コマンドでは,コマンド行だけをチェックするのか,データ行もチェックするのかを指定するために,キーワードを使用できる。
    SET VERIFY コマンドは,ログアウトするまで,SET NOVERIFY コマンドを入力するまで,または F$VERIFY レキシカル関数を使用してチェック設定を変更するまで有効である ( チェック設定の変更についての詳しい説明は, 第 15 章 を参照 )。

  • SET PREFIX
    チェック機能が有効な場合には,DCL コマンド SET PREFIX を使用し,各コマンド行の前に,そのコマンドが実行された時刻を挿入することにより,プロシージャ・ログ・ファイルにタイム・スタンプを出力できる。

  • SHOW SYMBOL
    SHOW SYMBOL コマンドを使用すれば,プロシージャ内のシンボルがどのように定義されているかを判断できる。

例: SET VERIFY コマンドの使用によるデバッグ

次の例では,END_LOP というラベルの綴りが誤っています。チェック機能が有効に設定されているため,エラーがどこで発生したのかを正確に判断できます。

$ SET VERIFY 
$ @CLEAN 
$ GET_COM_LOOP: 
$    INQUIRE COMMAND - 
     "Enter command (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE)" 
 Enter command (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE): EXIT 
$    IF COMMAND .EQS. "EXIT" THEN GOTO END_LOP 
 %DCL-W-USGOTO, target of GOTO not found - 
 check spelling and presence of label 

エラーを修正するには,ラベルを END_LOOP に変更します。

例: SET PREFIX コマンドの使用によるデバッグ

次の例ではタイム・スタンプの使い方を示しています。

$  SET VERIFY 
$  @TEST 
$  SET DEFAULT SYS$LOGIN 
$  SHOW DEFAULT 
   USER$:[SMYTHE] 
$  SET PREFIX "(!5%T) " 
$  @TEST 
 (17:52)  $ SET DEFAULT SYS$LOGIN 
 (17:52)  $ SHOW DEFAULT 
   USER$:[SMYTHE] 

例: SHOW SYMBOL コマンドの使用によるデバッグ

次の例では,SHOW SYMBOL コマンドを使用して,シンボル COMMAND がどのように定義されているか判断する方法を示しています。

$ SET VERIFY 
$ @CLEAN 
$ GET_COM_LOOP: 
$    INQUIRE COMMAND - 
     "ENTER COMMAND (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE)" 
  ENTER COMMAND (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE): EXIT 
$ SHOW SYMBOL COMMAND 
 COMMAND = "EXIT" 
$    IF COMMAND .EQS. "exit" THEN GOTO END_LOOP 
   .
   .
   .

SHOW SYMBOL コマンドを実行すると,シンボル COMMAND の値が "EXIT" であることがわかります。INQUIRE コマンドは入力を大文字に自動的に変換しますが,コマンドをテストする IF 文では,文字列 "exit" で小文字を使用しているため, DCL は文字列が等しくないと判断します。このエラーを修正するには, IF 文に指定した,引用符で囲んだ文字列を大文字にします。文字列の残りの部分は,大文字でも小文字でもかまいません。

コマンド・プロシージャの実行中に割り込みをかけて,チェック機能を有効にすることもできます。コマンド・プロシージャに SET VERIFY コマンドや Ctrl/Y キー・シーケンスが含まれていない限り,次の操作を実行して,チェック機能を有効に設定できます。

手順 操作
1 Ctrl/Y を押して実行に割り込みをかける。
2 SET VERIFY コマンドを入力する。
3 CONTINUE コマンドを入力して,コマンド・プロシージャの実行を続行する ( チェック機能を有効にした状態で )。



13.5.6 手順 6: クリーンアップ・タスクを追加する

一般に,コマンド・プロシージャを実行した結果,ユーザのプロセス状態が変化しないようにしなければなりません。したがって,コマンド・プロシージャには,プロセスをもとの状態に戻す一連のコマンドを指定しなければなりません。このコマンドは通常,"CLEAN_UP" というラベルの付いたサブルーチンの一部です。一般的なクリーンアップ操作としては,ファイルを閉じる操作と,省略時のデバイスおよびディレクトリをリセットする操作があります。

コマンド・プロシージャにクリーンアップ・タスクを追加するには,次の操作を実行します。

手順 操作
1 CLEAN_UP などのラベルを使用して,クリーンアップ・サブルーチンを開始する。
2 F$GETJPI レキシカル関数を使用して,開かれているファイルがあるかどうかテストする。
3 DELETE コマンドまたは PURGE コマンドを使用して,一時ファイルまたは余分なファイルを削除する。
4 (デバイスやディレクトリなど) 省略時の設定を変更した場合には,SET DEFAULT コマンドを使用して,元の状態に復元する。
5 クリーンアップ操作が確実に実行されるように, ON CONTROL_Y 文を指定する。



ファイルが開かれている場合には,プロシージャを終了する前に確実にファイルを閉じてください。レキシカル関数 F$GETJPI を使用すれば,プロセスに対して残されているオープン・ファイル・クォータ (FILCNT) を調べることができます。 FILCNT が,コマンド・プロシージャの開始時と終了時に同じである場合には,開かれたままになっているファイルはありません。

この例では,ファイルが開かれたままになっていることをユーザに警告するために使用するコマンドを示しています。

$ FIL_COUNT = F$GETJPI ("","FILCNT") 
   .
   .
   .
$ IF FILCNT .NE. F$GETJPI ("", "FILCNT") THEN- 
  WRITE SYS$OUTPUT "WARNING -- file left open) 



一時ファイルを作成した場合には,それを削除します。一般に,ファイルを更新した場合には,ファイルをパージして以前のコピーを削除しなければなりません。自分で作成していないファイルを削除する場合には,そのファイルを削除してもかまわないかどうか確認してください。たとえば,重要なデータが格納されているファイルを更新した場合には,バージ操作は必要に応じて省略できます。

省略時のデバイスとディレクトリのどちらか一方または両方を変更した場合には,コマンド・プロシージャを終了する前に,元の省略時の設定に戻さなければなりません。元の省略時のディレクトリの名前をセーブするには, F$ENVIRONMENT レキシカル関数の DEFAULT キーワードを使用します。コマンド・プロシージャの最後に,保存したデバイスとディレクトリを復元する SET DEFAULT コマンドを指定します。

この例に示したコマンド行は,デバイスとディレクトリの省略時の設定を保存し,復元します。

$ SAV_DEFAULT = F$ENVIRONMENT ("DEFAULT") 
   .
   .
   .
$ SET DEFAULT 'SAV_DEFAULT' 



次の表は,一般に変更されるその他のプロセス属性,これらの属性をセーブするために使用されるレキシカル関数,復元するために使用されるレキシカル関数またはコマンドを示しています。

属性 セーブのための
レキシカル関数
復元のための
レキシカル関数
DCLプロンプト F$ENVIRONMENT SET PROMPT
省略時の保護 F$ENVIRONMENT SET PROTECTION/DEFAULT
特権 F$SETPRV F$SETPRV または
SET PROCESS/PRIVILEGES
制御文字 F$ENVIRONMENT SET CONTROL
検査 F$VERIFY F$VERIFY
メッセージ・フォーマット F$ENVIRONMENT SET MESSAGE
キーの状態 F$ENVIRONMENT SET KEY

これらのレキシカル関数についての詳細は,『OpenVMS DCL ディクショナリ』を参照してください。


目次 索引

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