COBOL CALL" SYSTEM"回报价值

时间:2016-09-27 12:57:04

标签: cobol

我在Windows系统上使用Micro Focus COBOL并拥有此代码

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

然后我必须读取out.txt文件以从dir命令获取输出。有没有办法从dir(或任何其他系统命令)直接输出到我的程序作为返回值?

2 个答案:

答案 0 :(得分:3)

答案 - 第1部分:否,你不能在返回值中输出任何CALL。

答案 - 第2部分:但您可以使用其他选项获得输出。

第1部分的说明: "返回值"通常是一个整数,通过特殊寄存器RETURN-CODE和/或RETURNING子句传递(在某些实现中允许您额外获取指针):CALL someprog RETURNING something,请参阅{{3 }}

第2部分的说明: 您可以做的是创建一个管道并从那里读取,通过调用C接口或使用特定于实现者的扩展。

使用ACUCOBOL或MicroFocus [和可能其他],您可以通过行顺序文件访问使用管道 - 请参阅Stephen Gennard的答案,了解MicroFocus的详细信息以及ACUCOBOL的答案结束。

在unix上你可以"本地"使用CALL 'SYSTEM'创建一个命名管道,COBOL documentation for CALL中记录了一种可能的读取方式,通常您可以创建一个管道并通过C接口从中读取。

通过C接口和COBOL包装器使用管道的示例实现是GnuCOBOL FAQ -> named pipes(MF可能支持用户定义的函数,因此cobweb-pipes.cob可能或多或少地保持不变(如果你测试这个)请回答评论),否则cobweb-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.

答案 1 :(得分:2)

答案:是(如果您使用的是Micro Focus COBOL)

您可以通过COBOL语法

使用pipes来完成此操作

例如:

   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