如何在OpenVMS中存储命令输出

时间:2014-07-08 08:18:09

标签: openvms dcl

我在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#中,您可以使用返回字符串的方法。所以你有字符串myResult = vms.ICETo(“FASTER”);它将返回并将其存储在变量中。

我想我在VMS中寻找类似的东西,这样一旦我可以打电话给环境,我就可以打电话:

$ environment == $ICE SHOW

但我当然会在声明中出错

5 个答案:

答案 0 :(得分:0)

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

$ pipe write sys$output "hi" > tmp.tmp
$ ty tmp.tmp

答案 1 :(得分:0)

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

如果您只想刷新输出,

Thing可以是逻辑名称,文件规范(LOG.TXT)或空设备(NLA0:)。

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

然后有管道.......

答案 2 :(得分:0)

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

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

所以你可以创建一个黑客。

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

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

我定义了一个指向此命令过程所在目录的dcl $路径 这样我就可以使用/伪造命令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。你能详细说明并告诉我们在哪里运行吗?

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

getOrderDetail(id:number)
{
    this.orderService.getSingleOrder(id).subscribe((res: Order)=>{
        console.log(res);
        this.orderService.setFormData(res);
        console.log(this.orderService.getFormData());
    }
    error =>
    {
        console.log(error);
    });
}

OR

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

要像Unix中那样重定向到空设备(在上面的答案中提到),可以使用'nl:'代替

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