我在 OpenVMS 中编写 DCL 时遇到问题,因为我需要 DCL 调用命令并捕获其输出(但不将输出输出到屏幕) 稍后在 DCL 中,我需要打印我存储的输出。
这是一个例子:
ICE SET FASTER !This command sets my environment to the "Faster" environment.
如果直接在 OpenVMS 中执行,上面的命令会输出:
Initialising TEST Environment to FASTER
--------------------------------------------------------------------------------
Using Test Search rules FASTER
Using Test Search rules FASTER
--------------------------------------------------------------------------------
dcl>
所以我创建了一个 DCL 试图包装这个输出以显示更简化的输出。到目前为止,这是我的代码:
!************************************************************************
$ !* Wrapper for setting ICE account. Outputs Environment
$ !************************************************************************
$ on error then goto ABORT_PROCESS
$ICE_DCL_MAIN:
$ ice set 'P1'
$ ICE SHOW
$ EXIT
$ABORT_PROCESS:
$ say "Error ICING to: " + P1
$ EXIT 2
[End of file]
在 ICE SET 'P1' 上面的行中,正在设置冰环境,但我不希望此输出回显到 VMS。但我想要的是将 $ICE SHOW 的输出写入一个变量,然后稍后在 DCL 中回显(为了简化起见,我省略了大部分)
所以应该输出的应该是:
current Test Environment is DISK$DEVELOPERS:[FASTER.DEVELOP]
代替:
Initialising TEST Environment to FASTER
--------------------------------------------------------------------------------
Using Test Search rules FASTER
Using Test Search rules FASTER
--------------------------------------------------------------------------------
current Test Environment is DISK$DEVELOPERS:[FASTER.DEVELOP]
我浏览了手册,我有点困惑,所以我想我在这里尝试过。我很感激任何指针。谢谢。
编辑
这是我在评论后提出的问题,我遇到的问题是当我使用 SecureCRT 等模拟器连接到 VMS 时,会回显正确的输出。但是当我通过 .NET 中的 SSH2 库运行 DCL 时,它不会输出任何内容。我想那是因为它暂时关闭了 SYS$OUTPUT 流还是什么?
$ !************************************************************************
$ !* Wrapper for setting ICE account. Outputs Environment
$ !************************************************************************
$ on error then goto ABORT_PROCESS
$ICE_DCL_MAIN:
$ DEFINE SYS$OUTPUT NL:
$ ice set 'P1'
$ DEASSIGN SYS$OUTPUT
$ ice show
$ EXIT
$ABORT_PROCESS:
$ say "Error ICING to: " + P1
$ EXIT 2
[End of file]
编辑 2
所以我想我真的需要澄清我想在这里做什么。阻止输出并不重要,我只是试图将它捕获到一个符号中。
因此,例如在 C# 中,您可以拥有一个返回字符串的方法。所以你会有 string myResult = vms.ICETo("FASTER"); 它将返回并将其存储在变量中。
我想我在 VMS 中寻找类似的东西,这样一旦我适应了环境,我就可以调用:
$ environment == $ICE SHOW
但我当然会得到那个陈述的错误