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


前へ 次へ 目次 索引


15.5.2.1 INQUIRE コマンドの使用

INQUIRE コマンドは,値を要求するプロンプトを表示し,ターミナルから値を読み込み,その値をシンボルに割り当てます。

省略時の設定では,INQUIRE コマンドは次の操作を実行します。

次の例は,コマンド・プロシージャCLEANUP.COM の中でコマンド名の入力を求めるコマンドです。 INQUIRE コマンドは入力された値をシンボル COMMANDに割り当てます。


$ INQUIRE COMMAND- 
  "Enter command (DELETE, DIRECTORY, PRINT, PURGE, TYPE)" 

15.5.2.2 リテラル文字の保存

INQUIRE コマンドを使用するときに,小文字や複数のスペースとタブを保存するには,応答を引用符 (" ") で囲みます。応答の内部で引用符を使用するときは,引用符で囲んだテキストを引用符で囲みます (""text"")。

15.5.2.3 IFとTHENを使用した条件のテスト

INQUIRE コマンドで変数を要求するプロンプトを表示した後,どのような処理を実行するかを判断する文をコマンド・プロシージャに指定しなければなりません。たとえば,どのコマンドを実行するかを判断するには,ユーザが入力したコマンドを可能な各コマンドに対してチェックする文を,コマンド・プロシージャに指定しなければなりません。

条件が真であるかどうかをテストするには, IF コマンドと THEN コマンドを使用します。次の表は,CLEANUP.COM でチェックしなければならない可能性を示しています。

場合 結果
一致するものが見つかった場合 コマンドを実行する
一致するものが見つからない場合 次のコマンドに進む
有効なすべてのコマンドをチェックした後,一致するものが見つからない場合 エラー・メッセージを出力する

15.5.2.4 プログラム・スタブの作成

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

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

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


$ 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." を出力する。

15.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 コマンドが入力されると,プロシージャはディレクトリが整理されたことを示すメッセージを出力します。

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

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

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

15.5.4.1 EXIT コマンドの使用

コマンド・プロシージャで 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 コマンドを指定するようにしてください。

15.5.4.2 STOP コマンドの使用

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

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


$ ON SEVERE_ERROR THEN STOP 

15.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 
$ 

15.5.5.1 コマンド・プロシージャのデバッグ

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

例: 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 文に指定した,引用符で囲んだ文字列を大文字にします。文字列の残りの部分は,大文字でも小文字でもかまいません。

15.5.5.2 実行中にチェック機能をオンにする

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

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

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

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

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

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


前へ 次へ 目次 索引