2016-09-27 34 views
1

私は、Windowsシステム上でのMicro Focus COBOLを使用し、その後、私はDIRコマンドからの出力を得るためにout.txtをファイルを読み込む必要がCOBOL CALL「SYSTEM」戻り値

. 
. 
01 w-param pic x(100) value 'dir > out.txt'. 
. 
. 
call "SYSTEM" using w-param 

このコードを持っています。 dir(または他のシステムコマンド)から戻り値として直接プログラムに出力する方法はありますか?

+0

回答にコメントを残してください - あなたはcobweb-pipeソリューションを試しましたか? はいの場合:元の 'FUNCTION'バリアントを使用できますか?' CALL'バリアントを使用する必要がありましたか?コードの変更が必要でしたか? –

答えて

3

回答 - パート1:いいえ、戻り値にCALLの出力はありません。

回答 - 第2部:出力を別のオプションで取得できます。パート1のため

説明: 「返す値」は、通常の整数であり、特殊レジスタRETURN-CODEビアおよび/またはRETURNING句(追加にあなたをできるようにいくつかの実装にポインタを取得)で渡さ:CALL someprog RETURNING something、参照COBOL documentation for CALL

パート2の説明: できることは、パイプを作成し、そこから読み取ることです.Cインターフェイスを呼び出すか、実装固有の拡張子を使用して読み込むことができます。

ACUCOBOLまたはマイクロフォーカス[と多分他人]を使用すると、ラインシーケンシャルファイルアクセスを介してパイプを使用することができます - マイクロフォーカスの詳細については、スティーブンGennardの答えとACUCOBOLため、この答えの末尾を参照してください。

UNIXの場合、CALL 'SYSTEM'という名前のパイプを「ネイティブに」作成することができます。そこから読み取れる可能性のある方法は、GnuCOBOL FAQ -> named pipesに記載されています。一般に、パイプを作成してCインターフェイス経由で読むことができます。

Cインタフェースと、それはcobweb-pipesあるためCOBOLラッパー経由のパイプを使用するためのサンプル実装(MFはおそらく、ユーザー定義関数をサポートしています、したがって、あなたはこれをテスト場合クモの巣-pipes.cobはおそらく多かれ少なかれ変わらず(作品にお答えくださいコメント)、そうでない場合はクモの巣-CALL-pipes.cobが動作する可能性が非常に高い

編集:

SEQUENTIALファイルを経由してACUCOBOLでの拡張と割り当てられたファイル名に-Pで始まる:

 program-id. dircmdread. 
     select i-cmd 
    * windows: 
     assign to "-P %TMP% cmd.exe /c dir > %TMP%" 
    * unix:  
    * assign to "-P ls -l" 
     organization is sequential. 
     fd i-cmd. 
     01 i-cmd-record pic x(80). 
     procedure division. 
      open input i-cmd 
      perform until exit 
      read i-cmd 
      at end 
       exit perform 
      end-read 
      display i-cmd-record 
      end-perform 
      close i-cmd 
      goback. 
2

回答:あなたはたとえば、COBOL構文

経由pipesを使用することによってそれを行うことができYES(あなたがでMicro Focus COBOLを使用している場合)

program-id. dircmdread. 
    select i-cmd 
     assign to "< cmd.exe /c dir" 
     organization is line sequential. 
    fd i-cmd. 
    01 i-cmd-record pic x(80). 
    procedure division. 
     open input i-cmd 
     perform until exit 
     read i-cmd 
     at end 
      exit perform 
     end-read 
     display i-cmd-record 
     end-perform 
     close i-cmd 
     goback. 

    end program dircmdread. 

とそれを実行経由:

Y:\DemoAndTests\dirread>cobol dircmdread.cbl nologo int(); 
* Generating dircmdread 
* Data:  1048  Code:   736  Literals:   424 

Y:\DemoAndTests\dirread>run dircmdread 
Volume in drive Y is UserSourceCode 
Volume Serial Number is EE5F-1112 

Directory of Y:\DemoAndTests\dirread 

29/09/2016 15:13 <DIR>   . 
29/09/2016 15:13 <DIR>   .. 
29/09/2016 15:16    509 dircmdread.cbl 
29/09/2016 15:17    2,560 dircmdread.int 
29/09/2016 15:17    2,330 dircmdread.obj 
       3 File(s)   5,399 bytes 
       2 Dir(s) 20,383,764,480 bytes free 
+0

ビルドインパイプの代替ソリューションでは、 'ASSIGN'を使用して正しいです。私はACUCOBOLの亜種を文書で見つけて、MFの変種の答えを紹介しました。 –