Systemwalker Operation Manager リファレンスマニュアル - Microsoft(R) Windows NT(R)/Windows(R) 2000/Windows Server(TM) 2003 -
目次 索引 前ページ次ページ

第13章 Systemwalkerスクリプト> 13.2 Systemwalkerスクリプトで使用するコマンド・制御文

13.2.7 exec(サブプロセスを起動する)

◆機能説明

サブプロセスを起動し、プログラムのコマンドを実行します。

◆記述形式

exec cmd /c cmdnameargs …

注) execコマンドは、cmd /cと併せて使用してください。

◆オプション

cmdname
起動するコマンドファイル名を指定します。Windows上のファイル名の場合は、ディレクトリの区切りを“\”(円記号)の他に“/”(スラッシュ)で記述することが可能です。円記号を使用する場合は、エスケープ文字に扱われないようファイル名全体を“{ }”(中括弧)で囲む必要があります。
args …
起動するコマンドに渡す引数を指定します。

ファイルをパス指定で与える場合は、ディレクトリの区切りに“\”(円記号)を使用してファイル名全体を“{ }”(中括弧)で囲む必要があります。

最後のargsが“&”の場合、コマンドはバックグラウンドで実行されます。コマンドは通常、フォアグラウンドで実行され、execコマンドはcmdnameのプロセス終了を待ちますが、バックグラウンドで実行した場合は、終了を待たずに復帰します。

また、argsにはフロー制御記号を指定することが可能です。

フロー制御

argsに以下のフロー制御記号を記述することで、起動コマンドの標準入出力への操作や複数コマンドを起動しての情報のやりとりが可能となります。

記号・書式

意味

|

パイプライン中の個々のコマンドを区切ります。前のコマンドの標準出力を後のコマンドの標準入力へつなげます。同様にして3つ以上のコマンドをつないでいくことが可能です。
“|”の代わりに“|&”を使用すると標準出力の他に標準エラー出力も後のコマンドの標準入力につながれます。

exec cmd /c dir |cmd /c sort

< filename

cmdnameの標準入力として、filenameで指定したファイルの内容が読み込まれます。(注1)

exec cmd /c sort < data.txt

<< value

cmdnameの標準入力として、valueで指定した値(文字列)が読み込まれます。(注1)

exec cmd /c sort << $data

> filename

cmdnameの標準出力がfilenameで指定したファイルに上書きで書き込まれます。(注1)
“>”の代わりに“>>”を使用すると上書きでなく追加で書き込まれます。

exec cmd /c dir > data

>& filename

cmdnameの標準出力と標準エラー出力がfilenameで指定したファイルに上書きで書き込まれます。(注1)
“>&”の代わりに“>>&”を使用すると上書きでなく追加で書き込まれます。

exec cmd /c dir data >& out

2> filename

cmdnameの標準エラー出力がfilenameで指定したファイルに上書きで書き込まれます。(注2)
“2>”の代わりに“2>>”を使用すると上書きでなく追加で書き込まれます。

exec cmd /c dir data 2> out

注1)  cmdnameの部分が“|”により複数のコマンドからなる場合、
      読み込みは先頭のコマンドが、書き込みは末尾のコマンドがその
      対象となります。
注2)  cmdnameの部分が“|”により複数のコマンドからなる場合、
      すべてのコマンドの標準エラー出力がfilenameで指定した
      ファイルに格納されます。

◆復帰値

コマンドがフォアグラウンドで実行されている場合:
cmdnameコマンドの標準出力が返されます。このとき、出力テキストの末尾にある改行コードは削除されます。

フロー制御により複数のコマンドが実行される場合は、末尾のコマンドがその対象となります。

また、フロー制御により標準出力がリダイレクトされている場合は、空文字列を返します。

コマンドがバックグラウンドで実行されている場合:
起動コマンドのプロセスIDが返されます。

フロー制御により複数のコマンドが実行される場合は、全プロセスIDが空白で区切って返されます。

◆注意事項

Windows NT(R) 4.0上では、1つのスクリプト内で繰り返してexecコマンドの呼出しを行うと、execコマンドがハングアップする可能性があります。呼出しは、目安として1スクリプトあたり100回程度までにすることを推奨します。

execコマンドを繰り返して呼び出す必要がある場合には、スクリプトファイルを分割して、1スクリプトファイルあたりで呼び出すexecコマンドの回数を少なくしてください。分割したスクリプトファイルは、execコマンドによりswotclshコマンドの引数として、スクリプト内で実行させることができます。分割したスクリプトの実行例を以下に示します。

例:

exec cmd /c swotclsh {c:\script\part1.swt}

なお、execコマンドを複数回数呼び出すスクリプトを作成した場合は、スクリプトの動作確認時に最大回数までのexec呼出しを実施して、すべての呼出しが正常に行われることを確認してください。

◆備考

標準出力/標準エラー出力情報(errorInfo)について

コマンドの標準出力/標準エラー出力がリダイレクトされていない場合、グローバル変数errorInfoの先頭にその出力文字列が格納されます。errorInfoには、exec文自身の実行エラーを示す文字列も格納されます。

例:

以下の仕様のアプリケーション(c:\usr\bin\appl001.exe)がエラー終了した場合
仕様:指定された日付のデータを標準出力に書き込む。
   日付の指定が不当な場合は以下のメッセージを標準エラー出力に出力する。
  “日付の指定に誤りがあります。yyyymmdd で指定してください。”

if {[catch {
     exec cmd /c {c:\usr\bin\appl001.exe} 010520
  }]} {
   puts "エラー情報 START"
   puts $errorInfo
   puts "エラー情報 END"
}

上記を実行すると、標準出力には以下のように表示されます。

エラー情報START
日付の指定に誤りがあります。yyyymmddで指定してください。←appl001コマンドの出力
  while executing              ← exec文自身の実行エラーを
"exec cmd /c {c:\usr\bin\appl001.exe} 010520"     ←     示す文字列
エラー情報END

終了コード(errorCode)について

コマンドの終了コードが“0”以外の場合は、グローバル変数errorCodeに以下の書式で終了コードが格納されています。
CHILDSTATUS pid exitcode
pid
ここに入る数字は意味を持ちません。
exitcode
プロセスの終了コード

◆使用例

dirコマンドを実行し、コマンドの標準出力/標準エラー出力をすべてスクリプトの標準出力へ出力させます。

if {[catch {
     set outmsg [exec cmd /c dir {c:\tmp\data}]

     # dirの標準出力(exec戻り値)をスクリプトの標準出力へ
     puts stdout $outmsg
   }]} {
  # 処理例外発生
  # outmsgには初期値として$errorInfoを格納しておきます。
  set outmsg $errorInfo

  # dirの出力情報(errorInfoの末尾2行を除いたもの)をスクリプトの標準出力へ
  regexp {(.*)\n.*\n.*} $errorInfo all outmsg
  puts stdout $outmsg
}

◆実行結果/出力形式

標準出力には、以下のように表示されます。


目次 索引 前ページ次ページ

All Rights Reserved, Copyright (C) 富士通株式会社 1995-2005