COBOL调用";系统“;返回值

COBOL调用";系统“;返回值,cobol,Cobol,我在Windows系统上使用Micro Focus COBOL,并有以下代码 . . 01 w-param pic x(100) value 'dir > out.txt'. . . call "SYSTEM" using w-param 然后我必须读取.txt文件以从dir命令获得输出。有没有办法将dir(或任何其他系统命令)的输出直接作为返回值输出到我的程序?答案-第1部分:没有,返回值中不能有调用的任何输出 答案-第2部分:但是您可以使用不同的选项获得输出 第1部分的说明: “返回

我在Windows系统上使用Micro Focus COBOL,并有以下代码

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

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

答案-第1部分:没有,返回值中不能有调用的任何输出

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

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

第2部分的说明: 您可以通过调用C接口或使用特定于实现者的扩展来创建管道并从中读取

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

在unix上,您可以使用
调用'SYSTEM'
“本机”创建命名管道,从中读取的一种可能方式如中所述,通常您可以创建管道并通过C接口从中读取

通过C接口和COBOL包装器使用管道的示例实现是(MF可能支持用户定义的函数,因此cobweb-pipes.cob可能或多或少保持不变(如果您对此进行测试,请用注释回答),否则cobweb-call-pipes.cob很可能工作

编辑:

通过
顺序
文件并在指定文件名中以
-p
开头在ACUCOBOL中扩展:

      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部分:但是您可以使用不同的选项获得输出

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

第2部分的说明: 您可以通过调用C接口或使用特定于实现者的扩展来创建管道并从中读取

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

在unix上,您可以使用
调用'SYSTEM'
“本机”创建命名管道,从中读取的一种可能方式如中所述,通常您可以创建管道并通过C接口从中读取

通过C接口和COBOL包装器使用管道的示例实现是(MF可能支持用户定义的函数,因此cobweb-pipes.cob可能或多或少保持不变(如果您对此进行测试,请用注释回答),否则cobweb-call-pipes.cob很可能工作

编辑:

通过
顺序
文件并在指定文件名中以
-p
开头在ACUCOBOL中扩展:

      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.
回答:是(如果您使用Micro Focus COBOL)

您可以使用via 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.
program-id.dircmdread。
选择i-cmd
分配给“
并通过以下方式执行:

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
Y:\demandtests\dirread>cobol dircmdread.cbl nologo int();
*生成dircmdread
*数据:1048代码:736文字:424
Y:\DemoAndTests\dirread>运行dircmdread
驱动器Y中的卷是UserSourceCode
卷序列号为EE5F-1112
Y:\DemoAndTests\dirread目录
29/09/2016  15:13              .
29/09/2016  15:13              ..
2016年9月29日15:16 509 dircmdread.cbl
2016年9月29日15:17 2560 dircmdread.int
2016年9月29日15:17 2330 dircmdread.obj
3个文件5399字节
2个目录20383764480字节可用
回答:是(如果您使用的是Micro Focus COBOL)

您可以使用via 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.
program-id.dircmdread。
选择i-cmd
分配给“
并通过以下方式执行:

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
Y:\demandtests\dirread>cobol dircmdread.cbl nologo int();
*生成dircmdread
*数据:1048代码:736文字:424
Y:\DemoAndTests\dirread>运行dircmdread
驱动器Y中的卷是UserSourceCode
卷序列号为EE5F-1112
Y:\DemoAndTests\dirread目录
29/09/2016  15:13              .
29/09/2016  15:13              ..
2016年9月29日15:16 509 dircmdread.cbl
2016年9月29日15:17 2560 dircmdread.int
2016年9月29日15:17 2330 dircmdread.obj
3个文件5399字节
2个目录20383764480字节可用

请对答案留下评论-您是否尝试过蛛网管解决方案?如果是:您是否可以使用原始的
功能
变体,或者您是否需要使用
调用
变体?该解决方案是否有任何更改