これは InterSystems FAQ サイトの記事です。
$ZF(-100) は、OSコマンドまたはプログラムを子プロセスとして実行するのに使われますが、一緒に便利なキーワードを指定することが可能です。
$ZF(-100)でコマンドの実行がうまくできない、という経験をされた方も多いかと思います。
そんな時は、この便利なキーワードを使って原因の調査をしていきましょう。
キーワードには以下のようなものがあります。
| /SHELL | シェルを使用して program を実行する。既定では、シェルは使用されない。 |
| /STDIN=filename | 入出力リダイレクト入力ファイル |
| /STDOUT=filename | 入出力リダイレクト標準データ出力ファイル |
| /STDERR=filename | 入出力リダイレクト標準エラー出力ファイル |
| /LOGCMD | 結果として得られるコマンド行を messages.log に記録する |
| /NOQUOTE | コマンド、コマンド引数、またはファイル名の自動引用を禁止する |
使用方法は、以下のようになります。
write $zf(-100,"/SHELL /LOGCMD /STDERR=err.log","command1","command2",...)
例:ネットワーク共有の設定がうまくいかないので原因を調べたい。
→STDERR キーワードで、入出力リダイレクト標準エラー出力ファイルを取得してみる
TEST1>write $zf(-100,"/SHELL /stdout=output.log /stderr=err.log","net", "use", "\\172.xxx.xxx.xxx\c$", "/user:Administrator", ^pass)
1
TEST1>!type err.log
システム エラー 86 が発生しました。
指定されたネットワーク パスワードが間違っています。
'5cm' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
これは、ネットワーク共有にアクセスするパスワードに & などの特殊文字含まれるため、パスワードが途中の 5cm までしか認識しなかった例です。
この場合は、^&でエスケープするか、/NOQUOTE キーワードを指定し、パスワードにクオートをつけて対応します)
※クオートいるなしを、$ZFが勝手に判断するので、本当はいるとき(パスワードに&が含まれるときとか)でも、付けてくれなくてエラーになることがある
そんなときの対応に使える(クオートはあえて付けない=NOQUOTE、いるときは自分でつける)
対応例:
USER>write $zf(-100,"/SHELL /NOQUOTE /stdout=output.log /stderr=err.log","net", "use", "\\172.xxx.xxx.xxx\Public", "/user:Administrator",""""_ ^pass_"""")
0
USER>!net use
新しい接続は記憶されます。
ステータス ローカル名 リモート名 ネットワーク名
-------------------------------------------------------------------------------
OK \\172.xxx.xxx.xxx\Public Microsoft Windows Network
コマンドは正常に終了しました。
USER>