Published on InterSystems Developer Community (https://community.intersystems.com)

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

記事
Megumi Kakechi · 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 が発生しました。

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

#ObjectScript #ヒントとコツ #Caché #Ensemble #InterSystems IRIS #InterSystems IRIS for Health

ソースURL:https://jp.community.intersystems.com/post/zf-100-%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%9F%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E5%87%BA%E5%8A%9B%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95