1

OpenVMS で 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

しかし、もちろん、そのステートメントでエラーが発生します

4

5 に答える 5

1

このコマンドは、あなたまたは次の実行可能イメージが終了するまで$ assign/user_mode Thing Sys$Output出力をリダイレクトします。修飾子のない割り当ては、割り当てが解除されるまで持続します。Thing$ deassign/user_mode Sys$Output/USER_MODE

Thing単純に出力をフラッシュしたい場合は、論理名、ファイル指定 ( LOG.TXT)、または null デバイス ( ) にすることができます。NLA0:

/OUTPUTコマンド プロシージャが実行されると、修飾子を使用して出力をリダイレクトできます$ @FOO/output=LOG.TXT

そして、配管があります... .

于 2014-07-08T12:03:39.533 に答える
1

出力を一時ファイルにリダイレクトして、後でその内容を印刷できます。

$ pipe write sys$output "hi" > tmp.tmp
$ ty tmp.tmp
于 2014-07-08T12:02:32.190 に答える
0

VMS は Unix ではなく、DCL は Bash ではありません。コマンドの出力から DCL シンボルを簡単に設定することはできません。

あなたの ICE SHOW は 1 行しか印刷しませんよね?最初の単語は常に「現在」ですよね?

したがって、ハックを作成できます。

まず、ICE コマンドを偽造させてください。

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

そして、コマンド ICE を使用/偽造できるように、このコマンド プロシージャがあるディレクトリを指す dcl$path を定義します。

$ 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 """

はい、行末に 3 つの二重引用符が必要です。

そして最後に:

$ 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 NL: を使用して試すことができます。次のコマンドに対してのみ機能し、割り当てを解除する必要はありません。

于 2014-07-10T06:28:16.877 に答える