重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

初心者です。
LuaとWSHを使ってスクリプトを作成しています。

Luaの記述でos.executeを使いWSH(.vbs)を実行するのですが、
WSHで得た変数をLua側に渡すことはできますでしょうか?

具体的には(一部抜粋)、

---Lua側---
os.execute(インプット.vbs)
inputxxx = input

---WSH側(インプット.vbs)---
Input = InputBox("数値を入力してください")

という記述で、
Luaを実行し、WSH側のインプットボックスで入力した値(input)を
Lua側の変数inpuxxxに入れたいです。

どなたかお助け頂けると有難いです。

A 回答 (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で文字列を選択する、という方法が考えられます。
数が少なければ個別に作った方が楽かもしれません。

参考URL:http://ja.wikipedia.org/wiki/Shift_JIS
    • good
    • 0

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-o …
http://msdn.microsoft.com/ja-jp/library/cc364475 …

参考URL:http://stackoverflow.com/questions/9676113/lua-o …
    • good
    • 0
この回答へのお礼

ありがとうございます!
こちらの環境でも確認できました!

もうひとつ質問なのですが、InputBoxを二つ以上使用したい場合には、やはりvbsを複数持たせる必要があるのでしょうか?

お礼日時:2013/08/20 17:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!