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

前へ | 次へ | 目次 | 索引

## 14.14.1 自動的なフォーリン・コマンドの使用

次のことに注意してください。

- 論理名 DCL$PATH は検索リスト・タイプの論理名でもかまわない。

- 論理名の各変換のノード，デバイス，ディレクトリの部分だけが使用される。

- 通常の論理名の優先順位が有効である。ユーザは独自の論理名を定義することにより，DCL$PATH のシステム定義を変更できる。システム定義が存在するときに，ユーザがその機能を使用したくない場合には，論理名の定義を" " に変更することにより，システム定義を無効にできる。

- DCL の動詞およびシンボル名に対して使用できる文字は，ファイル名に対して使用できる文字と異なる。たとえば，DCL シンボルではハイフン (-) を使用できず， 1 文字目にドル記号 ($) を使用することもできない。実行するイメージまたはプロシージャが DCL シンボル名として正しくない場合には，この新しい機能を使用して直接起動することはできない。

- DCL はコマンドを解析していない。起動されるイメージが独自のコマンド解析を実行しなければならない。 C プログラムの場合には，main() ルーチンに対して "argc" と "argv" パラメータを使用する。他の言語で作成されたプログラムの場合には，LIB$GET_FOREIGN を呼び出して，コマンド行全体を入手する。その後，コマンド行をプログラムで解析しなければならない。

- ディレクトリにコマンド・プロシージャと実行可能イメージの両方が登録されている場合には，最初に検索されたファイルが起動される。 OpenVMS システムでは，ディレクトリはアルファベット順に並べられているため， ".COM" ファイルの方が ".EXE"ファイルより先に検索される。他のオペレーティング・システムを稼動しているノードを示す DCL$PATH 論理名に，ネットワーク・ファイル指定を指定した場合には， ".COM" ファイルより前に ".EXE" ファイルが検索される可能性がある。
  DCL は無効動詞をファイル指定として使用し， "DCL$PATH:.*" を省略時のファイル指定として使用して検索を実行するため，特定のファイルが検索されるような方法で論理名を定義することができる。たとえば，論理名 FOO を "FOO.EXE" として定義し， DCL プロンプトに対して "FOO" と入力すると，FOO.COM は絶対に起動されず， FOO.EXE だけが起動される。

注意 特権付きユーザが省略時のデバイスおよびディレクトリを他のユーザ・アカウントに設定した場合には， "SYS$DISK:[]" を DCL$PATH 論理名の定義に指定しないでください。この操作を実行すると，DCL はカレント・ディレクトリを検索します。入力エラーがある場合や，検索リストで変換の配置方法が不適切な場合には，カレント・ディレクトリのユーザ・イメージが検索され，特権が与えられた状態で誤って起動される可能性があります。

## 14.14.2 自動的なフォーリン・コマンドの制限事項

次の制限事項に注意してください。

- OpenVMS オペレーティング・システム Version 6.2 より以前のバージョンで，自動的なフォーリン・コマンドを使用することはできない。

- 新しい動詞をいつでも DCL コマンド・テーブルに追加することができるため，ある時点で自動的なフォーリン・コマンドによって動作したコマンドが，将来動作しなくなる可能性がある。

- 自動的なフォーリン・コマンド機能は，どのような場合にも動作するわけではない。次の例では，DCL (動詞の最初の 4 文字だけを調べる) は， SHOW という動詞(SHOWME の最初の 4 文字) と一致するものを検索し， SHOWME.COM プロシージャではなく，SHOW USERS コマンドを実行する。 SHOWME を DCL シンボルとして定義した場合には， SHOWME コマンドは SHOWME.COM を起動する。

      $ DEFINE DCL$PATH SYS$SYSTEM,SYS$DISK:[]FOO
      $ TYPE SHOWME.COM
      $ SHOW SYMBOL P1
      $ EXIT
      $ SHOWME USERS
            OpenVMS User Processes at MARCH 2, 1998 01:40 PM
          Total number of users = 1,  number of processes = 11

       Username     Interactive  Subprocess   Batch
       RSMITH              9         2

# 第 15 章
DCL によるプログラミング: コマンド・プロシージャの概要

コマンド・プロシージャとは，DCL コマンドと， DCL コマンドで使用されるデータ行が格納されたファイルです。本章では，次のことについて説明します。

- コマンド・プロシージャを作成するための基礎的な説明

- コマンド・プロシージャの作成手順

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

- コマンド・プロシージャの終了，解釈，エラー処理

- ログイン・コマンド・プロシージャ

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

- この章で説明しているすべてのコマンドの詳細情報については，『Compaq OpenVMS DCL ディクショナリ』

- Extended File Specifications のある環境の DCL でのプログラミングについては，『OpenVMS Extended File Specifications の手引き』

DCL コマンド・プロシージャには，次の 2 種類があります。

- 単純なプロシージャ
  作成された順に，一連の DCL コマンドを実行する。

- 複雑なプロシージャ
  プログラムのような機能を実行する。

# 15.1 コマンド・プロシージャを作成するための基礎的な説明

コマンド・プロシージャを作成するには，次の 2 種類の方法があります。

- EVE や EDT などのテキスト・エディタを使用して，新しいファイルを作成する方法

- DCL コマンド CREATE を使用して，新しいファイルを作成する方法

作成するファイルには，コマンド行，ラベル，コメント，条件文，変数を格納できます。

## 15.1.1 省略時のファイル・タイプ

コマンド・プロシージャの省略時のファイル・タイプは .COM です。コマンド・プロシージャの名前を指定するときに，ファイル・タイプとして .COM を指定した場合には，ファイル名を指定するだけで，コマンド・プロシージャを実行できます。 SUBMITコマンドとプロシージャ実行 (@) コマンドでは，特に指定した場合を除き，ファイル・タイプは .COM であるものと解釈されます。

## 15.1.2 コマンドの作成

コマンド・プロシージャにコマンドを登録する場合には，次のことに注意してください。

- コマンドと修飾子の名前は完全に指定する。このようにすると，OpenVMS の将来のリリースに対して，コマンド・プロシージャの互換性を維持できる。

- プロシージャを読みやすくするために，継続行を使用する。継続行の先頭には，ドル記号がない。次の例を参照。

      $ PRINT LAB.DAT   -
           /AFTER=17:00 -
           /COPIES=20   -
           /NAME="COMGUIDE"

## 15.1.3 コマンド行の作成

コマンド行を作成する場合には，次のことに注意してください。

- コマンド，コメント，ラベルを指定する各行の先頭には，ドル記号($) を指定しなければならない。

- データを含む行が必要な場合には，その行にはドル記号 ($) を指定しない。

- ドル記号 ($) から始まるデータ行を指定しなければならない場合には， DCL コマンド DECK と EOD を使用する。次の例を参照。

            $ ! Everything between the commands DECK and EOD
            $ ! is written to the file WEATHER.COM
            $ !
            $ CREATE WEATHER.COM
            $ DECK
            $ FORTRAN SUMMER
            $ LINK SUMMER
            $ RUN SUMMER
            $ EOD
            $ !
            $ ! Now execute WEATHER.COM
            $ @WEATHER
            $ EXIT

先頭にドル記号が指定されていないコマンド行も， DCL で正しく解釈されると思われますが，なるべく DCL コマンド行の先頭にはドル記号を指定してください。

# 15.2 コマンド行でのラベルの使用

DCL コマンド・プロシージャでは，ループ，コード・セクション，サブルーチンの先頭をマークするためにラベルを使用します。ラベルを使用する場合には，次の規則に注意してください。

- ループ，サブルーチン，条件コードをわかりやすく区別するために，ラベルは単独の行に指定する。

- 255 文字以内のラベル名を使用し，名前の内部ではスペースを使用しない。

- ラベルとコマンドの区別は，ラベルの場合は，ドル記号 ($) のすぐ後に指定し，コマンドの場合は，その前にスペースを指定することにより行う。

- 各ラベルの最後にはコロンを指定する。

- ラベルを削除することはできない。

## 15.2.1 ローカル・シンボル・テーブル内のラベル

コマンド・インタプリタがラベルを検出すると，ローカル・シンボル・テーブルの特殊なセクションにそのラベルが登録されます。ラベルのために使用できる容量は制限されています。コマンド・プロシージャで多くのシンボルを使用し，多くのラベルが含まれている場合には，コマンド・インタプリタはシンボル・テーブル空間をすべて使用してしまう可能性があり，エラー・メッセージが表示されます。この場合には，プロシージャに DELETE/SYMBOL コマンドを指定して，不要になったシンボルを削除します (ただし，ラベルを削除することはできません)。

## 15.2.2 重複するラベル

コマンド・プロシージャで同じラベルを 2 回以上使用する場合には，ローカル・シンボル・テーブルの既存の定義は新しい定義に置き換えられます。

重複するラベルが存在する場合には，GOTO コマンドは， DCL が最後に処理したラベルに制御を渡します。また，GOTO コマンドは重複するラベルを処理するときに，次の規則も使用します。

- 重複するラベルがすべて GOTO コマンドの前に指定されている場合には，制御は，GOTO コマンドにもっとも近いラベルに渡される。

- 重複するラベルが GOTO コマンドの前と後に指定されている場合には，制御は，前に指定されているラベルのうち，GOTO コマンドにもっとも近いラベルに渡される。

- 重複するラベルがすべて GOTO コマンドの後に指定されている場合には，制御は， GOTO コマンドにもっとも近いラベルに渡される。

# 15.3 コマンド・プロシージャでのコメントの使用

コマンド・プロシージャを作成する場合には，なるべくコメントを指定してください。コマンド・プロシージャを更新したり，問題を解決するときに，コメントが指定されていると役立ちます。コメントは次の方法で使用できます。

- プロシージャの先頭で，プロシージャについて説明し，プロシージャに渡されるパラメータについても説明する。

- 各コマンド・ブロックの先頭で，プロシージャのそのセクションについて説明する。

- ドル記号($)と感嘆符 (!) をどちらも含む行で，コマンド・シーケンスを区切る。このようにすると，コマンド・プロシージャの概略がわかりやすくなる。ブランク行を挿入すると，コマンド・インタプリタはそれらの行をデータ行として解釈し，データ行が無視されたことを警告するメッセージが生成される。

コマンド・プロシージャにコメントを指定する場合には，次の規則が適用されます。

- コメントの先頭を示すには，感嘆符 (!) を使用する。コマンド・プロシージャを実行する場合，コマンド・インタプリタは感嘆符の右側のすべてのテキストを無視する。

- コマンド行にリテラルとして感嘆符を指定するときは，感嘆符を引用符で囲む (" ")。

# 15.4 コマンド・プロシージャの作成方法

コマンド・プロシージャの作成を開始する前に，コマンド・プロシージャが実行するタスクを会話形式で実行します。必要なコマンドを入力し，使用される変数と条件，および発生する会話を記録します。

これ以降の節では，簡単なコマンド・プロシージャの作成方法を説明します。これ以降で使用する例は，CLEANUP.COM というコマンド・プロシージャです。このコマンド・プロシージャは，ディレクトリを整理するために使用します。

定義

- 変数
  タスクを実行するたびに変化するデータ

- 条件
  変化する可能性のあるコマンドまたはコマンドの集合であり，タスクを実行するたびにテストしなければならない。

- 繰り返し
  条件が満足されるまで繰り返し実行されるコマンドまたはコマンドの集合。

# 15.5 コマンド・プロシージャの作成手順

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

手順 | 操作
--- | ---
1 | コマンド・プロシージャを設計する。
2 | 変数を割り当て，条件をテストする。
3 | ループを追加する。
4 | コマンド・プロシージャを終了する。
5 | プログラム・ロジックをテストおよびデバッグする。
6 | クリーアップ・タスクを追加する。
7 | プロシージャを完成する。

## 15.5.1 手順 1: コマンド・プロシージャを設計する

コマンド・プロシージャを設計するには，次の操作を実行します。

手順 | 操作
--- | ---
1 | プロシージャが実行するタスクを決定する。
2 | コマンド・プロシージャが使用する変数と，その変数のロード方法を判断する。
3 | コマンド・プロシージャが必要とする条件と，条件をテストする方法を判断する。
4 | コマンド・プロシージャを終了する方法を決定する。

クリーンアップ操作で一般に実行される特定のコマンドがあります。次の表は，これらのコマンドと，そのコマンドが実行するタスクを示しています。

コマンド | 実行するタスク
--- | ---
DIRECTORY | カレント・ディレクトリの内容を表示する。
TYPE filespec | ファイルを表示する。
PURGE filespec | ファイルをパージする。
DELETE filespec | ファイルを削除する。
COPY filespec new-filespec | ファイルをコピーする。

変数

タスクを実行するときに変化するデータは変数です。ディレクトリにファイルを作成したり，ファイルを削除する場合には，ディレクトリを整理するたびに，ファイル名が異なります。したがって，CLEANUP.COM でファイル名は変数です。

条件

コマンド・プロシージャを実行するたびにテストしなければならないコマンドは，条件であると考えられます。 CLEANUP.COM のコマンドは，実行しなければならない操作に応じて，一部またはすべてが実行されるため，各コマンドは条件です。

設計の決定

CLEANUP.COM コマンド・プロシージャで使用する変数と条件を判断した後，変数のロード方法，条件のテスト方法，コマンド・プロシージャの終了方法を判断しなければなりません。 CLEANUP.COM コマンド・プロシージャの場合には，次の判断を下しました。

タスク | 実現方法
--- | ---
変数のロード | コマンド・プロシージャはターミナルからファイル名を入手する。
条件のテスト | コマンド・プロシージャ: ターミナルからコマンド名を入手し，コマンド名をもとにして適切な文を実行する。 DELETE コマンドと DIRECTORYコマンドを区別するために，各コマンド名の最初の 2 文字を確実に読み込む。
ループの終了 | ループを終了するには，EXIT コマンドを入力しなければならない。

コマンド・プロシージャを理解しやすく，また管理しやすくするには，プロシージャが最初のコマンドから最後のコマンドへと順に実行されるように，文を作成しなければなりません。

## 15.5.2 手順 2: 変数を割り当て，条件をテストする

値を変数に割り当てるには，多くの方法があります。この節では，INQUIRE コマンドの使い方について説明します。他の方法については， 第 16 章 を参照してください。

値を変数に割り当て，条件をテストするには，次の操作を実行します。

手順 | 操作
--- | ---
1 | INQUIRE コマンドを使用して，値を変数に割り当てる。
2 | 実行しなければならない処理を判断する。
3 | IF 文と THEN 文を使用して条件をテストする。
4 | プログラム・スタブを作成し，コマンドのプレースホルダとしてコマンド・プロシージャに挿入する。
5 | 必要に応じてエラー・メッセージを作成する。

前へ | 次へ | 目次 | 索引