$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>
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 が返って実行できません。なぜですか?
※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 が発生しました。
同じユーザーによる、サーバーまたは共有リソースへの複数のユーザー名での複数の接続は許可されません。サーバーまたは共有リソースへの以前の接続をすべて切断してから、再試行してください。