Systemwalker Centric Manager スクリプトガイド - UNIX共通 - - Microsoft(R) Windows NT(R)/ Microsoft(R) Windows(R) 2000/ Microsoft(R) Windows Server(TM) 2003 - |
目次
索引
![]() ![]() |
第2章 文法 | > 2.3 Systemwalkerスクリプトで使用するコマンド・制御文 |
サブプロセスを起動し、プログラムのコマンドを実行します。
【Windows版の場合】
exec cmd /c cmdname 【args …】 |
注) execコマンドは、cmd /cと併せて使用してください。
【UNIX版の場合】
exec cmdname 【args …】 |
最後のargsが“&”の場合、コマンドはバックグラウンドで実行されます。コマンドは通常、フォアグラウンドで実行され、execコマンドはcmdnameのプロセス終了を待ちますが、バックグラウンドで実行した場合は、終了を待たずに復帰します。
また、argsにはフロー制御記号を指定することが可能です。
Windowsの場合、ファイルをパス指定で与える時は、ディレクトリの区切りに“\”(円記号)を使用してファイル名全体を“{ }”(中括弧)で囲む必要があります。
argsに以下のフロー制御記号を記述することで、起動コマンドの標準入出力への操作や複数コマンドを起動しての情報のやりとりが可能となります。
記号・書式 |
意味 |
例 |
| |
パイプライン中の個々のコマンドを区切ります。前のコマンドの標準出力を後のコマンドの標準入力へつなげます。同様にして3つ以上のコマンドをつないでいくことが可能です。 |
【Windows版の場合】 【UNIX版の場合】 |
< filename |
cmdnameの標準入力として、filenameで指定したファイルの内容が読み込まれます。(注1) |
【Windows版の場合】 【UNIX版の場合】 |
<< value |
cmdnameの標準入力として、valueで指定した値(文字列)が読み込まれます。(注1) |
【Windows版の場合】 【UNIX版の場合】 |
> filename |
cmdnameの標準出力がfilenameで指定したファイルに上書きで書き込まれます。(注1) |
【Windows版の場合】 【UNIX版の場合】 |
>& filename |
cmdnameの標準出力と標準エラー出力がfilenameで指定したファイルに上書きで書き込まれます。(注1) |
【Windows版の場合】 【UNIX版の場合】 |
2> filename |
cmdnameの標準エラー出力がfilenameで指定したファイルに上書きで書き込まれます。(注2) |
【Windows版の場合】 【UNIX版の場合】 |
注1:cmdnameの部分が“|”により複数のコマンドからなる場合、読み込みは先頭のコマンドが、書き込みは末尾のコマンドがその対象となります。
注2:cmdnameの部分が“|”により複数のコマンドからなる場合、すべてのコマンドの標準エラー出力がfilenameで指定したファイルに格納されます。
フロー制御により複数のコマンドが実行される場合は、末尾のコマンドがその対象となります。
また、フロー制御により標準出力がリダイレクトされている場合は、空文字列を返します。
フロー制御により複数のコマンドが実行される場合は、全プロセスIDが空白で区切って返されます。
例:
exec cmd /c swctclsh {c:\script\part1.swt} |
なお、execコマンドを複数回数呼び出すスクリプトを作成した場合は、スクリプトの動作確認時に最大回数までのexec呼出しを実施して、すべての呼出しが正常に行われることを確認してください。
【Windows版の場合】
#アプリケーションを起動します。標準出力を変数"outmsg"に格納します。 #アプリケーションが標準出力へ出力したデータをジョブの標準出力へ出力します。 #アプリケーションの実行まで正常に完了した場合は、終了コード"0"で終了します。 |
【UNIX版の場合】
#アプリケーションを起動します。標準出力を変数“outmsg”に格納します。 #アプリケーションが標準出力へ出力したデータをジョブの標準出力へ出力します。 #アプリケーションの実行まで正常に完了した場合は、終了コード“0”で終了します。 |
注) catchによる処理例外設定がないため、execで起動したコマンドが、“0”以外の終了コードで終了したり、異常終了した場合に以下の問題が発生します。
これらを回避するために、コマンドを起動する際にはcatchコマンドによる処理例外のトラップをすることを推奨します。
標準出力/標準エラー出力情報(errorInfo)について
コマンドの標準出力/標準エラー出力がリダイレクトされていない場合、グローバル変数errorInfoの先頭にその出力文字列が格納されます。errorInfoには、exec文自身の実行エラーを示す文字列も格納されます。例:
【Windows版の場合】以下の仕様のアプリケーション(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【UNIX版の場合】
存在しないファイル(/tmp/data)を指定し、lsコマンドを実行する場合
if {[catch {
exec ls /tmp/data
}]} {
puts "エラー情報 START"
puts $errorInfo
puts "エラー情報 END"
}上記を実行すると、標準出力には以下のように表示されます。
エラー情報 START
/tmp/data: ファイルもディレクトリもありません。 ← lsコマンドの出力
while executing ← exec文自身の実行エラーを
"exec ls /tmp/data" ← 示す文字列
エラー情報 END
終了コード(errorCode)について
コマンドの終了コードが“0”以外の場合は、グローバル変数errorCodeに以下の書式で終了コードが格納されています。
CHILDSTATUS pid exitcode
- pid
- プロセスID
- exitcode
- プロセスの終了コード
実行コマンドのリダイレクトされていない入出力は以下のとおりに扱われます。
入出力 |
フォアグラウンド実行 |
バックグラウンド実行 |
標準入力 |
スクリプトプロセス自身の標準入力から読み込まれる。 | |
標準出力 |
通常は、execコマンドの戻り値となる。 |
スクリプトプロセス自身の標準出力に書き込まれる。 |
標準エラー出力 |
execコマンドの処理例外として扱われ、catchでトラップした場合にはerrorInfoに格納される。 |
スクリプトプロセス自身の標準エラー出力に書き込まれる。 |
execで起動するコマンドに渡す引数の最後に“&”を記述するとバックグラウンドでコマンドが起動されます。この場合、コマンドの実行の終了を待たずに、スクリプトの処理は進行するため、注意が必要です。
また、バックグラウンドで起動した場合、execコマンドの復帰値は実行コマンドのプロセスIDとなります。アプリケーションが出力する標準出力をexecコマンドの復帰値として獲得することはできません。
【Windows版の場合】
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
}
【UNIX版の場合】
lsコマンドを実行し、コマンドの標準出力/標準エラー出力をすべてスクリプトの標準出力へ出力させます。
if {[catch {
set outmsg [exec ls -l /tmp/data]
# lsの標準出力(exec戻り値)をスクリプトの標準出力へ
puts stdout $outmsg
}]} {
# 処理例外発生
# outmsgには初期値として$errorInfoを格納しておきます。
set outmsg $errorInfo
# lsの出力情報(errorInfoの末尾2行を除いたもの)をスクリプトの標準出力へ
regexp {(.*)\n.*\n.*} $errorInfo all outmsg
puts stdout $outmsg
}
標準出力には、以下のように表示されます。
【Windows版の場合】
ドライブ C のボリューム ラベルはありません。 |
ドライブ C のボリューム ラベルはありません。 |
【UNIX版の場合】
-rw-rw-r-- 1 root other 0 9月 25日 15:05 /tmp/data |
/tmp/data: ファイルもディレクトリもありません。 |
目次
索引
![]() ![]() |