COBOL CALL "SYSTEM" return 值
COBOL CALL "SYSTEM" return value
我在 Windows 系统上使用 Micro Focus COBOL 并拥有此代码
.
.
01 w-param pic x(100) value 'dir > out.txt'.
.
.
call "SYSTEM" using w-param
然后我必须读取 out.txt 文件以获取 dir 命令的输出。有什么方法可以将 dir(或任何其他系统命令)的输出直接作为返回值返回给我的程序吗?
答案 - 第 1 部分:不,您不能在 return 值中有 CALL 的任何输出。
答案 - 第 2 部分:但是您可以使用不同的选项获得输出。
第 1 部分的说明:
"return-values" 通常是一个整数,通过特殊寄存器 RETURN-CODE
and/or 和 RETURNING
子句传递(在某些实现中允许您额外获取指针):CALL someprog RETURNING something
,见 COBOL documentation for CALL.
第 2 部分的说明:
你可以做的是创建一个管道并从那里读取,要么调用 C 接口,要么使用特定于实现者的扩展。
使用 ACUCOBOL 或 MicroFocus [和可能 其他],您可以通过行顺序文件访问使用管道 - 有关 MicroFocus 的详细信息,请参阅 Stephen Gennard 的回答以及 ACUCOBOL 的此答案结尾.
在 unix 上,您可以 "natively" 使用 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.
答案:是(如果您使用的是 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
我在 Windows 系统上使用 Micro Focus COBOL 并拥有此代码
.
.
01 w-param pic x(100) value 'dir > out.txt'.
.
.
call "SYSTEM" using w-param
然后我必须读取 out.txt 文件以获取 dir 命令的输出。有什么方法可以将 dir(或任何其他系统命令)的输出直接作为返回值返回给我的程序吗?
答案 - 第 1 部分:不,您不能在 return 值中有 CALL 的任何输出。
答案 - 第 2 部分:但是您可以使用不同的选项获得输出。
第 1 部分的说明:
"return-values" 通常是一个整数,通过特殊寄存器 RETURN-CODE
and/or 和 RETURNING
子句传递(在某些实现中允许您额外获取指针):CALL someprog RETURNING something
,见 COBOL documentation for CALL.
第 2 部分的说明: 你可以做的是创建一个管道并从那里读取,要么调用 C 接口,要么使用特定于实现者的扩展。
使用 ACUCOBOL 或 MicroFocus [和可能 其他],您可以通过行顺序文件访问使用管道 - 有关 MicroFocus 的详细信息,请参阅 Stephen Gennard 的回答以及 ACUCOBOL 的此答案结尾.
在 unix 上,您可以 "natively" 使用 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.
答案:是(如果您使用的是 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