【问题标题】:COBOL CALL "SYSTEM" return valueCOBOL CALL“系统”返回值
【发布时间】:2016-09-27 12:57:04
【问题描述】:

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

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

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

【问题讨论】:

  • 请对答案发表评论-您尝试过蜘蛛网管道解决方案吗?如果是:您可以使用原始的FUNCTION 变体还是需要使用CALL 变体?是否需要对代码进行任何更改?

标签: cobol


【解决方案1】:

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

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

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

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

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

在 unix 上,您可以“本地”使用CALL 'SYSTEM' 创建一个命名管道,从那里读取的一种可能方式记录在 GnuCOBOL FAQ -> named pipes 中,通常您可以创建一个管道并通过 C 接口从中读取。

通过 C 接口和 COBOL 包装器使用管道的示例实现是 cobweb-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.

【讨论】:

    【解决方案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
    

    【讨论】:

    • 通过ASSIGN 使用内置管道的替代解决方案是正确的。我在它的文档中找到了 ACUCOBOL 变体,并参考了您对 MF 变体的回答。
    猜你喜欢
    • 2012-02-11
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2016-01-12
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    相关资源
    最近更新 更多