我在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
但我当然会在声明中出错
答案 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