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

前へ | 次へ | 目次 | 索引

### 15.5.6.1 ファイルを閉じる

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

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

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

### 15.5.6.2 一時ファイルまたは余分なファイルの削除

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

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

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

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

### 15.5.6.3 一般に変更されるプロセス属性

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

属性 | セーブのための レキシカル関数 | 復元のための レキシカル関数
--- | --- | ---
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

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

### 15.5.6.4 クリーンアップ操作を確実に実行するには

コマンド・プロシージャが途中で打ち切られる場合でも，クリーンアップ操作が確実に実行されるようにするには，コマンド・プロシージャの各コマンド・レベルを次の文で開始します。

    $ ON CONTROL_Y THEN GOTO CLEANUP

ON CONTROL_Y コマンドの使用方法についての詳細は， 第 16 章 を参照してください。

## 15.5.7 手順 7: コマンド・プロシージャを完成する

全般的な設計が正しく動作している場合には，次の操作を実行してコマンド・プロシージャを完成します。

手順 | 操作
--- | ---
1 | コマンド・プロシージャ内の最初のプログラム・スタブをコマンドに置き換える。
2 | コマンド・プロシージャをテストして，新しいコマンドが正しく機能するかどうか確認する。
3 | 必要に応じて，コマンド・プロシージャをデバッグする。
4 | 最初のプログラム・スタブが正常に機能する場合には，次のスタブに移動する。すべてのプログラム・スタブが置換されるまで，この操作を続行する。

例: プログラム・スタブとコマンドの置換

次の例は，CLEANUP.COM の TYPE セクションのコードを示しています。

    $! Execute if user entered TYPE
    $! TYPE:
    $      IF COMMAND .NES. "TYPE THEN GOTO ERROR
    $      INQUIRE FILE "File to type"
    $      TYPE 'FILE'
    $      GOTO GET_COM_LOOP

既存のコードは次のように置き換えられます。

    $ WRITE SYS$OUTPUT "This is the TYPE section."

例: CLEANUP.COM コマンド・プロシージャ

次の例は，完成した 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
    $       INQUIRE FILE "File to delete? "
    $       DELETE 'FILE'
    $       GOTO GET_COM_LOOP
    $!
    $!Execute if user entered DIRECTORY
    $ DIRECTORY:
    $       IF COMMAND .NES. "DIRECTORY" THEN GOTO PRINT
    $       DIRECTORY
    $       GOTO GET_COM_LOOP
    $!
    $!Execute if user entered PRINT
    $ PRINT:
    $       IF COMMAND .NES. "PRINT" THEN GOTO PURGE
    $       INQUIRE FILE "File to print? "
    $       PRINT SYS$OUTPUT 'FILE'
    $       GOTO GET_COM_LOOP
    $!
    $!Execute if user entered PURGE
    $ PURGE:
    $       IF COMMAND .NES. "PURGE" THEN GOTO TYPE
    $       PURGE
    $       GOTO GET_COM_LOOP
    $!
    $!Execute if user entered TYPE
    $ TYPE:
    $       IF COMMAND .NES. "TYPE" THEN GOTO ERROR
    $       INQUIRE FILE "File to type"
    $       TYPE 'FILE'
    $       GOTO GET_COM_LOOP
    $!
    $ ERROR:
    $       WRITE SYS$OUTPUT "You entered an invalid command."
    $       GOTO GET_COM_LOOP
    $!
    $ END_LOOP:
    $ WRITE SYS$OUTPUT "Directory ''F$DIRECTORY()' has been cleaned."
    $
    $ EXIT

# 15.6 コマンド・プロシージャの実行

コマンド・プロシージャを動作させるには，実行しなければなりません。コマンド・プロシージャは次の方法で実行できます。

- 別のコマンド・プロシージャの内部から実行する方法

- リモート・ノードで実行する方法

- DCL コマンドにパラメータまたは修飾子として指定する方法

- 会話形式で実行する方法

- バッチ・ジョブとして実行する方法

- ディスクおよびテープ・ボリューム上で実行する方法

この節では，これらの各方法について説明します。

## 15.6.1 他のコマンド・プロシージャの内部からのコマンド・プロシージャの実行

プロシージャ実行コマンド (@) を使用すれば，別のコマンド・プロシージャの内部からコマンド・プロシージャを実行できます。

次のコマンド・プロシージャ WRITEDATE.COM は，コマンド・プロシージャ GETDATE.COM を起動します。

    $! WRITEDATE.COM
    $!
    $ INQUIRE TIME "What is the current time in hh:mm format?"
    $ @GETDATE [JONES.COM]GETDATE.COM

## 15.6.2 リモート・ノードでのコマンド・プロシージャの実行

TYPE コマンドを使用すると，リモート・ノードの別のアカウントのトップ・レベル・ディレクトリでコマンド・プロシージャを実行できます。次の操作を実行するコマンド・プロシージャを実行できます。

- ローカル OpenVMS Cluster のサービスのうち，クラスタ全体に提供されないサービスの状態を表示する。

- リモート・ノードにログインしているユーザの一覧を表示する。

TYPE コマンドの後にアクセス制御文字列を入力します。次の形式を使用してください。

    $ TYPE nodename"username password"::"TASK=command_procedure"

username および password という変数は，リモート・ノードのアカウントのユーザ名とパスワードです。

このコマンド・プロシージャは，コマンド・プロシージャが存在するリモート・ノードにログインしているユーザを表示します。

    $!SHOWUSERS.COM
    $!
    $ IF F$MODE() .EQS. "NETWORK" THEN DEFINE/USER SYS$OUTPUT SYS$NET
    $ SHOW USERS

次の例では，SHOWUSERS.COM はノード ORIOLE の BIRD のアカウントのトップ・レベル・ディレクトリに格納されており，パスワードは BOULDER です。 SHOWUSERS.COM は，リモート・ノード ORIOLE で DCL コマンド SHOW USERS を実行します。 TYPE コマンドは，SHOWUSERS.COM からの出力をローカル・ノード，つまり type コマンドを入力したターミナルに表示します。

    $ TYPE ORIOLE"BIRD BOULDER"::"TASK=SHOWUSERS"

                 OpenVMS User Processes at 11-DEC-1998 17:20:13.30
        Total number of users = 4, number of processes = 4

     Username     Node           Interactive  Subprocess   Batch
     FLICKER      AUTOMA                 2         1
     ROBIN        FABLES                 1         2        1
     DOVE         MURMUR                 1
     DUCK         FABLES                 1         1

### 15.6.2.1 セキュリティに関する注意

TYPE コマンドとアクセス制御文字列を入力すると，ターミナルにパスワードが表示されます。 第 18 章 の説明に従って，セキュリティに関する適切な予防措置をとってください。

## 15.6.3 DCL 修飾子またはパラメータを指定したコマンド・プロシージャの実行

DCL コマンドのパラメータまたは修飾子を指定するコマンド・プロシージャを作成できます。この種のコマンド・プロシージャは，1 つ以上のコマンドで特定のパラメータまたは修飾子の組み合わせを頻繁に使用するときに便利です。

コマンド行で修飾子やパラメータを指定する場所に，プロシージャ実行コマンド(@) を入力することができます。

このコマンド・プロシージャを使用すると， LINK コマンドに対する修飾子を入力できます。

    $! This command procedure contains command
    $! qualifiers for the LINK command.
    $!
    /DEBUG/SYMBOL_TABLE/MAP/FULL/CROSS_REFERENCE

このコマンド行は，DEFLINK.COM に指定された修飾子を使用して， SYNAPSE.OBJ という名前のオブジェクトをリンクします。

    $ LINK SYNAPSE@DEFLINK

このコマンド・プロシージャは，DCL コマンドに対するパラメータ CHAP1.TXT，CHAP2.TXT，CHAP3.TXT を入力するために使用できます。

    $! PARAM.COM
    $! This command procedure contains a list of
    $! parameters that can be used with commands.
    $!
    CHAP1, CHAP2, CHAP3

このコマンド行は，パラメータ・リストのかわりにコマンド・プロシージャ PARAM を指定します。次の例では，パラメータは PARAM.COM に指定されているファイル名です。

    $ DIRECTORY/SIZE @PARAM

注意 実行プロシージャ・コマンド (@)を実行すると，指定したファイル全体がDCLのコマンド入力先とされます。

### 15.6.3.1 制限事項

コマンド・プロシージャを実行する場合には，次の制限事項があります。

- コマンド・プロシージャの先頭に修飾子名が指定されている場合には，プロシージャ実行コマンド (@) の前にスペースを指定できない。

- コマンド・プロシージャの先頭にパラメータが指定されている場合には，プロシージャ実行コマンド (@) の前にスペースを指定できない。

## 15.6.4 会話形式でのコマンド・プロシージャの実行

会話形式でコマンド・プロシージャを実行するには，コマンド・プロシージャ名の前にプロシージャ実行コマンド (@) タイプして入力します。

このコマンドは，WORKDISK: ディスクの [MAINT.PROCEDURES] ディレクトリのプロシージャ SETD.COM を実行します。

    $ @WORKDISK:[MAINT.PROCEDURES]SETD [Return]

長いコマンド行を表すためにシンボル名を定義できます。定義したシンボルを使用して，コマンド・プロシージャを実行できます。

シンボルを使用して上記例のコマンド・プロシージャを実行するには，ログイン・コマンド・プロシージャに次のコマンド行を指定しておきます。

    $ SETD == "@WORKDISK:[MAINT.PROCEDURES]SETD"

ログイン後，次のようにシンボル名を入力すれば， SETD.COM プロシージャを実行することができます。

    $ SETD [Return]

省略時の設定では，コマンド・プロシージャを会話形式で実行する場合，オペレーティング・システムは出力をターミナルに表示します。しかし，実行コマンドに対して/OUTPUT 修飾子を指定すれば，出力をファイルにリダイレクトできます。

コマンド・プロシージャの出力をファイルにリダイレクトする場合には，プロシージャはエラー・メッセージをターミナルに送信し，さらに，出力を受信しているファイルにもエラー・メッセージを送信します。

このコマンド・プロシージャは，SETD.COM からの出力を，ターミナルではなく，ファイル RESULTS.TXT に書き込みます。

    $ @SETD/OUTPUT=RESULTS.TXT

/OUTPUT 修飾子は，コマンド・プロシージャ名のすぐ後に指定しなければならず，修飾子とプロシージャ名の間にスペースを指定することはできません。この制限事項が守られないと，DCL は修飾子を，プロシージャに渡すパラメータとして解釈します。

## 15.6.5 バッチ・ジョブとしてのコマンド・プロシージャの実行

長い処理時間を必要とするコマンド・プロシージャを使用する場合 (たとえば，大きいプログラムをコンパイルしたりアセンブルする場合) には，これらのプロシージャをバッチ・ジョブとして実行すれば，ターミナルを引き続き会話形式で使用することができます。

コマンド・プロシージャをバッチ・モードで実行するには， DCL コマンド SUBMIT を入力して，コマンド・プロシージャをバッチ・キュー(実行を待っているバッチ・ジョブのリスト) に登録します。ジョブをキューに登録すると，ジョブは省略時のバッチ・ジョブ SYS$BATCH に登録され，実行を待っているジョブのキューの最後に追加されます。前に登録されていたジョブが終了すると，新たに登録したジョブが実行されます。 OpenVMS システムでは，同時に実行できるバッチ・ジョブの数は，システム管理者がバッチ・ジョブを作成するときに指定します。

次の例では，JOB1.COMという名前のコマンド・プロシージャの実行方法を示しています。 SUBMIT コマンドは省略時のファイル・タイプ .COM を使用します。したがって，コマンド・プロシージャのファイル・タイプが .COM である場合には，ファイル・タイプを入力する必要はありません。

    $ SUBMIT JOB1
    Job JOB1 (queue SYS$BATCH, entry 651, started on SYS$BATCH))

### 15.6.5.1 リモート・バッチ・ジョブ

システムがネットワークの一部として接続されている場合には，コマンド・プロシージャをリモート・ノードにバッチ・ジョブとして登録できます。このようにして使用するコマンド・プロシージャでは，ローカル・ファイルの場合と同じコマンドおよび修飾子を使用して，リモート・ノードのファイルを開いたり，閉じたりする DCL コマンドや，これらのファイルのレコードを読み込んだり，書き込むコマンドを使用できます。

### 15.6.5.2 バッチ・ジョブの再起動

省略時の設定では，ジョブが終了するためにシステムに障害が発生した場合には，バッチ・ジョブは最初の行から再実行されます。しかし，コマンド・プロシージャで次のシンボルを使用すれば，別の場所から再起動することを指定できます。

- $RESTART
  これはグローバル・シンボルであり，今回の実行の前に少なくとも 1 回以上，バッチ・ジョブが起動されていた場合には，このシンボルの値は真になる。 $RESTART の値を指定してはならない。システムが適切な値を割り当てる。

- BATCH$RESTART
  これはグローバル・シンボルであり，シンボルの値は， SET RESTART_VALUE コマンドを使用して指定できる。

$RESTART と BATCH$RESTART の使用

次の操作手順は，$RESTART シンボルと BATCH$RESTART シンボルの使用方法を示しています。

手順 | 操作
--- | ---
1 | プロシージャの可能な各開始点の先頭にラベルを指定する。
2 | 各セクションの最初の処理として， SET RESTART_VALUE コマンドを使用して，BATCH$RESTART の値をラベルに等しく設定する。
3 | プロシージャを開始するときに $RESTART をテストする。
4 | $RESTART が真の場合には， BATCH$RESTART を分岐先ラベルとして使用して，GOTO 文を実行する。

このコマンド・プロシージャは，ライブラリから多くのモジュールを取り出し，それらのモジュールを連結し，作成されたファイルをソートします。

    $! SORT_MODULES.COM
    !
    $! Set default to the directory containing
    $! the library whose modules are to be sorted
    $ SET DEFAULT WORKDISK:[ACCOUNTS.DATA83]
    $!
    $! Check for restarting
    $ IF $RESTART THEN GOTO "BATCH$RESTART"
    $!
    $ EXTRACT_LIBRARIES:
    $ SET RESTART_VALUE=EXTRACT_LIBRARIES
       .
       .
       .
    $ CONCATENATE_LIBRARIES:
    $ SET RESTART_VALUE=CONCATENATE_LIBRARIES
       .
       .
       .
    $ SORT_FILE:
    $ SET RESTART_VALUE=SORT_FILE
       .
       .
       .
    $ EXIT

このコマンド・プロシージャが途中で打ち切られた場合には， BATCH$RESTART の値に応じて，ファイルの先頭から再実行されるか， CONCATENATE_LIBRARIES というラベルの付いた文から再実行されるか， SORT_FILE というラベルの付いた文から再実行されます。多くの独立したモジュールを取り出しているため，各抽出操作は別々のセクションにすることができます。

前へ | 次へ | 目次 | 索引