- ベストアンサー
LuaとWSHを使ったスクリプト作成における変数の受け渡しについて
- LuaとWSHを使ったスクリプト作成において、Lua側からWSHで得た変数を受け取る方法について質問があります。
- 具体的には、Lua側でos.executeを使いWSHを実行し、WSHのインプットボックスで入力した値をLua側の変数に格納したいと考えています。
- どなたかご教授いただけると幸いです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
InputBoxを二つ以上というのは、表示するメッセージや入力後の処理が異なるInputBoxということでしょうか。 数が少なければ個別に作ってもいいのですが、増えると管理が大変です。 1つの方法としては、Luaの関数でVBScriptのInputBoxを呼び出すものを作ってしまうというのがあります。 ---Lua側--- function inputbox(prompt) local handle = io.popen("cscript //nologo インプット3.vbs " .. prompt) local rv = handle:read("*a") handle:close() return rv end inputxxx = inputbox("数値を入力してください") ---WSH側(インプット2.vbs)--- set Args = WScript.Arguments set SO = Wscript.Stdout if Args.Count > 0 then p0 = Args(0) else p0 = "" end if Input = InputBox(p0) SO.WriteLine Input およそこんな感じです。 なお、ここではコマンドライン引数を使っていますが、他にパイプを使う方法もあります。 と、ここまで書いて1つ思い出しました。 当方で使っているなでしこ内蔵Luaは日本語に対応していないのでいわゆるSJISの5c問題があります。 質問者様の環境は大丈夫でしょうか。 具体例ですが、Luaで inputxxx = inputbox("代表値を入力してください") とすると、メッセージボックスのプロンプトは 代葡lを入力してください と文字化けしてしまいます。 Luaの文字列処理の問題なので、呼び出す.vbsファイルのファイル名にも同様の現象が発生します。 なおこの場合は、 inputxxx = inputbox("代表\値を入力してください") で回避できますが、こういう状況ではなるべく日本語は避けたいので、そうなると上に書いたことも採用していいかどうか・・・ 対策としては、やや複雑になりますが、日本語の文字列はWSHに持たせておいて、Luaからの指示は数値や英数字の文字列で与えてそれを元にWSHで文字列を選択する、という方法が考えられます。 数が少なければ個別に作った方が楽かもしれません。
その他の回答 (1)
- queuerev2
- ベストアンサー率78% (96/122)
LuaからVBScript(インプット.vbs)を起動することはできたのですね。 値をLuaで受ける方法ですが、Windowsのエラー値(?)を使う方法と、パイプで文字列を受ける方法があるようです。 簡単なのはWindowsのエラー値(?)を使う方法です。たとえば以下のようにします。 ---Lua側--- inputxxx = os.execute("インプット1.vbs" ) ---WSH側(インプット1.vbs)--- Input = InputBox("数値を入力してください") WScript.Quit Input ただ、この方法では整数(Long)しか受け取れないですし、なによりエラーが発生した場合の(Windowsが出す本物の)エラー値と通常の戻り値との区別がつきません。 それゆえ、パイプを使って文字列を受ける方がいいと思います。たとえば以下のようにします。 ---Lua側--- handle = io.popen("cscript //nologo インプット2.vbs") inputxxx = handle:read("*a") handle:close() ---WSH側(インプット2.vbs)--- set SO = WScript.StdOut Input = InputBox("数値を入力してください") SO.WriteLine Input やや細かい話ですが、WScript.StdOutは本来cscript.exe専用のはずです。 しかし今回Luaから呼び出した際には、"cscript //nologo インプット2.vbs"を"wscript //nologo インプット2.vbs"にしても動きました。ところが単に"インプット2.vbs"とするとSO.WriteLineのところでエラーになりました。このあたりどうなっているのかはちょっとわかりません。 また、//nologoオプションはなくても動きますが、万が一にも標準エラー出力のバッファがいっぱいになって停止したりしないように入れておくのがよいと思います。 動作確認ですが、こちらではWindows XP SP3にてなでしこ1.5332内蔵のLuaを用いました。他のLuaでもWindows用のものなら大丈夫なはずです。 http://stackoverflow.com/questions/9676113/lua-os-execute-return-value http://msdn.microsoft.com/ja-jp/library/cc364475.aspx
お礼
ありがとうございます! こちらの環境でも確認できました! もうひとつ質問なのですが、InputBoxを二つ以上使用したい場合には、やはりvbsを複数持たせる必要があるのでしょうか?