†REXXのどろぬま†
作成開始日 2014.10.25
最終更新日 2014.10.29
ちなみに、LinuxのシェルスクリプトやWindowsのBATCHでは、 コマンドの標準出力を簡単に取り込めるようになっている。 たとえば、Windowsでは「FOR /F」を使う。 しかし、OS/2のバッチのFOR命令には「/F」オプションはなく、 外部プログラムの実行結果を取り込むのは基本的に不可能なようだ。
ここでは、次のような3つのプログラムを考える。
/* PIPE.CMD */ Do n=1 to 10 /* この例では10行決め打ち */ PARSE PULL x.n /* 外部コマンドの出力を受け取る */ End Do n=1 to 10 /* この例では無加工で受け渡し */ QUEUE x.n /* 受け取った結果をキューに送る */ Endこれを呼び出すメイン側では;
/* MAIN.CMD */ …… 'EXTR.EXE xyz | PIPE' /* 外部プログラムを実行して結果をPIPE.CMDに受け渡す */ /* なお、ここで「xyz」はEXTR.EXEの引数とする */ nMax=QUEUED() /* この例では行数を自動検出(上記の設定ならば10) */ Do n=1 to nMax PARSE PULL x.n /* キューから結果を受け取る */ End;のように受け取ればよい。 ちなみに、予め出力が1行だけだと判っていれば、ソースは超簡単になる。
/* PIPE.CMD */ PARSE PULL x; QUEUE x
/* MAIN.CMD */ …… 'EXTR.EXE xyz | PIPE'; PARSE PULL x
▼PIPE.CMD
/* PIPE.CMD */ /* DIRコマンドの出力を取り込み、空き容量を表示する行のみをキューに送る */ Do Forever PARSE PULL st /* コマンドライン出力の取り込み */ IF POS('バイト空き',st)>0 THEN LEAVE; /* 空き容量表示行検出 */ End QUEUE st /* キューにデータを送る */▼MAIN.CMD
/* MAIN.CMD */ /* DIRコマンドの出力から空き容量を取得して表示する */ 'DIR | PIPE' /* 外部プログラムを実行して結果をPIPE.CMDに送る */ /* PIPE.CMDは必要な行を選び出してキューに送る */ PARSE PULL st /* キューからデータを受け取る */ /* 〜〜 以下は表記の整形:本題とは無関係 〜〜 */ PARSE VAR st a b c IF b='K' then a=a*1000; /* 1GB超えるとKB表記になる?*/ K=1024; M=K*1024; G=M*1024; /* 単位の定義 */ SELECT WHEN a>=G THEN a=(a/G)' GB' WHEN a>=M THEN a=(a/M)' MB' WHEN a>=K THEN a=(a/K)' KB' Othewise a=a'B' End SAY SAY 'free space =' a Exit;