記事
· 2021年3月2日 2m read

$ZF(-100) で実行したコマンドの出力を取得する方法

これは InterSystems FAQ サイトの記事です。
※記事後半に、「2>&1」で 標準エラー出力(2) を 標準出力(1) にリダイレクトする方法を追記しました。

$ZF(-100) では実行したコマンドの出力を取得することはできませんが、代わりにコマンド・パイプ デバイスを使用する方法があります。

詳細は、以下ドキュメントをご参照ください。

コマンド・パイプ デバイスを使用する方法について
 

こちらを %File クラスで使用した例が以下になります。

USER>kill

USER>set cmd=##class(%File).%New("netstat -anp tcp")

USER>write cmd.Open("rq")
1
USER>while 'cmd.AtEnd { write !,cmd.ReadLine() }
アクティブな接続
  プロトコル  ローカル アドレス          外部アドレス        状態
  TCP    0.0.0.0:23             0.0.0.0:0              LISTENING
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING
(中略)
  TCP    192.168.172.1:139      0.0.0.0:0              LISTENING
USER>

 

※注意※
$ZF(-1)および$ZF(-2)には、セキュリティ上の脆弱性があり、その使用が推奨されておりません。
代替の機能として$ZF(-100)が用意されておりますので、そちらをご使用ください。
$ZF(-100)の詳細は、以下の関連トピックをご参照下さい。

$ZF(-100)の戻り値に -1 が返って実行できません。なぜですか?

$ZF(-100)の使用方法を教えてください

 

※2023/7/20追記

以下の方法で、標準エラー出力(2) を 標準出力(1) へリダイレクトし、さらにコマンドの 標準出力 を ファイル(result.log) へ出力する方法が使用できます。

USER>Set st = $ZF(-100, "/shell", "net", "use", "\\server1\Public", "/user:name", "password", ">result.log", "2>&1")
 
USER>write st    // 戻り値が0(成功)以外の時、ログを見て原因を調査してみる
2


上記コマンドの場合、実行したネームスペースのデフォルトデータベースのフォルダに result.log が出力されます。
例えば、内容は以下のような標準出力が記録されます。

/* result.log */

システム エラー 1219 が発生しました。

同じユーザーによる、サーバーまたは共有リソースへの複数のユーザー名での複数の接続は許可されません。サーバーまたは共有リソースへの以前の接続をすべて切断してから、再試行してください。

ディスカッション (1)0
続けるにはログインするか新規登録を行ってください