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
しかし、もちろん、そのステートメントでエラーが発生します