1

我在 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

但我当然会得到那个陈述的错误

4

5 回答 5

1

您可以将输出重定向到临时文件,然后再打印其内容:

$ pipe write sys$output "hi" > tmp.tmp
$ ty tmp.tmp
于 2014-07-08T12:02:32.190 回答
1

该命令$ assign/user_mode Thing Sys$Output将导致输出重定向到Thing$ deassign/user_mode Sys$Output或下一个可执行映像退出。没有/USER_MODE限定符的分配将持续存在,直到取消分配。

Thing如果您只想刷新输出,则可以是逻辑名称、文件规范 ( LOG.TXT) 或空设备 ( )。NLA0:

当执行命令过程时,可以使用/OUTPUT限定符重定向输出,例如$ @FOO/output=LOG.TXT.

然后是管道......

于 2014-07-08T12:03:39.533 回答
0

您可以尝试使用:DEFINE /USER SYS$OUTPUT NL:。它仅适用于下一个命令,您不需要取消分配。

于 2014-07-10T06:28:16.877 回答
0

VMS 不是 Unix,DCL 不是 Bash:你不能轻易地从命令的输出中设置 DCL 符号。

您的 ICE SHOW 打印一行,对吗?第一个词总是“当前”,对吗?

因此,您可以创建一个 hack。

首先让我伪造你的 ICE 命令:

$ create ice.com
$ write sys$output "current Test Environment is DISK$DEVELOPERS:[FASTER.DEVELOP]"
^Z
$

我定义了一个 dcl$path 指向这个命令过程所在的目录,这样我就可以使用/伪造命令 ICE

$ define dcl$path sys$disk[]
$ ice show
current Test Environment is DISK$DEVELOPERS:[FASTER.DEVELOP]
$

现在你需要什么,创建一个命令过程来设置作业逻辑

$ cre deflog.com
$ def/job/nolog mylog "current''p1'"
^Z
$

我定义了一个命令“current”来运行该命令过程:

$ current="@deflog """

是的,您需要在行尾添加三个双引号!

最后:

$ pipe (ice show | @sys$pipe) && mysym="''f$log("mylog")'"
$ sh symb mysym
  MYSYM = "current Test Environment is DISK$DEVELOPERS:[FASTER.DEVELOP]"
$

另一方面,我不知道您指的是 C# 和 Java。你能详细说明一下并告诉我们什么在哪里运行吗?

于 2014-07-08T19:10:32.027 回答
0

在这里分享我的一些经验。我使用以下方法将输出重定向到文件。

定义/分配用户输出,然后执行所需的命令/脚本。输出将被写入 .

$define /user sys$output <file_path>
execute your command/script

或者

assign /user <file_path> sys$output
execute your command/script
deassign sys$output

要重新定向到 Unix 中的空设备(在上面的答案中提到),您可以使用 'nl:' 而不是

define /user sys$output nl:
or
assign /user nl: sys$output
于 2019-07-25T05:38:00.637 回答