MZ Platformとは › 掲示板 › MZプラットフォームユーザー会掲示板 › コマンドラインの標準出力を読み込む方法
- このトピックは、 6 返信、 2 投稿者 です。最終更新日: 5 年, 11 ヶ月 前 MZPlatformユーザー会
-
著者投稿
-
2018年12月13日 at 11:00 AM #5391kanamaru一般参加者
VBScriptファイルを実行した際にコマンドラインに標準出力される内容を、MZPlatformで値として読み込むことはできるでしょうか。
背景としては、Active Directoryからアカウント名をキーにメールアドレスを取得する必要がありまして、現状「VBScriptで標準出力」が実現できているVBScriptファイルがあります。
そのVBScriptを利用できないかと考えた次第です。実現可能でしたらご教授お願い致します。
2018年12月13日 at 4:13 PM #5392MZPlatformユーザー会サイト管理者こちらがVBScriptになじみがないため、下記の前提に誤りがあればご指摘ください。
「コマンドラインに標準出力」との記述から、WindowsのコマンドプロンプトからVBScriptを実行して、その結果が標準出力で表示される前提でお答えします。
MZ側でこのような出力を受け取るためには、「外部プログラム通信」コンポーネントを使用します。ただし、このコンポーネントは状況に応じて設定を適切に変更しないと正常に動作しないため、もし何らかのサンプルを添付(ZIPファイルとして)していただければこちらでもテストします。
こちらで準備できたVBScriptサンプルからの出力を取り込むMZアプリのサンプルZIPファイルを添付しますので、展開して実行し、下記の手順で操作して動作をご確認ください。
実行後に表示される上側のフィールドにコマンドプロンプトのコマンドcmdが入力されているので、その右側にある「起動」ボタンを押します。
中央のテキストエリアにコマンドプロンプトからの出力が表示されたら、下側のフィールドにVBScriptを実行するコマンドを入力して、その右側の「送信」ボタンを押します。
コマンドは例えば、「cscript //nologo (パス\ファイル名).vbs」という感じに入力します。実行結果が中央のテキストエリアに表示されたら、「出力取込」ボタンを押します。
ダイアログが2回表示されて、1つ目は変数に格納された文字列全体、2つ目はその中から切り出した対象の文字列が表示されます。2つ目の文字列切り出し方法は、実行結果の出力に応じてビルダーで変更する必要があります。
コンポーネントの使い方も、ビルダー上での接続方法をご覧ください。添付ファイル:
2018年12月13日 at 4:40 PM #5394kanamaru一般参加者ご回答ありがとうございます。
とても分かりやすい例を作っていただき助かりました。2018年12月14日 at 3:32 PM #5395kanamaru一般参加者すみません、追加で質問させてください。
頂いたサンプルを元に作成してみたのですが、標準出力の取得箇所(外部プログラム通信のイベント)が、一通り処理が終わった後に発生するため、処理途中で値が取得できません。
何か対応策ありますでしょうか。サンプル作りましたので添付します。
VBS戻り値取得お試し.mzaxとreturnTest.vbsは同じフォルダで実行ください。
実行した際に表示するフレームに、”AAAA”と表示されれば成功の想定です。
(“未設定”だと失敗)添付ファイル:
2018年12月14日 at 5:39 PM #5397MZPlatformユーザー会サイト管理者追加質問の意図と添付ファイルとの関係がわからないので、もう少し説明をお願いします。
まずは添付していただいたサンプルをこちらで実行すると、「未設定」になります。
こちらで修正したものを添付しますが、このように記述すると少し時間が経ってから実行結果が表示されます。このように、外部プログラム通信の「startProgram」の呼び出し後、処理自体は先に進んでフレームが表示されます。それと並行してスクリプトが実行され、完了した時点でデータ生成イベントが発生して出力結果が得られます。元は変数に入れているだけだったのでラベルの表示は変わりませんでしたが、修正後は直接ラベルを書き換えているので、表示が変わります。
上記で成功の状態になったとして、「処理が終わった後」と「処理の途中」が何を指しているかがわかりませんので、説明をお願いします。
添付ファイル:
2018年12月17日 at 1:41 PM #5399kanamaru一般参加者説明に曖昧なかしょがあり申し訳ありません。
補足いたします。> 上記で成功の状態になったとして、「処理が終わった後」と「処理の途中」が何を指しているかがわかりませんので、説明をお願いします。
・処理が終わった後 -> ‘アプリケーション’コンポーネントの’アプリケーション開始’イベント が終わった後、という意味でした。
・ 処理の途中 -> ‘アプリケーション開始’イベント の途中といういみですが、具体的にはVBScript実行直後という意味でした。サンプルが中途半端でしたので、修正したものを添付します。
考慮いただきたいのは以下の点です。
・本サンプルはバッチ処理として起動するものです
・VBScriptをループで複数回実行し、それぞれ引数に対応する結果を取得したいと考えています。
→サンプルではそれぞれファイル出力する形にしました(実際はDBへinsertします)
・VBScriptの結果が取得できて欲しいタイミングをコメントで記載しました
→VBScript実行直後に実行待機、結果取得(外部プログラム通信のデータ生成イベント割り込み?)が出来ると助かります。【失敗した場合の出力結果(result.log)】
0,取得失敗
1,取得失敗
2,取得失敗【成功した場合の出力結果(result.log)】
0,AAAA
1,BBBB
2,CCCC不明点ありましたらご質問ください。
添付ファイル:
2018年12月17日 at 4:05 PM #5401MZPlatformユーザー会サイト管理者「外部プログラム通信」コンポーネントの動作は起動対象によって変わってしまうのですが、今回のVBScript実行に関しては実行結果を取得してから次の処理に移ることができません。どうしても実行の指示後、非同期で遅れてデータ生成イベントが発生します。
そのため、繰り返し計算をFORループで単純に実行することができません。上記の動作の仕組みを理解した上で同様の処理を実現する必要があります。一例として、そのサンプルを添付します。回数のカウンタとして整数格納変数と、繰り返しおよびその終了条件として等価演算を使用しました。
ご確認ください。
添付ファイル:
-
著者投稿
- このトピックに返信するには、ログインしてください。