コマンド出力のトラップ
処理の自動化や反復のためにCLISTを作る場合、TSOコマンドの出力を取り込んで、その内容からCLIST内で実行する後続コマンドのパラメータを生成したい、といった場合があります。これはシステム変数 SYSOUTTRAP と SYSOUTLINE で簡単に実現できます。
※SYSOUTTRAP及びSYSOUTLINEは、MVSのTSOでしかサポートされていません。
システム変数「SYSOUTTRAP」と「SYSOUTLINE」
- SYSOUTTRAP
- SYSOUTLINE
TSOコマンドからの出力をトラップしてメモリー内に保管します。何行分のメッセージを保管したいかをこの変数に設定します。
1 |
SET &SYSOUTTRAP = 100 |
TSOコマンドからの出力を100行分メモリー内に保管します。トラップされたメッセージは端末画面には表示されません。
トラップされたメッセージが格納される変数です。単にSYSOUTLINEとして参照すると、何行分のメッセージが保管されているかがわかります。保管されたメッセージは、SYSOUTLINEに添え字を付けることで参照できます。例えば、SYSOUTLINE1、SYSOUTLINE21のように記述します。
1 2 3 4 5 6 7 8 9 10 11 12 |
WRITE &SYSOUTLINE1 1行目のメッセージを表示する WRITE &SYSOUTLINE7 7行目のメッセージを表示する SET &I = &SYSOUTLINE 最後にトラップされたメッセージを別の変数に格納する SET CMDMSG = &STR(&&SYSOUTLINE&I) SET &I = 1 トラップされたメッセージをすべて表示する DO UNTIL &I EQ &SYSOUTLINE SET TXT = &STR(&&SYSOUTLINE&I) WRITE &TXT SET &I = &I+1 END |
何行あるか予測できない場合は、添え字なしのSYSOUTLINEを参照して、格納メッセージ数を求めます。添え字に変数を使用することもできるので、トラップされたメッセージをループの中で順番に処理するような場合に利用できます。
JCLをサブミットしてジョブのSYSOUTを画面に表示する
SUBMITコマンドの実行結果をトラップして取り込み、サブミットしたジョブの名前とIDを求めます。求めたジョブ名とIDでSTコマンドを実行して、ジョブが終了したかをチェックします。終了していればOUTPUTコマンドでSYSOUT内容を画面に表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 WRITENR ENTER JCL DATASET NAME ==> ①入力プロンプトの表示 READ ②JCL格納DSNの読み込み SET &DSN = &SYSDVAL ③引用符が指定されていれば、 引用符付きで格納する SET &SYSOUTTRAP = 10 ④メッセージを10行分トラップする SET &I = 1 SET &CJOB = JOB SET &CSUB = SUBMITTED SET &COUT = ON OUTPUT QUEUE SUBMIT &DSN ⑤JCLをサブミットする SET &I = &SYSOUTLINE ⑥コマンドから何行MSGが返ったか SET WRKTXT = &STR(&&SYSOUTLINE&I) ⑦最後のMSGをサブミット完了MSGとする SET &X = &SYSINDEX(&CJOB,&WRKTXT) + 4 SET &Y = &SYSINDEX(&CSUB,&WRKTXT) - 2 SET &JOBID = &SUBSTR(&X:&Y,&WRKTXT) ⑧ジョブ名とジョブIDを取り出す DO UNTIL &X NE 0 ⑨ジョブが終了するまでSTコマンドでチェック ST &JOBID WRITE &SYSOUTLINE1 SET &X = &SYSINDEX(&COUT,&SYSOUTLINE1) END SET &SYSOUTTRAP = 0 ⑩メッセージトラップを止める OUTPUT &JOBID KEEP ⑪ジョブのSYSOUTを表示 |
これはサンプルなので、ジョブの終了を知るために、STコマンドを出しながらCLIST内でループしてます。
実際にはあまりいい方法とは言えないので、DO ENDループのENDの前にREADステートメントを入れて、STコマンドからのメッセージを表示した後に、空エンターするまでループの中で待ちになるようにした方がいいでしょう。
RACFコマンドを発行して、リスト内容からユーザー名称を得る
RACFのLISTUSERコマンドの実行結果をトラップして取り込み、ユーザーIDに対応して付けられているユーザー名称とその長さを求めます。求めたユーザー名称は後続の処理で利用します。
1 2 3 4 5 6 7 8 9 10 11 12 |
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 SET &SYSOUTTRAP = 1 /* TRAP 8LINE MSGS */ LISTUSER /* ISSUE RACF CMD */ SET &SYSOUTTRAP = 0 /* RESET MSG TRAP */ SET LOC0 = &SYSINDEX(NAME=,&STR(&SYSOUTLINE1)) /* FIND 'NAME=' */ SET BLANK = &STR( ) /* SET USER NAME */ SET LOC1 = &LOC0 + 5 /* FROM RACF LIST */ SET LOC2 = &SYSINDEX(&BLANK,&STR(&SYSOUTLINE1),&LOC0) SET USERNAME = &SUBSTR(&LOC1:&LOC2-1,&SYSOUTLINE1) SET USERNAME_LENGTH = &LENGTH(&STR(&USERNAME)) : : |
USERIDとNAMEはLISTUSERコマンドの出力の先頭行に示されるので、1行分だけメッセージを取り込んでいますが、2行目以降が端末に表示されるわけではありません。SYSOUTTRAPに0以外を指定すると端末へのコマンド結果の出力は抑止されます。